[英]Streaming JPEGs from a Cellphone Camera
我正在嘗試使用udp套接字將JPEG幀從相機流式傳輸到我的電腦,但我遇到了一些問題。
所以我設置了一個攝像頭並為預覽幀事件添加了一個回調:
@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圖像?
謝謝!
我做了類似的事情,最后將其轉移到本機代碼中並進行了JNI調用以從NV21轉換並粘貼到循環緩沖區。
讓第二個線程讀取緩沖區並執行網絡IO,以便您可以盡快從onPreviewFrame返回。
更好的是,將nv21數據復制到循環緩沖區,讓第二個線程在網絡上發送數據之前進行jpg轉換。
順便說一下,我為視頻聊天客戶端做了這個。 它運作良好,但我已經開始發送H.263幀。 如果您還在進行視頻聊天客戶端,它比發送JPG更有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.