2013-07-20 132 views
0

流的JPEG我試圖將JPEG從相機幀使用UDP套接字我的電腦,但我遇到了一些問題。從手機相機

所以我成立了一個攝像頭,並增加了回調的預覽框事件:

@Override 
    public void onPreviewFrame(byte[] data, Camera camera) 
    {   
     final YuvImage image = new YuvImage(data, mPreviewFormat, mPreviewWidth, mPreviewHeight, null); //Create the Yuv image 

     image.compressToJpeg(mPreviewRect, 80, stream); //Compress to JPEG 

     Bitmap b = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size()); //Convert to Bitmap 

     Bitmap resizedBitmap = Bitmap.createScaledBitmap(b, 320, 240, false); //Scale to 320x240 

     resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); //Compress back to JPEG 

     byte[] byteArray = stream.toByteArray(); 
     DatagramPacket sendPacket = new DatagramPacket(byteArray, byteArray.length, IPAddress, 37654); 
     try 
     { 
      socket.send(sendPacket); //Send frame to address 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     stream.reset(); 
    } 

我的問題是,這是採取0.2秒左右,所以我的幀頻爲約5 FPS。有什麼辦法可以加速我的目標FPS是從15到20 FPS的任何地方。從我的計時測試,我相信,這個問題可能與Bitmap b = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());這似乎是服用時間最長的約0.1秒。有沒有辦法直接縮放Yuv圖像?

謝謝!

回答

2

我已經做了類似的事情,最終是移動本地代碼,並提出了JNI調用從NV21轉換,並堅持到循環緩衝器。

有一個第二線讀出緩衝和做網絡IO這樣你就可以從onPreviewFrame儘快返回。

更妙的是NV21數據複製到循環緩衝器,並且具有第二螺紋在網絡上發送數據之前做的JPG格式轉換。

順便說一下,我這樣做是爲了視頻聊天客戶端。它運行良好,但我後來轉向發送H.263幀。如果你還在做視頻聊天客戶端,它比發送JPG更有效率。