2013-10-14 13 views
6

私は、Android 4.3の新しいMediaCodecおよびMediaMuxer APIでpreviewTextureレコーディングに関するAndroid Test Casesの実装を進めています。MuxingカメラのプレビューMediaMuxerでh264でエンコードされたエレメンタリーストリーム

recordingHintをカメラのパレメーターに設定することで、約30fpsのフレームレートでプレビューストリームを記録することができました。

しかし、私は遅延/遅れの問題に遭遇し、それを修正する方法は本当に分かりません。非常に標準的な画質設定(1280x720、〜8.000.000のビットレート)でカメラプレビューを記録するとき、プレビューとエンコードされた素材は時々遅れることがあります。より具体的には、この遅延は約2〜3秒ごとに発生し、約300〜600msかかる。エンコーダが利用可能なデータを持っている場合は、この行は、ループ内で呼び出された

mMuxer.writeSampleData(mTrackIndex, encodedData, mBufferInfo); 

:私は遅延は「drainEncoder」メソッドで次のコード行から来て把握することができた遅延をトレースすることにより

多重化のために。現在、私はオーディオを記録していないので、MediaMuxによってh264ストリームだけがmp4形式に変換されます。

これは遅延と関係があるかどうかはわかりませんが、ループがエンコーダのすべての利用可能なデータをデキューするために2回の繰り返しが必要な場合は常に発生します。これらの2つの繰り返し)。ほとんどの場合、エンコーダをデキューするには1回の反復で十分です。

これらの新しいAPIについてのオンライン情報はあまりないので、どんな助力も非常に高く評価されています。

答えて

3

MediaMuxerディスク書き込みで噛まれていると思われます。記録中にsystraceを実行し、一時停止中に実際に起こっていることを確認するのが最善の方法です。 (SYSTRACE docsexplanationbigflake example - 今のようにのみ、後者はアンドロイド4.3に更新されます)

そのような場合は、別のスレッドでMediaMuxerインスタンスを実行することによって、問題を軽減することができるかもしれ、給餌同期されたキューを介してH.264データをH.264データに変換します。

これらのポーズは、5秒ごとに定期的に実行されますか。 CameraToMpegTestの例では、フレームレートが30fpsになるように5秒ごとにIフレームを出力するようにエンコーダを設定しています。その結果、小さなデルタではなくフルサイズのフレームが出力されます。

+0

ご回答いただきありがとうございます。 - 遅れは実際には5秒ごとにかなり規則的に発生します。しかし、Iフレームの間隔を変更すると、周波数は変化しません。最適なのは、カスタムIフレーム間隔がエンコーダ(Nexus 4)で無視されることです - 私はすでに昨日別のスレッドで多重化を分離しようとし始めましたが、これはうまくいくようです...そうして、確認してくれてありがとう! - 私は十分な時間があればすぐに遅れをとらえます – mAx

0

@faddenは、書き込み速度が遅いデバイスやSDカードに書き込もうとすると主に発生するディスク書き込みの問題を指摘しています。

私は同様の質問hereでMediaMuxerの書き込みをバッファする方法の解決策を書いています。

関連する問題