視頻源,不論是從采集設備采集到的,還是本身壓制好的文件,其流中的數據都是按照編碼順序存儲的。比如1 2 3 4 5,5幀視頻數據,1編碼成I幀,2 3 4編碼成B幀,5編碼成P幀。
編碼過程:
1. 編碼1為I幀;
2. 2,3,4准備編碼為B幀,先緩存下來,記錄其時間點作為PTS;
3. 再編碼5,編碼為P幀,5的DTS相對2,3,4靠前,PTS相對於2,3,4靠后;
4. 編碼2,3,4,編碼為B幀;
存儲過程:
存儲順序與編碼順序一致,編碼后的順序為(DTS順序):1 5 2 3 4
Android和iOS的硬解碼器都不會修改輸入PTS,但解碼細節略有差別;
1. iOS VideoToolBox
VTB本身不會對解碼后的圖像進行重排序,所以需要開發者緩存幾幀數據(一般是4幀),重排序之后再送入渲染模塊。
2. Android MediaCodec
以同樣的數據流輸入到MediaCodec,MediaCodec輸出的流是經過重排序的,也就是說,可以直接送入渲染模塊渲染。