PMP格式詳解
更新時(shí)間:2007年01月22日 00:00:00 作者:
PMP格式詳解:著名的jonny設(shè)計(jì)了PMP格式,讓大家可以使用小P來(lái)欣賞到高質(zhì)量的影音;
但隨著版本的推進(jìn),出現(xiàn)了PMP1.0, PMP2.0, PMP-AVC, 這些名詞和概念可能讓大家感到很困惑,現(xiàn)在,我根據(jù)我的研究和理解來(lái)給大家解釋一下這些名詞的意思。
【PMP格式】
PMP是jonny設(shè)計(jì)的視頻音頻封裝格式,如同AVI一樣,只是一種封裝的容器格式
PMP格式現(xiàn)在只有兩個(gè)版本,一個(gè)是1.0, 一個(gè)是2.0
PMP1.0是一個(gè)比較簡(jiǎn)陋的版本,只支持封裝MP4V流(xvid, divx)和MP3流(而且要求是CBR的,采樣率為44100),
從文件頭開(kāi)始,順序結(jié)構(gòu)如下:
4字節(jié):一定是"pmpm",pmp的標(biāo)志;
4字節(jié):版本號(hào),為0,表示版本是1.0
4字節(jié):視頻幀總數(shù)
4字節(jié):視頻寬度
4字節(jié):視頻高度
4字節(jié):視頻scale
4字節(jié):視頻rate , 注意:視頻的幀率fps = rate/scale
4字節(jié):最大視頻幀的大小
視頻幀總數(shù)×4個(gè)字節(jié):每幀視頻的索引,每個(gè)索引4個(gè)字節(jié),最低一個(gè)bit位表示是否關(guān)鍵幀,其余的31位bit表示幀的大小
視頻數(shù)據(jù):字節(jié)數(shù),由上面的索引計(jì)算可以得出;
4個(gè)字節(jié):音頻幀的數(shù)據(jù)大?。ㄓ捎诓捎玫氖莄br模式,所有的音頻幀數(shù)據(jù)大小一樣,但關(guān)鍵幀的大小比普通幀大小多一個(gè)字節(jié))
4個(gè)字節(jié):音頻幀的總數(shù)
音頻幀總數(shù)×1個(gè)字節(jié):每幀音頻的索引,每個(gè)索引1個(gè)字節(jié),關(guān)鍵幀為1,普通幀為0,注意:每幀的實(shí)際大小=音頻幀的數(shù)據(jù)大小+索引值;
音頻數(shù)據(jù):字節(jié)數(shù),由上面的索引計(jì)算得出;
從上面的分析來(lái)看,PMP1.0格式有很大的不足,沒(méi)有視頻和音頻的標(biāo)志位,也就是說(shuō),固定死了視頻和音頻的編碼格式,無(wú)法封裝各式的流,
同時(shí),由于視頻和音頻數(shù)據(jù)是非交錯(cuò)存儲(chǔ),播放程序在回放的時(shí)候,文件指針在來(lái)回地移動(dòng),讀視頻幀的時(shí)候移到前面,讀音頻幀又移到后面;
PMP2.0開(kāi)始,jonny估計(jì)意識(shí)到1.0的不足,重新設(shè)計(jì)了文件的格式結(jié)構(gòu),我個(gè)人認(rèn)為這個(gè)改變很不錯(cuò):
從文件頭開(kāi)始,順序結(jié)構(gòu)如下:
4字節(jié):一定是"pmpm",pmp的標(biāo)志;
4字節(jié):版本號(hào),為1,表示版本是2.0
4字節(jié):視頻格式標(biāo)志,這是一個(gè)改進(jìn),為支持封裝各種視頻流提供保證,0表示MP4V流(xvid, divx),1表示AVC流(PMP-AVC其實(shí)就是PMP2.0格式,只不過(guò)封裝了AVC流)
4字節(jié):視頻幀總數(shù)
4字節(jié):視頻寬度
4字節(jié):視頻高度
4字節(jié):視頻scale
4字節(jié):視頻rate , 注意:視頻的幀率fps = rate/scale
4字節(jié):音頻格式標(biāo)志,同樣為了以后支持封裝各種音頻提供保證,現(xiàn)在只支持mp3流,該值為0;
4字節(jié):包含的音頻流數(shù)量,為支持多音軌封裝提供了保證,如果一個(gè)pmp中封裝了兩條音軌,該值就為2
4字節(jié):每幀視頻附帶的音頻幀的最大數(shù),由于PMP2.0采用了視頻音頻交錯(cuò)存儲(chǔ)的方式,一幀視頻和相應(yīng)的幾幀音頻放在一起,這是一個(gè)最大值;
4字節(jié):音頻scale,默認(rèn)為1152
4字節(jié):音頻rate,默認(rèn)為44100
4字節(jié):音頻是否立體聲,0表示單聲,1表示立體聲;
視頻幀總數(shù)×4個(gè)字節(jié):每幀視頻的索引,每個(gè)索引4個(gè)字節(jié),最低一個(gè)bit位表示是否關(guān)鍵幀,其余的31位bit表示幀的大?。ㄗ⒁?,這里的幀大小和1.0格式的幀大小不一樣,看下面的解釋?zhuān)?nbsp;
視頻音頻混和數(shù)據(jù):這里,jonny做了一個(gè)比較有意思的設(shè)計(jì),把1個(gè)視頻幀和其相應(yīng)的音頻幀混合起來(lái),當(dāng)做一個(gè)數(shù)據(jù)幀;那究竟怎么個(gè)混合法呢,我們分析一下:
首先計(jì)算每個(gè)視頻幀的時(shí)間戳和每個(gè)音頻幀的時(shí)間戳,videotime = videonum / videofps , audiotime = audionum / audiofps (videonum和audionum都從0開(kāi)始)
那么第一個(gè)視頻幀的時(shí)間戳就是0/videofps =0,而第二個(gè)視頻幀的時(shí)間戳就是1/videofps ,然后,把第一個(gè)視頻幀和所有時(shí)間戳小于1/videofps的音頻幀接在一起,成了一個(gè)數(shù)據(jù)幀,如此類(lèi)推下去;
然后在每個(gè)數(shù)據(jù)幀的前面再加上n個(gè)字節(jié), n=1+4+4+4+4×每音軌被混合的幀數(shù)×音軌數(shù),
其中這n個(gè)字節(jié)的意義如下:
1字節(jié):本數(shù)據(jù)幀中,每音軌被混合的幀數(shù);
4字節(jié):被混合的第一個(gè)音頻幀和視頻幀之間的時(shí)間差;
4字節(jié):被混合的最后一個(gè)音頻幀和視頻幀之間的時(shí)間差;
4字節(jié):視頻幀的大小;
4×每音軌被混合的幀數(shù)×音軌數(shù):每個(gè)被混合的音頻幀的大小
【PMP的播放】
從上面的分析,我們知道,PMP有兩種格式(1.0,2.0),又由于2.0格式中封裝的流不一樣,出現(xiàn)了所謂pmp2.0和pmp-avc的不同;
所有,我們需要不同的播放器(pmp-mod1, pmp-mod2, pmp-avc)來(lái)播放這些文件;
由于pmp1.0和pmp2.0格式文件的差異太大,在小p上如果要實(shí)現(xiàn)同時(shí)支持這兩種的話,代碼編寫(xiě)會(huì)比較復(fù)雜,效率可能也會(huì)因此降低
同時(shí)由于pmp1.0格式的不足,我建議大家放棄pmp1.0格式,原有的pmp1.0格式的片子可以通過(guò)remux轉(zhuǎn)成2.0格式;
至于pmp-mp4v和pmp-avc文件,我個(gè)人認(rèn)為,他們是可以放在一個(gè)程序中支持的,因?yàn)樗麄兊姆庋b是一樣的,只是里面的流不一樣而已;
只需要通過(guò)對(duì)不同解碼器的解碼即可。
【后話】
寫(xiě)這篇東西的目的就是希望能讓大家了解到pmp的各種格式的區(qū)別.
我希望自己有時(shí)間和能力來(lái)給大家做一個(gè)pmp-mod,支持pmp2.0(包括pmp-mp4v,pmp-avc),但實(shí)際上,我現(xiàn)在的工作比較繁忙,沒(méi)有太多精力來(lái)編寫(xiě)這個(gè)。
所以,寫(xiě)這個(gè)的另一個(gè)目的是分享我的研究,希望能有技術(shù)高手能通過(guò)這篇東西,寫(xiě)出一個(gè)新的pmp-mod,支持pmp2.0格式的播放(包括pmp-mp4v和pmp-avc)。
但隨著版本的推進(jìn),出現(xiàn)了PMP1.0, PMP2.0, PMP-AVC, 這些名詞和概念可能讓大家感到很困惑,現(xiàn)在,我根據(jù)我的研究和理解來(lái)給大家解釋一下這些名詞的意思。
【PMP格式】
PMP是jonny設(shè)計(jì)的視頻音頻封裝格式,如同AVI一樣,只是一種封裝的容器格式
PMP格式現(xiàn)在只有兩個(gè)版本,一個(gè)是1.0, 一個(gè)是2.0
PMP1.0是一個(gè)比較簡(jiǎn)陋的版本,只支持封裝MP4V流(xvid, divx)和MP3流(而且要求是CBR的,采樣率為44100),
從文件頭開(kāi)始,順序結(jié)構(gòu)如下:
4字節(jié):一定是"pmpm",pmp的標(biāo)志;
4字節(jié):版本號(hào),為0,表示版本是1.0
4字節(jié):視頻幀總數(shù)
4字節(jié):視頻寬度
4字節(jié):視頻高度
4字節(jié):視頻scale
4字節(jié):視頻rate , 注意:視頻的幀率fps = rate/scale
4字節(jié):最大視頻幀的大小
視頻幀總數(shù)×4個(gè)字節(jié):每幀視頻的索引,每個(gè)索引4個(gè)字節(jié),最低一個(gè)bit位表示是否關(guān)鍵幀,其余的31位bit表示幀的大小
視頻數(shù)據(jù):字節(jié)數(shù),由上面的索引計(jì)算可以得出;
4個(gè)字節(jié):音頻幀的數(shù)據(jù)大?。ㄓ捎诓捎玫氖莄br模式,所有的音頻幀數(shù)據(jù)大小一樣,但關(guān)鍵幀的大小比普通幀大小多一個(gè)字節(jié))
4個(gè)字節(jié):音頻幀的總數(shù)
音頻幀總數(shù)×1個(gè)字節(jié):每幀音頻的索引,每個(gè)索引1個(gè)字節(jié),關(guān)鍵幀為1,普通幀為0,注意:每幀的實(shí)際大小=音頻幀的數(shù)據(jù)大小+索引值;
音頻數(shù)據(jù):字節(jié)數(shù),由上面的索引計(jì)算得出;
從上面的分析來(lái)看,PMP1.0格式有很大的不足,沒(méi)有視頻和音頻的標(biāo)志位,也就是說(shuō),固定死了視頻和音頻的編碼格式,無(wú)法封裝各式的流,
同時(shí),由于視頻和音頻數(shù)據(jù)是非交錯(cuò)存儲(chǔ),播放程序在回放的時(shí)候,文件指針在來(lái)回地移動(dòng),讀視頻幀的時(shí)候移到前面,讀音頻幀又移到后面;
PMP2.0開(kāi)始,jonny估計(jì)意識(shí)到1.0的不足,重新設(shè)計(jì)了文件的格式結(jié)構(gòu),我個(gè)人認(rèn)為這個(gè)改變很不錯(cuò):
從文件頭開(kāi)始,順序結(jié)構(gòu)如下:
4字節(jié):一定是"pmpm",pmp的標(biāo)志;
4字節(jié):版本號(hào),為1,表示版本是2.0
4字節(jié):視頻格式標(biāo)志,這是一個(gè)改進(jìn),為支持封裝各種視頻流提供保證,0表示MP4V流(xvid, divx),1表示AVC流(PMP-AVC其實(shí)就是PMP2.0格式,只不過(guò)封裝了AVC流)
4字節(jié):視頻幀總數(shù)
4字節(jié):視頻寬度
4字節(jié):視頻高度
4字節(jié):視頻scale
4字節(jié):視頻rate , 注意:視頻的幀率fps = rate/scale
4字節(jié):音頻格式標(biāo)志,同樣為了以后支持封裝各種音頻提供保證,現(xiàn)在只支持mp3流,該值為0;
4字節(jié):包含的音頻流數(shù)量,為支持多音軌封裝提供了保證,如果一個(gè)pmp中封裝了兩條音軌,該值就為2
4字節(jié):每幀視頻附帶的音頻幀的最大數(shù),由于PMP2.0采用了視頻音頻交錯(cuò)存儲(chǔ)的方式,一幀視頻和相應(yīng)的幾幀音頻放在一起,這是一個(gè)最大值;
4字節(jié):音頻scale,默認(rèn)為1152
4字節(jié):音頻rate,默認(rèn)為44100
4字節(jié):音頻是否立體聲,0表示單聲,1表示立體聲;
視頻幀總數(shù)×4個(gè)字節(jié):每幀視頻的索引,每個(gè)索引4個(gè)字節(jié),最低一個(gè)bit位表示是否關(guān)鍵幀,其余的31位bit表示幀的大?。ㄗ⒁?,這里的幀大小和1.0格式的幀大小不一樣,看下面的解釋?zhuān)?nbsp;
視頻音頻混和數(shù)據(jù):這里,jonny做了一個(gè)比較有意思的設(shè)計(jì),把1個(gè)視頻幀和其相應(yīng)的音頻幀混合起來(lái),當(dāng)做一個(gè)數(shù)據(jù)幀;那究竟怎么個(gè)混合法呢,我們分析一下:
首先計(jì)算每個(gè)視頻幀的時(shí)間戳和每個(gè)音頻幀的時(shí)間戳,videotime = videonum / videofps , audiotime = audionum / audiofps (videonum和audionum都從0開(kāi)始)
那么第一個(gè)視頻幀的時(shí)間戳就是0/videofps =0,而第二個(gè)視頻幀的時(shí)間戳就是1/videofps ,然后,把第一個(gè)視頻幀和所有時(shí)間戳小于1/videofps的音頻幀接在一起,成了一個(gè)數(shù)據(jù)幀,如此類(lèi)推下去;
然后在每個(gè)數(shù)據(jù)幀的前面再加上n個(gè)字節(jié), n=1+4+4+4+4×每音軌被混合的幀數(shù)×音軌數(shù),
其中這n個(gè)字節(jié)的意義如下:
1字節(jié):本數(shù)據(jù)幀中,每音軌被混合的幀數(shù);
4字節(jié):被混合的第一個(gè)音頻幀和視頻幀之間的時(shí)間差;
4字節(jié):被混合的最后一個(gè)音頻幀和視頻幀之間的時(shí)間差;
4字節(jié):視頻幀的大小;
4×每音軌被混合的幀數(shù)×音軌數(shù):每個(gè)被混合的音頻幀的大小
【PMP的播放】
從上面的分析,我們知道,PMP有兩種格式(1.0,2.0),又由于2.0格式中封裝的流不一樣,出現(xiàn)了所謂pmp2.0和pmp-avc的不同;
所有,我們需要不同的播放器(pmp-mod1, pmp-mod2, pmp-avc)來(lái)播放這些文件;
由于pmp1.0和pmp2.0格式文件的差異太大,在小p上如果要實(shí)現(xiàn)同時(shí)支持這兩種的話,代碼編寫(xiě)會(huì)比較復(fù)雜,效率可能也會(huì)因此降低
同時(shí)由于pmp1.0格式的不足,我建議大家放棄pmp1.0格式,原有的pmp1.0格式的片子可以通過(guò)remux轉(zhuǎn)成2.0格式;
至于pmp-mp4v和pmp-avc文件,我個(gè)人認(rèn)為,他們是可以放在一個(gè)程序中支持的,因?yàn)樗麄兊姆庋b是一樣的,只是里面的流不一樣而已;
只需要通過(guò)對(duì)不同解碼器的解碼即可。
【后話】
寫(xiě)這篇東西的目的就是希望能讓大家了解到pmp的各種格式的區(qū)別.
我希望自己有時(shí)間和能力來(lái)給大家做一個(gè)pmp-mod,支持pmp2.0(包括pmp-mp4v,pmp-avc),但實(shí)際上,我現(xiàn)在的工作比較繁忙,沒(méi)有太多精力來(lái)編寫(xiě)這個(gè)。
所以,寫(xiě)這個(gè)的另一個(gè)目的是分享我的研究,希望能有技術(shù)高手能通過(guò)這篇東西,寫(xiě)出一個(gè)新的pmp-mod,支持pmp2.0格式的播放(包括pmp-mp4v和pmp-avc)。
相關(guān)文章
提示缺少“S2CSplash.DLL"的解決方法,下載此文件放到才程序目錄即可
提示缺少“S2CSplash.DLL"的解決方法,下載此文件放到才程序目錄即可...2007-08-08
關(guān)于bluehost空間上wordpress后臺(tái)變?yōu)橛⑽牡慕鉀Q方案
有天晚上BH的服務(wù)器出現(xiàn)問(wèn)題,過(guò)了一會(huì)恢復(fù)了過(guò)來(lái),但wordpress后臺(tái)變成了英文界面,但是以為是自己正在修改東西所造成的問(wèn)題,后來(lái)查了些資料才找到問(wèn)題的原因:2008-05-05
解決Office2003找不到SKU011.CAB問(wèn)題方法
解決Office2003找不到SKU011.CAB問(wèn)題方法...2007-03-03
USB2.0的,full speed 和 high speed 的關(guān)系
今天才明白什么我以前的usb2.0,拷貝速度慢,原理usb2.0分成full speed 和 high speed2008-04-04
可以用IE輕松遠(yuǎn)程控制對(duì)方電腦的軟件 motelyAnywhere 安裝使用圖文教程
可以用IE輕松遠(yuǎn)程控制對(duì)方電腦的軟件 motelyAnywhere 安裝使用圖文教程...2007-12-12
鍵盤(pán)操作優(yōu)勢(shì) IE7快捷鍵集錦
鍵盤(pán)操作優(yōu)勢(shì) IE7快捷鍵集錦...2007-03-03
江蘇徐州的西聯(lián)快匯網(wǎng)點(diǎn)一覽表
徐州的站長(zhǎng)朋友們,做google收支票的時(shí)代已經(jīng)落伍了,現(xiàn)在基本上都是用西聯(lián)了,不用手續(xù)費(fèi)。2007-11-11

