9

Androidカメラによって生成されたプレビューフレームを取得し、data[]ffmpeg入力パイプに渡してflvビデオを生成しようとしています。私が使用したコマンドは次のとおりです。

ffmpeg -f image2pipe -i pipe: -f flv -vcodec libx264 out.flv

yuv4mpegpipeまた、入力形式をandに強制しようとしましrawvideoたが、成功しませんでした... android-camera によって生成されるプレビュー フレームのデフォルト形式はNV21. ffmpegを呼び出す方法はProcess API、プレビューフレームdata[]をプロセスに書き込んで実行することstdinです...onPreviewFrame()定義は次のとおりです。

public void onPreviewFrame(byte[] data, Camera camera)
{   
    try
    {
        processIn.write(data);
    }
    catch(Exception e)
    {
        Log.e(TAG, FUNCTION + " : " + e.getMessage());
    }               
    camera.addCallbackBuffer(new byte[bufferSize]);
}

processInffmpegはプロセスstdinに接続されておりbuffersize、 に提供されているドキュメントに基づいて計算されaddCallbackBuffer()ます。何か間違っているのでしょうか...?

ありがとう...

4

1 に答える 1

10

ちょっと完璧に動作しました... 起こっているように見えた間違いvcodecは、画像ストリームに関連していました。ffmpeg には、NV21フォーマット イメージまたはイメージ ストリームをデコードする機能がないようです。そのためには、NV21フォーマットプレビューフレームをに変換する必要JPEGがあり、画像をリアルタイムでffmpegプロセスにストリーミングする必要があったため、変換はOn the Fly. On the Flyへの変換に最も近い信頼できるソリューションはJPEG次のとおりです。

public void onPreviewFrame(byte[] data, Camera camera)
{
        if(isFirstFrame)
    {
        Camera.Parameters cameraParam = camera.getParameters();
        Camera.Size previewSize = cameraParam.getPreviewSize();
        previewFormat = cameraParam.getPreviewFormat();
        frameWidth = previewSize.width;
        frameHeight = previewSize.height;
        frameRect = new Rect(0, 0, frameWidth, frameHeight);
        isFirstFrame = false;
    }

    previewImage = new YuvImage(data, previewFormat, frameWidth, frameHeight, null);

    if(previewImage.compressToJpeg(frameRect, 50, processIn))
        Log.d(TAG, "Data : " + data.length);

    previewImage = null;

    camera.addCallbackBuffer(new byte[bufferSize]);
}

使用したffmpegコマンドは次のとおりです。

ffmpeg -f image2pipe -vcodec mjpeg -i - -f flv -vcodec libx264 out.flv
于 2013-03-08T09:31:57.067 に答える