1. 程式人生 > >Camera中onPreviewFrame()方法的視訊方向旋轉

Camera中onPreviewFrame()方法的視訊方向旋轉

1、旋轉90度

privatebyte[] rotateYUV420Degree90(byte[] data,int imageWidth,int imageHeight){byte[] yuv =newbyte[imageWidth*imageHeight*3/2];// Rotate the Y lumaint i =0;for(int x =0;x < imageWidth;x++){for(int y = imageHeight-1;y >=0;y--){
            yuv[i]= data[y*imageWidth+x];
            i++;}}// Rotate the U and V color components 
i = imageWidth*imageHeight*3/2-1;for(int x = imageWidth-1;x >0;x=x-2){for(int y =0;y < imageHeight/2;y++){ yuv[i]= data[(imageWidth*imageHeight)+(y*imageWidth)+x]; i--; yuv[i]= data[(imageWidth*imageHeight)+(y*imageWidth)+(x-1)]; i--;}}return yuv
;}
2.旋轉180度
privatestaticbyte[] rotateYUV420Degree180(byte[] data,int imageWidth,int imageHeight){byte[] yuv =newbyte[imageWidth * imageHeight *3/2];int i =0;int count =0;for(i = imageWidth * imageHeight -1; i >=0; i--){
        yuv[count]= data[i];
        count++;}
    i = imageWidth * imageHeight 
*3/2-1;for(i = imageWidth * imageHeight *3/2-1; i >= imageWidth * imageHeight; i -=2){ yuv[count++]= data[i -1]; yuv[count++]= data[i];}return yuv;}

3.旋轉270度

publicstaticbyte[] rotateYUV420Degree270(byte[] data,int imageWidth,int imageHeight){byte[] yuv =newbyte[imageWidth * imageHeight *3/2];int nWidth =0, nHeight =0;int wh =0;int uvHeight =0;if(imageWidth != nWidth || imageHeight != nHeight){
        nWidth = imageWidth;
        nHeight = imageHeight;
        wh = imageWidth * imageHeight;
        uvHeight = imageHeight >>1;// uvHeight = height / 2}// ??Yint k =0;for(int i =0; i < imageWidth; i++){int nPos =0;for(int j =0; j < imageHeight; j++){
            yuv[k]= data[nPos + i];
            k++;
            nPos += imageWidth;}}for(int i =0; i < imageWidth; i +=2){int nPos = wh;for(int j =0; j < uvHeight; j++){
            yuv[k]= data[nPos + i];
            yuv[k +1]= data[nPos + i +1];
            k +=2;
            nPos += imageWidth;}}return rotateYUV420Degree180(yuv, imageWidth, imageHeight);}
注意:以上方法需要在callback的onPreviewFrame()中呼叫

而且需要把原先

EncoderDebugger debugger = EncoderDebugger.debug(mSettings, mQuality.resX, mQuality.resY);
中引數
mQuality.resX, mQuality.resY調換順序以防花屏

EncoderDebugger debugger = EncoderDebugger.debug(mSettings, mQuality.resY, mQuality.resX);
mPPS =debugger.getB64PPS();
mSPS = debugger.getB64SPS();
mProfilLevel = MP4Parser.toHexString(Base64.decode(mPPS, Base64.NO_WRAP),1,3);

這種方法效果比較合適,直接是轉換資料。也查到了轉換成jpeg格式,轉換圖片方向,再轉成流傳出去,這個方法時進行了壓縮,資料減少導致編解碼時buffer陣列獲取資料出問題。

結合

OrientationEventListener中的下例方法,進行螢幕方向檢測,獲取方向,以便方向旋轉的判斷選擇。
@Override
public void onOrientationChanged(int orientation) {
    this.Orientation=orientation;
Log.d("OrientationDetector","當前的感測器方向為"+orientation);
    if (orientation == ORIENTATION_UNKNOWN) return;
Camera.CameraInfo info =
            new Camera.CameraInfo();
Camera.getCameraInfo(0, info);
orientation = (orientation + 45) / 90 * 90;
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        rotation = (info.orientation - orientation + 360) % 360;
} else {  // back-facing camera
rotation = (info.orientation + orientation) % 360;
}
    System.out.println("獲取相機度數:  "+ rotation);
    if (camera!=null){
        Camera.Parameters parameters = camera.getParameters();
parameters.setRotation(rotation);
camera.setParameters(parameters);
}
}
public int getOrientation(){//對外提供方向0,90,180,270 四個引數
    return rotation;
}


相關推薦

CameraonPreviewFrame方法視訊方向旋轉

