2013-03-07 24 views
8

「tryin」はアンドロイドカメラで生成されたプレビューフレームを取得し、data[]をffmpeg入力パイプに渡してflvビデオを生成します。 私が使用したコマンド:AndroidカメラのキャプチャFFmpeg

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

私もyuv4mpegpiperawvideoに入力フォーマットを強制しようとしたが、成功しません...アンドロイド、カメラによって生成されたプレビュー枠の デフォルトの形式はNV21。 道午前invokin' ffmpegのはProcess API経由で、プレビューを書くことは、プロセスへdata[]フレームonPreviewFrame()定義は以下のとおりである stdin ...:

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プロセスに接続されているstdinbuffersize​​で提供されたドキュメントに基づいて計算されます。 何か間違っていますか?

おかげで...

+0

あなたは、プロセスのAPIを使用してffmpegのプロセスを起動したか説明できますか? – datayeah

答えて

8

はちょっとそれは完全に働いてしまった... 画像ストリームのvcodecに関連していたhappeninように見えたのミス。 ffmpegには、NV21形式のイメージまたはイメージストリームをデコードする手段がないようです。 これは、NV21フォーマットのプレビューフレームをJPEGに変換する必要があり、画像がffmpegプロセスにリアルタイムでストリーミングされなければならないため、変換はOn the Flyでなければなりませんでした。次のようにJPEGからOn the Fly変換のための最も近い信頼性の高いソリューションでした:

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 
+0

こんにちは、あなたのコードを共有できますか?私は 'processIn'の使い方を知りたいです。ありがとう – suitianshi

+0

詳細を与える? – user1767754

+0

ffmpegの静的ビルドを使用してこのコードを試してみると、Androidでサポートされていない形式の「mjpeg」が表示されています。その解決策は何ですか? –

関連する問題