2016-09-13 44 views
0

有兩個線程訪問相同的MediaCodec對象,並且它們可能需要同時運行。現在我有一個問題:當兩個線程同時運行時,代碼如下:MediaCodec多線程引用

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

如何處理此代碼?

因爲兩個線程引用同一個mediaCodec對象,所以一個線程執行這個代碼會影響另一個線程對mediaCodec的引用,另一個線程不能正常運行。如何解決它?

+0

只需在'mediaCodec'對象上同步?我們不知道你在做什麼來進一步瞭解。 – SOFe

+0

我想記錄一個android手機的屏幕,並將其推送到PC,同時在手機上保存一個MP4文件。我使用mediaCodec對象來獲取流,使用一個線程保存爲一個文件和另一個線程推送到PC.But當執行mediaCodec.releaseOutputBuffer(encoderStatus,false);它們將互相影響。我不知道如何解決它。 – Max

回答

0

我不確定是否從多線程明智地訪問MediaCodec,您需要小心同步,並且很多同步可能會阻止您的(編碼/解碼)進程。

如果你想在保存MP4文件的時候把它推到PC上,我想你應該做的是在一個線程中做你的MediaCodec的東西,把輸出結果放在一個線程安全的隊列中,並將結果處理到其他線程(可以通過使用Handler,Executor等來完成)

0

雖然它不是MediaCodec在同步模式下必須具有多線程安全性的必須條件(例如,您可以擁有一個用於dequeueInputBuffer()的線程,從而填充流水線的一端,第二個線程爲dequeueOutputBuffer(),耗盡了Pipeline的另一端),我不知道任何硬件解碼器在使用2個線程和1個MediaCodec實例時崩潰(並且我的應用程序已經在很多設備上測試過)。我認爲你很好去。