2017-02-13 12 views
2

私は、Android6.0のMediaCodecでh264をリアルタイムで低レイテンシでストリームにエンコードしようとしています。 私はMediaCodec H264エンコーダのレイテンシを減らす方法

コードを削減する方法を知りたいエンコーダからの待ち時間は約6コマがscreenrecord.cpp

部品コードからありますされては、以下のとおりです。

while (true) { 
    encoder->dequeueOutputBuffer(&bufIndex); 
} 

エンコーダは320x480の60で画面の表面でフィードされますfpsとし、dequeueOutputBuffer()でストリームデータを出力します。 dequeueOutputBuffer()によってデータが返されないエンコーダへのフィードは約6フレームあります。 すなわち、N番目のフレームが供給されると、エンコーダは、N-6番目のフレームのデータを出力する。

質問1 - エンコーダでバッファされたフレームを減らすにはどうすればよいですか? N番目のフレームがエンコーダに供給された直後に、N番目のフレームを出力することは可能ですか?

PS:質問1はthis questionと同じです(まだ良い解決策はありません)。

表面のグラフィックコンテンツが突然静的になると、それ以上のフレームがエンコーダに供給されなくなります。最新の6フレームのデータを「通常の速度」で出力できないのは奇妙です。約10秒でゆっくりと出力されます。

質問2 - 突然データがエンコーダに供給されないと、最新のフレーム出力のレイテンシを減らすにはどうすればよいですか?

答えて

1

バッファリングはビデオエンコーダによって決まります。このように動作しないビデオエンコーダを選択する以外に、あなたができることはあまりありません。

出力を一時停止しない場合は、入力を一時停止しないのが最も簡単な方法です。エンコーダは何も変更されていないことを認識し、出力をほとんど生成しません。 screenrecordはこのようには機能しません。フレームを取得するとフレームを送信するだけなので、フレームを再送信するタイムアウトを追加する必要があります。

関連する問題