*因爲工做須要,須要利用MediaCodec實現Playback及Transcode等功能,故在學習過程當中翻譯了Google官方的MediaCodec API文檔,因爲做者水平限制,文中不免有錯誤和不恰當之處,望批評指正。微信
*轉載請註明出處:http://www.cnblogs.com/roger-yu/異步
在MediaCodec的生命週期內存在三種狀態:Stopped, Executing or Released,其中學習
Stopped狀態包含三種子狀態:Uninitialized, Configured and Error編碼
Executing狀態包含三種子狀態:Flushed, Running and End-of-Streamspa
因爲MediaCodec在不一樣的數據處理模式下狀態間的轉換會有些許差異,故接下來咱們分別對同步處理模式及異步處理模式下的狀態轉換作詳細分析翻譯
首先咱們先看一下狀態轉換的流程圖,以下:3d
1. 當經過 MediaCodec.createByCodecName(...) or MediaCodec.
codecreateDecoderByType(...) or MediaCodec.
createEncoderByType(...)三種方法中的任一種建立一個MediaCodec對象實例後,Codec將會處於 Uninitialized 狀態;
2. 當你調用 MediaCodec.configure(...)方法對Codec進行配置後,Codec將進入 Configured 狀態;
對象
3. 以後能夠調用 MediaCodec.start() 方法啓動Codec,Codec會轉入 Executing 狀態,start後Codec當即進入 Flushed 子狀態,此時的Codec擁有全部的input and output buffers,Client沒法操做這些buffers;
blog
4. 一旦第一個input buffer 出隊列,也即Client經過調用 MediaCodec.dequeueInputBuffer(...)請求獲得了一個有效的input buffer index, Codec當即進入到了 Running 子狀態,在這個狀態下Codec會進行實際的數據處理(解碼、編碼)工做,度過它生命週期的主要階段;
5. 當輸入端入隊列一個帶有 end-of-stream 標記的input buffer時(queueInputBuffer(EOS)),Codec將轉入 End of Stream 子狀態。在此狀態下,Codec再也不接受新的input buffer數據,但仍會處理以前入隊列而未處理完的input buffer併產生output buffer,直到end-of-stream 標記到達輸出端,數據處理的過程也隨即終止;
6. 在 Executing狀態下能夠調用 MediaCodec.flush()方法使Codec進入 Flushed 子狀態;
7. 在 Executing狀態下能夠調用 MediaCodec.stop()方法使Codec進入
子狀態,能夠對Codec進行從新配置;Uninitialized
8. 極少數狀況下Codec會遇到錯誤進入 Error 狀態,能夠調用 MediaCodec.reset() 方法使其再次可用;
9. 當MediaCodec數據處理任務完成時或再也不須要MediaCodec時,可以使用 MediaCodec.release()方法釋放其資源。
首先咱們先看一下狀態轉換的流程圖,以下:
異步模式下狀態轉換與同步模式下大同小異,主要有兩點區別:
1. 調用 MediaCodec.start() 方法啓動Codec,Codec會直接轉入 Running 子狀態;
2. 當調用 MediaCodec.flash() 方法進入 Flushed 子狀態後,必須調用 MediaCodec.start() 方法Codec纔會進入 Running 子狀態。
其餘狀況下均與同步模式下相同,就不在此贅述。
微信掃一掃,關注玖零日記,獲取更多相關資訊及源碼 -- 雖無面朝大海,依舊春暖花開