=====================
最近在進(jìn)行視頻幀類(lèi)型判斷及定位的工作,根據(jù)自己的理解寫(xiě)的代碼對(duì)大部分h264視頻進(jìn)行幀判斷都沒(méi)有問(wèn)題,因?yàn)榇蟛糠忠曨l數(shù)據(jù)有分界符access_unit_delimiter來(lái)標(biāo)志新的picture的開(kāi)始。
但是最近遇到一個(gè)無(wú)法解析幀類(lèi)型的文件,經(jīng)過(guò)分析發(fā)現(xiàn)該文件沒(méi)有access_unit_delimiter單元,而我的代碼是根據(jù)access_unit_delimiter來(lái)確定新圖像的開(kāi)始并解析幀類(lèi)型的,導(dǎo)致分析完整個(gè)文件后,一幀也沒(méi)找到。
如果沒(méi)有access_unit_delimiter,該怎樣來(lái)確定一個(gè)新圖像的開(kāi)始?就是根據(jù)nal_unit_type為1或5來(lái)默認(rèn)新圖像的開(kāi)始?希望有經(jīng)驗(yàn)的朋友幫忙解答一下疑問(wèn),非常感謝。
====================
沒(méi)有 access_unit_delimiter 就找開(kāi)始前綴(0X00 00 00 01 或者 0X00 00 01)。如果是 RTP 格式碼流,在對(duì)碼流的封裝文件中有幀邊界定位信息(例如用 H.264 編碼的 MP4 文件,在文件中本身就包含每幀的長(zhǎng)度信息)。
====================
昨天在論壇里看了以前大部分有關(guān)nalu開(kāi)始前綴和圖像分界的帖子,我現(xiàn)在想找到一種可靠通用的定位一幅圖像開(kāi)始的方法,由于我做的是TS流的解析,PES封裝的應(yīng)該是字節(jié)流NAL單元吧,本來(lái)看了前面的帖子想用“四字節(jié)起始碼+nal_unit_type”作為判斷圖像開(kāi)始的方法,以前的帖子里也有人很肯定的說(shuō)JM某版本編碼后的流如果分片那么只有第一個(gè)slice的開(kāi)始碼是四字節(jié)開(kāi)始碼,后續(xù)slice開(kāi)始碼只有三字節(jié)起始碼,如果這個(gè)是標(biāo)準(zhǔn)中嚴(yán)格規(guī)定的規(guī)則的話,用四字節(jié)來(lái)定位圖像開(kāi)始倒是最好的選擇,但是分析了幾個(gè)碼流發(fā)現(xiàn)這個(gè)根本不是嚴(yán)格遵守的,不管第幾個(gè)slice其開(kāi)始碼都可以是四字節(jié)頭,因此四字節(jié)作為圖像分界判斷看來(lái)行不通。
另外我還有以下疑問(wèn),希望大家?guī)兔饣螅?/span>
1、只有一個(gè)slice且其type為I類(lèi)型的非IDR幀是否可random access?只判斷第一個(gè)slice的type來(lái)作為整個(gè)幀的類(lèi)型可以嗎?
2、沒(méi)有分割的編碼條帶是不是意味著在一個(gè)訪問(wèn)單元內(nèi)只有一個(gè)編碼條帶?從碼流中如何得知一個(gè)圖像分幾個(gè)slice?
====================
1、“……如果這個(gè)是標(biāo)準(zhǔn)中嚴(yán)格規(guī)定的規(guī)則的話……”
——是標(biāo)準(zhǔn)規(guī)定的。標(biāo)準(zhǔn)規(guī)定的是每個(gè) AU 的第一個(gè) NALU 是四字節(jié),因此 SPS/PPS,access_unit_delimiter 等也都是四字節(jié)(所以你想用四字節(jié)來(lái)判斷圖像開(kāi)始的方法從這個(gè)方面說(shuō)也是不可行的)。你所看到的非第一個(gè) NALU 是四字節(jié)那也不會(huì)有問(wèn)題,因?yàn)槠渲械谝粋€(gè) 00 是被看做屬于前一個(gè) NALU 的。所以仍然是三字節(jié)。詳細(xì)內(nèi)容看 200503 版標(biāo)準(zhǔn)/附錄 B;
2、只有一個(gè)slice且其type為I類(lèi)型的非IDR幀是否可random access?
——從理論上講必須是 IDR 才可以。因?yàn)樵?H.264 中一幅圖像可以參考你所謂的 I 幀前面的圖像;當(dāng)然是實(shí)際工程實(shí)現(xiàn)中,一般沒(méi)有人讓 I 以后的圖像參考 I 以前的圖像;
3、只判斷第一個(gè)slice的type來(lái)作為整個(gè)幀的類(lèi)型可以嗎?
——除非該 slice 的 slice type = 5~9,那么改圖像的其余 slice 的類(lèi)型就與它相同;
4、從碼流中如何得知一個(gè)圖像分幾個(gè)slice?
——無(wú)法從碼流中得知。找到下一幅圖像的開(kāi)始就知道當(dāng)前圖像有幾個(gè) slice 了。
聯(lián)系客服