錄制的FLV文件只顯示首幀然后就閃退

最近項目中遇到將流保存在FLV文件,錄制成的文件發(fā)現(xiàn)如下現(xiàn)象:

  • VLC播放時尿招,只能顯示首幀矾柜,然后馬上閃退。
  • QQ影音播放時就谜,可播放但是跳的很快怪蔑,感覺是只能播放I幀。

分析過程

剛開始的懷疑是AVCDecoderConfigurationRecord的各參數(shù)的問題丧荐,后來發(fā)現(xiàn)都正常缆瓣,也就是說SPS+PPS參數(shù)都正常。
VLC播放時虹统,發(fā)現(xiàn)解析出來的編解碼參數(shù)也正常弓坞。

**flv文件編解碼參數(shù)**

那可能是為什么呢?
后來發(fā)現(xiàn)是Tag Header中的時間戳問題導致的隧甚。

FLV tag
**FLV tag**

Tag 分為兩部分: Tag HeaderTag Body
其中Tag Header11個字節(jié)昼丑,包括TagType呻逆、DataSize、Timestamp菩帝、TimestampExtended、StreamID茬腿;Tag Body部分即實際的Data部分呼奢。

  • TagType(1字節(jié))
    Tag的類型,主要分為:

    • 0x08: 音頻切平。
    • 0x09: 視頻握础。
    • 0x12: 即十進制的18, 腳本Tag, 一般指onMetaData
  • DataSize(3字節(jié))
    數(shù)據(jù)(Data)的長度悴品。

  • Timestamp(3字節(jié))
    時間戳禀综,單位毫秒。
    該時間戳是相對于首個Tag時間戳的相對時間戳苔严。
    首個Tag的時間戳為0定枷。

  • TimestampExtended(1字節(jié))
    擴展時間戳。和Timestamp合在一起拼成一個32bit的時間戳届氢。
    該時間戳占高8位欠窒。

    **TimestampExtended**+**Timestamp**=**32bit時間戳**

  • StreamID(3字節(jié))
    為0。

文檔中還有段話非常重要:

In playback, the time sequencing of FLV tags depends on the FLV timestamps only. Any timing mechanisms built into the payload data format shall be ignored.

FLV文件回放時退子,FLV tags的時間順序僅依賴于FLV的時間戳岖妄。
忽略任何payload data中的時間機制。

可見時間戳對FLV文件的播放有多重要寂祥。

導致VLC只能播放首幀的原因:FLV文件中所有的時間戳未進行有效的初始化, Timestamp和TimestampExtended全是0, 只有首幀的時間戳是正確的(就是0, _)荐虐。
示例:

時間戳為0的情況

問題解決

在程序中對時間戳進行正常賦值后,用VLC可正常播放錄制的FLV視頻丸凭。

部分代碼:

struct SPxFLVRecorderTagHeader
{
    unsigned char uchTagType;
    unsigned char uchDataSize[3];
    unsigned char uchTimestamp[3];
    unsigned char uchTimestampExtended;
    unsigned char uchStreamID[3];
};

...

SPxFLVRecorderTagHeader     m_sFlvFileTagHeader;

...

HRESULT CPxFLVMuxer::WriteVideoSample(unsigned char  *in_pBuffer, int in_nBufferLen,  int in_nTimeStamp)
{
    HRESULT hr = NS_NOERROR;
    ...
    m_sFlvFileTagHeader.uchTagType = 0x09; // 視頻Tag
    ...

    m_sFlvFileTagHeader.uchTimestamp[0] = (BYTE)((in_nTimeStamp >> 16) & 0xff);
    m_sFlvFileTagHeader.uchTimestamp[1] = (BYTE)((in_nTimeStamp >>  8) & 0xff);
    m_sFlvFileTagHeader.uchTimestamp[2] = (BYTE)((in_nTimeStamp >>  0) & 0xff);
    m_sFlvFileTagHeader.uchTimestampExtended = (BYTE)((in_nTimeStamp >> 24) & 0xff);
    ...
    return hr;
}

...

References:

Video File Format Specification Version 10

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末福扬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贮乳,更是在濱河造成了極大的恐慌忧换,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件向拆,死亡現(xiàn)場離奇詭異亚茬,居然都是意外死亡,警方通過查閱死者的電腦和手機浓恳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門刹缝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碗暗,“玉大人,你說我怎么就攤上這事梢夯⊙粤疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵颂砸,是天一觀的道長噪奄。 經(jīng)常有香客問我,道長人乓,這世上最難降的妖魔是什么勤篮? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮色罚,結(jié)果婚禮上碰缔,老公的妹妹穿的比我還像新娘。我一直安慰自己戳护,他們只是感情好金抡,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腌且,像睡著了一般梗肝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上切蟋,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天统捶,我揣著相機與錄音,去河邊找鬼柄粹。 笑死喘鸟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的驻右。 我是一名探鬼主播什黑,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼堪夭!你這毒婦竟也來了愕把?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤森爽,失蹤者是張志新(化名)和其女友劉穎恨豁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爬迟,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡橘蜜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片计福。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡跌捆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出象颖,到底是詐尸還是另有隱情佩厚,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布说订,位于F島的核電站抄瓦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏陶冷。R本人自食惡果不足惜闺鲸,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望埃叭。 院中可真熱鬧,春花似錦悉罕、人聲如沸赤屋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽类早。三九已至,卻和暖如春嗜逻,著一層夾襖步出監(jiān)牢的瞬間涩僻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工栈顷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逆日,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓萄凤,卻偏偏與公主長得像室抽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子靡努,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容