FFmpeg avcodec_flush_buffers調用說明

    在再次解碼之前,必須使用avcodec_flush_buffers重新編碼, 如何理解?

摘自
http://blog.csdn.net/qq_35044535/article/details/77775910?locationNum=7&fps=1

摘抄以供備份
ffmpeg中解碼的API之前的是avcodec_decode_video2()和avcodec_decode_audio4(),現在使用avcodec_send_packet()/ avcodec_receive_frame()來代替原有的接口。


API與編碼/解碼和音頻/視頻非常相似,工作原理如下:
1、像往常一樣設置和打開AVCodecContext。

2、輸入:
 1)、對於解碼,請調用avcodec_send_packet()以在AVPacket中給出解碼器原始的壓縮數據。
 2)、對於編碼,請調用avcodec_send_frame()爲編碼器提供包含未壓縮音頻或視頻的AVFrame。 在這兩種情況下,建議對AVPackets和AVFrames進行重新計數,否則libavcodec可能必須複製輸入數據。 (libavformat總是返回引用計數的AVPackets,av_frame_get_buffer()分配引用計數的AVFrames)

3、在循環中接收輸出。 定期調用avcodec_receive _ *()函數並處理其輸出:
 1)、對於解碼,請調用avcodec_receive_frame()。 成功後,它將返回一個包含未壓縮音頻或視頻數據的 AVFrame。
 2)、對於編碼,請調用avcodec_receive_packet()。 一旦成功,它將返回帶有壓縮幀的AVPacket。 重複調用,直到它返回AVERROR(EAGAIN)或錯誤。 AVERROR(EAGAIN)返回值意味着需要新的輸入數據才能返回新的輸出。
在解碼或編碼開始時,編解碼器可能會接收多個輸入幀/數據包而不返回幀,直到其內部緩衝區被填充爲止。

結束流情況。 這些需要“刷新”編解碼器,因爲編解碼器可能在內部緩衝多個幀或數據包以實現性能或不必要(考慮B幀)。
pkt==NULL is treated differently from pkt.size==0  (pkt==NULL means get more output, pkt.size==0 is a flush/drain packet) 處理如下:
1、發送NULL到avcodec_send_packet()(解碼)或avcodec_send_frame()(編碼)函數,而不是有效的輸入。 這將進入“flush”模式。

2、在循環中調用avcodec_receive_frame()(解碼)或avcodec_receive_packet()(編碼),直到返回AVERROR_EOF。
3、在再次解碼之前,必須使用avcodec_flush_buffers()重新編碼。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章