簡體   English   中英

從手機攝像頭流式傳輸JPEG

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM