live555+ffmpeg如何提取關鍵幀(I幀,P幀,B幀)


live555+ffmpeg如何提取關鍵幀(I幀,P幀,B幀)
開發流媒體播放器的時候,特別是在windows  mobile,symbian(S60)平台開發時,很可能遇到需要自己開發播放器的情況。
S60平台提供了CVideoPlayUtility接口可以實現流媒體播放器,但由於非開源,所以相對於自己開發播放器,很多操作受到限制。
live555主要用於網絡流接收,ffmpeg則是對接收到的數據進行編碼/解碼。I幀,P幀,B幀是視頻流中三種分類,其中I幀也就是關鍵幀
是基礎幀,P幀一般根據I幀確定,而B幀需要前面兩着的信息。
舉例說:

the Input sequence for video encoder
1  2   3   4   5    6   7
I    B   B   P  B   B   I

Let's take 1,2,3.. as PTS for simplification

the out sequence for video encoder ( this equals the decoder sequence)
1  4   2    3   7   5   6
I   P    B   B   I    B   B

播放器LIVE555收到的序列順序就應該是:

1  4  2  3  7  5  6 

經過解碼器解碼,順序又回到1 2 3 4 5 6 7這種正常順序。

所以我們可以根據avcodec_decode_video來判斷幀別。
avcodec_decode_video之后的順序是一定的。嚴格按照1 2 3 4。。。這樣的順序來。
判斷I幀,P,B幀方法:
(1):假如解碼成功,則不是I幀就是P幀(根據AVFrame->keyframe判斷是否是I幀)。
假如不是I幀,也不是P幀,則只能是B幀(通過pts判斷)。
(2):采用AVFrame->pict_type綜合pts的辦法:
if(FF_I_TYPE==picture->pict_type)
                        {
                                Printlog("<II>");
                        }
                        else if(FF_P_TYPE==picture->pict_type)
                        {
                                Printlog("<PP>");
                        }
                        else if(FF_B_TYPE==picture->pict_type)
                        {
                                Printlog("<BB>");
                        }
                        else if(FF_S_TYPE==picture->pict_type)
                        {
                                Printlog("<SS>");
                        }
                        else
                        {
                                Printlog("<OtherType>");
                        }
正常情況下是不會打印出B幀的,因為解碼成功的肯定是I幀或者是P幀.

 

轉自:http://blog.csdn.net/linzhiji/article/details/5393647


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM