2017-08-01 62 views
0

我正試圖編寫一個簡單的視頻編碼器,在「表面輸入」模式下使用Android平臺的MediaCodec類。無法在「表面輸入」模式下使用Android平臺的MediaCodec類

這些是我的追蹤對象的步驟(支承碼遺漏爲簡潔起見):

mediaCodec = MediaCodec::CreateByType(looper, "video/avc", true); 
mediaCodec->configure(config, NULL, NULL, CONFIGURE_FLAG_ENCODE); 
mediaCodec->createInputSurface(&inputSurface); 
mediaCodec->start(); 

在此之後,我試圖出列從所創建的輸入表面的緩衝液(其是一個IGraphiBufferProducer界面對象),但它不能與NO_INIT錯誤:

inputSurface->dequeueBuffer(&slot, &fence, w, h, format, 0); 

在ADB日誌中的錯誤信息是:

BufferQueueProducer: [GraphicBufferSource] dequeueBuffer: BufferQueue has no connected producer 

任何想法爲什麼緩衝區隊列沒有連接的生產者?我假設MediaCodec類將處理創建緩衝隊列以及生產者和消費者到隊列的連接。

我正在使用Android API級別26(7.1.2)。我正在使用平臺級庫,因爲我的用例需要訪問GraphicBuffer對象。

在此先感謝!

編輯:總體思路是:

  • 輸入表面&出列緩衝區填充。
  • 將已填充的緩衝區排隊回到輸入表面(這可能會觸發表面屬於 to)的媒體編解碼器(視頻編碼器)實例。
  • 從媒體編解碼器實例出列輸出緩衝區(包含原始H.264比特流數據),並將其寫入文件。
  • 將輸出緩衝區釋放回媒體編解碼器實例。

回答

0

IGraphiBufferProducer文檔:

// * NO_INIT - the buffer queue has been abandoned or the producer is not 
//    connected. 

我想這是在你的代碼缺少部分是「連接」。

IGraphiBufferProducer有這樣一種方法,你用它嗎?

相關問題