PMP格式詳解
更新時間:2007年01月22日 00:00:00 作者:
PMP格式詳解:著名的jonny設計了PMP格式,讓大家可以使用小P來欣賞到高質(zhì)量的影音;
但隨著版本的推進,出現(xiàn)了PMP1.0, PMP2.0, PMP-AVC, 這些名詞和概念可能讓大家感到很困惑,現(xiàn)在,我根據(jù)我的研究和理解來給大家解釋一下這些名詞的意思。
【PMP格式】
PMP是jonny設計的視頻音頻封裝格式,如同AVI一樣,只是一種封裝的容器格式
PMP格式現(xiàn)在只有兩個版本,一個是1.0, 一個是2.0
PMP1.0是一個比較簡陋的版本,只支持封裝MP4V流(xvid, divx)和MP3流(而且要求是CBR的,采樣率為44100),
從文件頭開始,順序結構如下:
4字節(jié):一定是"pmpm",pmp的標志;
4字節(jié):版本號,為0,表示版本是1.0
4字節(jié):視頻幀總數(shù)
4字節(jié):視頻寬度
4字節(jié):視頻高度
4字節(jié):視頻scale
4字節(jié):視頻rate , 注意:視頻的幀率fps = rate/scale
4字節(jié):最大視頻幀的大小
視頻幀總數(shù)×4個字節(jié):每幀視頻的索引,每個索引4個字節(jié),最低一個bit位表示是否關鍵幀,其余的31位bit表示幀的大小
視頻數(shù)據(jù):字節(jié)數(shù),由上面的索引計算可以得出;
4個字節(jié):音頻幀的數(shù)據(jù)大小(由于采用的是cbr模式,所有的音頻幀數(shù)據(jù)大小一樣,但關鍵幀的大小比普通幀大小多一個字節(jié))
4個字節(jié):音頻幀的總數(shù)
音頻幀總數(shù)×1個字節(jié):每幀音頻的索引,每個索引1個字節(jié),關鍵幀為1,普通幀為0,注意:每幀的實際大小=音頻幀的數(shù)據(jù)大小+索引值;
音頻數(shù)據(jù):字節(jié)數(shù),由上面的索引計算得出;
從上面的分析來看,PMP1.0格式有很大的不足,沒有視頻和音頻的標志位,也就是說,固定死了視頻和音頻的編碼格式,無法封裝各式的流,
同時,由于視頻和音頻數(shù)據(jù)是非交錯存儲,播放程序在回放的時候,文件指針在來回地移動,讀視頻幀的時候移到前面,讀音頻幀又移到后面;
PMP2.0開始,jonny估計意識到1.0的不足,重新設計了文件的格式結構,我個人認為這個改變很不錯:
從文件頭開始,順序結構如下:
4字節(jié):一定是"pmpm",pmp的標志;
4字節(jié):版本號,為1,表示版本是2.0
4字節(jié):視頻格式標志,這是一個改進,為支持封裝各種視頻流提供保證,0表示MP4V流(xvid, divx),1表示AVC流(PMP-AVC其實就是PMP2.0格式,只不過封裝了AVC流)
4字節(jié):視頻幀總數(shù)
4字節(jié):視頻寬度
4字節(jié):視頻高度
4字節(jié):視頻scale
4字節(jié):視頻rate , 注意:視頻的幀率fps = rate/scale
4字節(jié):音頻格式標志,同樣為了以后支持封裝各種音頻提供保證,現(xiàn)在只支持mp3流,該值為0;
4字節(jié):包含的音頻流數(shù)量,為支持多音軌封裝提供了保證,如果一個pmp中封裝了兩條音軌,該值就為2
4字節(jié):每幀視頻附帶的音頻幀的最大數(shù),由于PMP2.0采用了視頻音頻交錯存儲的方式,一幀視頻和相應的幾幀音頻放在一起,這是一個最大值;
4字節(jié):音頻scale,默認為1152
4字節(jié):音頻rate,默認為44100
4字節(jié):音頻是否立體聲,0表示單聲,1表示立體聲;
視頻幀總數(shù)×4個字節(jié):每幀視頻的索引,每個索引4個字節(jié),最低一個bit位表示是否關鍵幀,其余的31位bit表示幀的大?。ㄗ⒁?,這里的幀大小和1.0格式的幀大小不一樣,看下面的解釋)
視頻音頻混和數(shù)據(jù):這里,jonny做了一個比較有意思的設計,把1個視頻幀和其相應的音頻幀混合起來,當做一個數(shù)據(jù)幀;那究竟怎么個混合法呢,我們分析一下:
首先計算每個視頻幀的時間戳和每個音頻幀的時間戳,videotime = videonum / videofps , audiotime = audionum / audiofps (videonum和audionum都從0開始)
那么第一個視頻幀的時間戳就是0/videofps =0,而第二個視頻幀的時間戳就是1/videofps ,然后,把第一個視頻幀和所有時間戳小于1/videofps的音頻幀接在一起,成了一個數(shù)據(jù)幀,如此類推下去;
然后在每個數(shù)據(jù)幀的前面再加上n個字節(jié), n=1+4+4+4+4×每音軌被混合的幀數(shù)×音軌數(shù),
其中這n個字節(jié)的意義如下:
1字節(jié):本數(shù)據(jù)幀中,每音軌被混合的幀數(shù);
4字節(jié):被混合的第一個音頻幀和視頻幀之間的時間差;
4字節(jié):被混合的最后一個音頻幀和視頻幀之間的時間差;
4字節(jié):視頻幀的大小;
4×每音軌被混合的幀數(shù)×音軌數(shù):每個被混合的音頻幀的大小
【PMP的播放】
從上面的分析,我們知道,PMP有兩種格式(1.0,2.0),又由于2.0格式中封裝的流不一樣,出現(xiàn)了所謂pmp2.0和pmp-avc的不同;
所有,我們需要不同的播放器(pmp-mod1, pmp-mod2, pmp-avc)來播放這些文件;
由于pmp1.0和pmp2.0格式文件的差異太大,在小p上如果要實現(xiàn)同時支持這兩種的話,代碼編寫會比較復雜,效率可能也會因此降低
同時由于pmp1.0格式的不足,我建議大家放棄pmp1.0格式,原有的pmp1.0格式的片子可以通過remux轉成2.0格式;
至于pmp-mp4v和pmp-avc文件,我個人認為,他們是可以放在一個程序中支持的,因為他們的封裝是一樣的,只是里面的流不一樣而已;
只需要通過對不同解碼器的解碼即可。
【后話】
寫這篇東西的目的就是希望能讓大家了解到pmp的各種格式的區(qū)別.
我希望自己有時間和能力來給大家做一個pmp-mod,支持pmp2.0(包括pmp-mp4v,pmp-avc),但實際上,我現(xiàn)在的工作比較繁忙,沒有太多精力來編寫這個。
所以,寫這個的另一個目的是分享我的研究,希望能有技術高手能通過這篇東西,寫出一個新的pmp-mod,支持pmp2.0格式的播放(包括pmp-mp4v和pmp-avc)。
但隨著版本的推進,出現(xiàn)了PMP1.0, PMP2.0, PMP-AVC, 這些名詞和概念可能讓大家感到很困惑,現(xiàn)在,我根據(jù)我的研究和理解來給大家解釋一下這些名詞的意思。
【PMP格式】
PMP是jonny設計的視頻音頻封裝格式,如同AVI一樣,只是一種封裝的容器格式
PMP格式現(xiàn)在只有兩個版本,一個是1.0, 一個是2.0
PMP1.0是一個比較簡陋的版本,只支持封裝MP4V流(xvid, divx)和MP3流(而且要求是CBR的,采樣率為44100),
從文件頭開始,順序結構如下:
4字節(jié):一定是"pmpm",pmp的標志;
4字節(jié):版本號,為0,表示版本是1.0
4字節(jié):視頻幀總數(shù)
4字節(jié):視頻寬度
4字節(jié):視頻高度
4字節(jié):視頻scale
4字節(jié):視頻rate , 注意:視頻的幀率fps = rate/scale
4字節(jié):最大視頻幀的大小
視頻幀總數(shù)×4個字節(jié):每幀視頻的索引,每個索引4個字節(jié),最低一個bit位表示是否關鍵幀,其余的31位bit表示幀的大小
視頻數(shù)據(jù):字節(jié)數(shù),由上面的索引計算可以得出;
4個字節(jié):音頻幀的數(shù)據(jù)大小(由于采用的是cbr模式,所有的音頻幀數(shù)據(jù)大小一樣,但關鍵幀的大小比普通幀大小多一個字節(jié))
4個字節(jié):音頻幀的總數(shù)
音頻幀總數(shù)×1個字節(jié):每幀音頻的索引,每個索引1個字節(jié),關鍵幀為1,普通幀為0,注意:每幀的實際大小=音頻幀的數(shù)據(jù)大小+索引值;
音頻數(shù)據(jù):字節(jié)數(shù),由上面的索引計算得出;
從上面的分析來看,PMP1.0格式有很大的不足,沒有視頻和音頻的標志位,也就是說,固定死了視頻和音頻的編碼格式,無法封裝各式的流,
同時,由于視頻和音頻數(shù)據(jù)是非交錯存儲,播放程序在回放的時候,文件指針在來回地移動,讀視頻幀的時候移到前面,讀音頻幀又移到后面;
PMP2.0開始,jonny估計意識到1.0的不足,重新設計了文件的格式結構,我個人認為這個改變很不錯:
從文件頭開始,順序結構如下:
4字節(jié):一定是"pmpm",pmp的標志;
4字節(jié):版本號,為1,表示版本是2.0
4字節(jié):視頻格式標志,這是一個改進,為支持封裝各種視頻流提供保證,0表示MP4V流(xvid, divx),1表示AVC流(PMP-AVC其實就是PMP2.0格式,只不過封裝了AVC流)
4字節(jié):視頻幀總數(shù)
4字節(jié):視頻寬度
4字節(jié):視頻高度
4字節(jié):視頻scale
4字節(jié):視頻rate , 注意:視頻的幀率fps = rate/scale
4字節(jié):音頻格式標志,同樣為了以后支持封裝各種音頻提供保證,現(xiàn)在只支持mp3流,該值為0;
4字節(jié):包含的音頻流數(shù)量,為支持多音軌封裝提供了保證,如果一個pmp中封裝了兩條音軌,該值就為2
4字節(jié):每幀視頻附帶的音頻幀的最大數(shù),由于PMP2.0采用了視頻音頻交錯存儲的方式,一幀視頻和相應的幾幀音頻放在一起,這是一個最大值;
4字節(jié):音頻scale,默認為1152
4字節(jié):音頻rate,默認為44100
4字節(jié):音頻是否立體聲,0表示單聲,1表示立體聲;
視頻幀總數(shù)×4個字節(jié):每幀視頻的索引,每個索引4個字節(jié),最低一個bit位表示是否關鍵幀,其余的31位bit表示幀的大?。ㄗ⒁?,這里的幀大小和1.0格式的幀大小不一樣,看下面的解釋)
視頻音頻混和數(shù)據(jù):這里,jonny做了一個比較有意思的設計,把1個視頻幀和其相應的音頻幀混合起來,當做一個數(shù)據(jù)幀;那究竟怎么個混合法呢,我們分析一下:
首先計算每個視頻幀的時間戳和每個音頻幀的時間戳,videotime = videonum / videofps , audiotime = audionum / audiofps (videonum和audionum都從0開始)
那么第一個視頻幀的時間戳就是0/videofps =0,而第二個視頻幀的時間戳就是1/videofps ,然后,把第一個視頻幀和所有時間戳小于1/videofps的音頻幀接在一起,成了一個數(shù)據(jù)幀,如此類推下去;
然后在每個數(shù)據(jù)幀的前面再加上n個字節(jié), n=1+4+4+4+4×每音軌被混合的幀數(shù)×音軌數(shù),
其中這n個字節(jié)的意義如下:
1字節(jié):本數(shù)據(jù)幀中,每音軌被混合的幀數(shù);
4字節(jié):被混合的第一個音頻幀和視頻幀之間的時間差;
4字節(jié):被混合的最后一個音頻幀和視頻幀之間的時間差;
4字節(jié):視頻幀的大小;
4×每音軌被混合的幀數(shù)×音軌數(shù):每個被混合的音頻幀的大小
【PMP的播放】
從上面的分析,我們知道,PMP有兩種格式(1.0,2.0),又由于2.0格式中封裝的流不一樣,出現(xiàn)了所謂pmp2.0和pmp-avc的不同;
所有,我們需要不同的播放器(pmp-mod1, pmp-mod2, pmp-avc)來播放這些文件;
由于pmp1.0和pmp2.0格式文件的差異太大,在小p上如果要實現(xiàn)同時支持這兩種的話,代碼編寫會比較復雜,效率可能也會因此降低
同時由于pmp1.0格式的不足,我建議大家放棄pmp1.0格式,原有的pmp1.0格式的片子可以通過remux轉成2.0格式;
至于pmp-mp4v和pmp-avc文件,我個人認為,他們是可以放在一個程序中支持的,因為他們的封裝是一樣的,只是里面的流不一樣而已;
只需要通過對不同解碼器的解碼即可。
【后話】
寫這篇東西的目的就是希望能讓大家了解到pmp的各種格式的區(qū)別.
我希望自己有時間和能力來給大家做一個pmp-mod,支持pmp2.0(包括pmp-mp4v,pmp-avc),但實際上,我現(xiàn)在的工作比較繁忙,沒有太多精力來編寫這個。
所以,寫這個的另一個目的是分享我的研究,希望能有技術高手能通過這篇東西,寫出一個新的pmp-mod,支持pmp2.0格式的播放(包括pmp-mp4v和pmp-avc)。
相關文章
關于bluehost空間上wordpress后臺變?yōu)橛⑽牡慕鉀Q方案
有天晚上BH的服務器出現(xiàn)問題,過了一會恢復了過來,但wordpress后臺變成了英文界面,但是以為是自己正在修改東西所造成的問題,后來查了些資料才找到問題的原因:2008-05-05