1、旋轉90度 privatebyte[] rotateYUV420Degree90(byte[] data,int imageWidth,int imageHeight){byte[] yuv =newbyte[imageWidth*imageHeight*3/2];/

ArrayListremove方法刪除長度大於5的元素之後下標重定位的問題

com 有一個 fad 就刪除 成了 位置 p s cnblogs 中心 1、問題闡述 需求: 有一個ArrayList數組,要求刪除長度大於5的字符串,如:arr = {"ab1","123ad","bca","dadfadf","dddaaa","你好啊","我來

JavaScriptArray物件join方法的例子

//join()方法用於把陣列中的所有元素放入一個字串 //其中元素是通過指定的分隔符進行分割 var arr = new Array(3); arr[0] = "George"; arr[1] = "John"; arr[2] = "Thom

Java 集合List及MapforEach方法

我們先看一個forEach()方法遍歷List集合的例子: //使用com.google.guava包建立集合 List<String> list =Lists.newArrayList("a","b","c","d");

Map集合value方法與keySet、entrySet()區別

Map<String,String> map = new HashMap<String,String>();map.put(“01”, “zhangsan”);map.put(“02”, “lisi”);map.put(“03”, “wangwu”);Collection<St

javasleep方法的解析

Thread.sleep(3000); 就是指讓當前正在執行的佔用cpu時間片的執行緒掛起3000ms,把cpu的時間片交給其他執行緒,但是並沒有指定把CPU的時間片接下來到底交給哪個執行緒,而是讓這些執行緒自己去競爭(一般作業系統會根據優先順序排程) 所以說讓當執行緒睡眠,是幫助所有執行緒獲得執行時間的最佳

hibernatedelete方法報錯處理方法

    @Override     public void del(Picture picture) {         session.beginTransaction();         System.out.println(picture.getId());   

Java學習筆記23:JavacharAt方法的使用

此方法返回位於字串的指定索引處的字元。該字串的索引從零開始。 charAt(int index)方法是一個能夠用來檢索特定索引下的字元的String例項的方法. charAt()方法返回指定索引位置的char值。 索引範圍為0~length()-1. 如: str.charA

在定義類時,何時需要重寫Object類equals方法

在比較兩個物件時可以使用==和 equals()。==用於比較兩個物件的引用地址是否相等,而equals()方法主要用於比較兩個物件的內容是否相等。和equals()的差別請參見“和equals()有什麼區別?”的解答。 在 Object 中已定義了 equals()方法,但是該方法直接採用

java的API,學習object的類equals方法的問題,

一、什麼是API 即:Application Programing interface應用程式介面。就是javajdk中提供給我們使用的類,已經封裝好的,直接拿來用就行了。 二、Object類 object類是所有類的父類,在lang包中,lang包不用匯入。 介面中沒有構造方法

執行緒sleep方法和Object類的wait方法的區別

這兩者的施加者是有本質區別的. sleep()是讓某個執行緒暫停執行一段時間,其控制範圍是由當前執行緒決定,也就是說,線上程裡面決定.好比如說,我要做的事情是 "點火->燒水->煮麵",而當我點完火之後我不立即燒水,我要休息一段時間再燒.對於執行的主動權是由我

初學者對jssort方法的理解。

定義和用法 sort() 方法用於對陣列的元素進行排序。 語法 arrayObject.sort(sortby) 引數 描述 sortby 可選。規定排序順序。必須是函式。 返回值 對陣列的引用。請注意,陣列在原陣列上進行排序,不生成副本。 說明 如果

jssort方法的用法,引數以及排序原理

sort() 方法用於對陣列的元素進行排序。 語法:arrayObject.sort(sortby);引數sortby可選。規定排序順序。必須是函式。 注:如果呼叫該方法時沒有使用引數,將按字母順序對陣列中的元素進行排序,說得更精確點,是按照字元編碼的順序進行排序。要實現這一點,首先應把陣列的元素都轉換成字

關於ActivityonCreate方法執行兩次的問題

這兩天練習碰見個問題,當我要把視窗設定為橫屏時,我使用的方法是在程式碼裡呼叫:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 執行,沒問題。 於是接著各種編碼。。。 但是再次執行時發

javacharAt方法的使用

charAt(int index)方法是一個能夠用來檢索特定索引下的字元的String例項的方法. charAt()方法返回指定索引位置的char值。索引範圍為0~length()-1. 如: str.charAt(0)檢索str中的第一個字元,str.charAt(s

jqueryjoin方法總結

join方法用於陣列中元素的連線下面首先以一個簡單的例子舉例說明:var arr = [1,2,3,4,5];document.write(arr.join(-));  //輸出結果:1-2-3-4-5

在scrapy爬蟲框架xpathextract方法的使用

本案例列舉的是爬取騰訊社招中涉及到 extract()使用的總結(1)第一種:position = job.xpath('./td[1]/a/text()')[<Selector xpath='./td[1]/a/text()' data='22989-騰訊雲虛擬化高階

jstofixed方法

toFixed() 方法可把 Number 四捨五入為指定小數位數的數字。var num = new Number(13.37); document.write (num.toFixed(1))//13.4

詳解每個類toString方法

在我們定義一個類的時候都會建立一個String 型別的toString()方法那麼這個方法真正的作用及原理,為什麼在輸出類變數的時候會輸出toString()的返回值 1我們定義的類預設的父類是Object型別,請看下面的原始碼  public void println(O

JAVAObject類的toString方法

toString public String toString() 返回該物件的字串表示。通常,toString 方法會返回一個“以文字方式表示”此物件的字串。結果應是一個簡明但易於讀懂的資訊表示式。建議所有子類都重寫此方法。 Object 類的 toS