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幀.
