2016-09-13 6 views
0

同じMediaCodecオブジェクトにアクセスするスレッドは2つあり、同時に実行する必要があります。今私は問題があります:2つのスレッドが同時に実行されている場合、コードは次のとおりです。MediaCodecマルチスレッドリファレンス

try { 
    mediaCodec.releaseOutputBuffer(encoderStatus, false); 
} catch (IllegalStateException e) { 
    e.printStackTrace(); 
} 

このコードを処理する方法は?

2つのスレッドが同じmediaCodecオブジェクトを参照しているため、このコードを実行するスレッドはmediaCodecへの他のスレッドの参照に影響し、他のスレッドは正常に実行できません。どのようにそれを解決するには?

+0

'mediaCodec'オブジェクトで同期するだけですか?私たちはあなたがさらに知るために何をしようとしているのか分かりません。 – SOFe

+0

私はアンドロイド携帯電話の画面をrecordeし、同時に、携帯電話にMP4ファイルを保存しながらPCにプッシュしようとしています。私はmediaCodecオブジェクトを使用してストリームを取得し、ファイルとして保存するために1つのスレッドを使用します別のスレッドはPCにプッシュします。しかし、mediaCodec.releaseOutputBuffer(encoderStatus、false)を実行すると、それらは相互に影響します。どのように修正するのかわかりません。 – Max

答えて

0

複数のスレッドから賢明なアクセスMediaCodecがわからない場合は、同期に注意する必要があります。多くの同期によってエンコード/デコード処理が停止する可能性があります。

MP4ファイルを保存している間にPCにプッシュしたい場合は、あるスレッドでMediaCodecものを実行し、出力結果をスレッドセーフキューに入れて他のスレッドで処理します(ハンドラ、エグゼキュータなどを使用して行うことができます)

0

同期モードでは、MediaCodecがマルチスレッドセーフでなければならないわけではありませんが(たとえば、dequeueInputBuffer()のスレッドをパイプラインの一端に埋め込むことができます、およびdequeueOutputBuffer()の2番目のスレッド、Pipelineのもう一方の端を排水している)、2スレッドと1 MediaCodecインスタンスで作業するとクラッシュするHWデコーダがわかりません(アプリケーションが多数のデバイスでテストされています)。私はあなたが良いと思う。

関連する問題