国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 課堂 > 基礎知識 > 正文

PMP格式詳解

2020-10-28 20:22:21
字體:
來源:轉載
供稿:網友
PMP格式詳解:著名的jonny設計了PMP格式,讓大家可以使用小P來欣賞到高質量的影音; 
但隨著版本的推進,出現了PMP1.0, PMP2.0, PMP-AVC, 這些名詞和概念可能讓大家感到很困惑,現在,我根據我的研究和理解來給大家解釋一下這些名詞的意思。 

【PMP格式】 
PMP是jonny設計的視頻音頻封裝格式,如同AVI一樣,只是一種封裝的容器格式 
PMP格式現在只有兩個版本,一個是1.0, 一個是2.0 

PMP1.0是一個比較簡陋的版本,只支持封裝MP4V流(xvid, divx)和MP3流(而且要求是CBR的,采樣率為44100), 
從文件頭開始,順序結構如下: 

4字節:一定是"pmpm",pmp的標志; 
4字節:版本號,為0,表示版本是1.0 
4字節:視頻幀總數 
4字節:視頻寬度 
4字節:視頻高度 
4字節:視頻scale 
4字節:視頻rate , 注意:視頻的幀率fps = rate/scale 
4字節:最大視頻幀的大小 
視頻幀總數×4個字節:每幀視頻的索引,每個索引4個字節,最低一個bit位表示是否關鍵幀,其余的31位bit表示幀的大小 
視頻數據:字節數,由上面的索引計算可以得出; 
4個字節:音頻幀的數據大小(由于采用的是cbr模式,所有的音頻幀數據大小一樣,但關鍵幀的大小比普通幀大小多一個字節) 
4個字節:音頻幀的總數 
音頻幀總數×1個字節:每幀音頻的索引,每個索引1個字節,關鍵幀為1,普通幀為0,注意:每幀的實際大小=音頻幀的數據大小+索引值; 
音頻數據:字節數,由上面的索引計算得出; 

從上面的分析來看,PMP1.0格式有很大的不足,沒有視頻和音頻的標志位,也就是說,固定死了視頻和音頻的編碼格式,無法封裝各式的流, 
同時,由于視頻和音頻數據是非交錯存儲,播放程序在回放的時候,文件指針在來回地移動,讀視頻幀的時候移到前面,讀音頻幀又移到后面; 

PMP2.0開始,jonny估計意識到1.0的不足,重新設計了文件的格式結構,我個人認為這個改變很不錯: 
從文件頭開始,順序結構如下: 

4字節:一定是"pmpm",pmp的標志; 
4字節:版本號,為1,表示版本是2.0 
4字節:視頻格式標志,這是一個改進,為支持封裝各種視頻流提供保證,0表示MP4V流(xvid, divx),1表示AVC流(PMP-AVC其實就是PMP2.0格式,只不過封裝了AVC流) 
4字節:視頻幀總數 
4字節:視頻寬度 
4字節:視頻高度 
4字節:視頻scale 
4字節:視頻rate , 注意:視頻的幀率fps = rate/scale 
4字節:音頻格式標志,同樣為了以后支持封裝各種音頻提供保證,現在只支持mp3流,該值為0; 
4字節:包含的音頻流數量,為支持多音軌封裝提供了保證,如果一個pmp中封裝了兩條音軌,該值就為2 
4字節:每幀視頻附帶的音頻幀的最大數,由于PMP2.0采用了視頻音頻交錯存儲的方式,一幀視頻和相應的幾幀音頻放在一起,這是一個最大值; 
4字節:音頻scale,默認為1152 
4字節:音頻rate,默認為44100 
4字節:音頻是否立體聲,0表示單聲,1表示立體聲; 
視頻幀總數×4個字節:每幀視頻的索引,每個索引4個字節,最低一個bit位表示是否關鍵幀,其余的31位bit表示幀的大小(注意,這里的幀大小和1.0格式的幀大小不一樣,看下面的解釋) 
視頻音頻混和數據:這里,jonny做了一個比較有意思的設計,把1個視頻幀和其相應的音頻幀混合起來,當做一個數據幀;那究竟怎么個混合法呢,我們分析一下: 
首先計算每個視頻幀的時間戳和每個音頻幀的時間戳,videotime = videonum / videofps , audiotime = audionum / audiofps (videonum和audionum都從0開始) 
那么第一個視頻幀的時間戳就是0/videofps =0,而第二個視頻幀的時間戳就是1/videofps ,然后,把第一個視頻幀和所有時間戳小于1/videofps的音頻幀接在一起,成了一個數據幀,如此類推下去; 
然后在每個數據幀的前面再加上n個字節, n=1+4+4+4+4×每音軌被混合的幀數×音軌數, 
其中這n個字節的意義如下: 
1字節:本數據幀中,每音軌被混合的幀數; 
4字節:被混合的第一個音頻幀和視頻幀之間的時間差; 
4字節:被混合的最后一個音頻幀和視頻幀之間的時間差; 
4字節:視頻幀的大小; 
4×每音軌被混合的幀數×音軌數:每個被混合的音頻幀的大小 

【PMP的播放】 
從上面的分析,我們知道,PMP有兩種格式(1.0,2.0),又由于2.0格式中封裝的流不一樣,出現了所謂pmp2.0和pmp-avc的不同; 
所有,我們需要不同的播放器(pmp-mod1, pmp-mod2, pmp-avc)來播放這些文件; 

由于pmp1.0和pmp2.0格式文件的差異太大,在小p上如果要實現同時支持這兩種的話,代碼編寫會比較復雜,效率可能也會因此降低 
同時由于pmp1.0格式的不足,我建議大家放棄pmp1.0格式,原有的pmp1.0格式的片子可以通過remux轉成2.0格式; 
至于pmp-mp4v和pmp-avc文件,我個人認為,他們是可以放在一個程序中支持的,因為他們的封裝是一樣的,只是里面的流不一樣而已; 
只需要通過對不同解碼器的解碼即可。 

【后話】 
寫這篇東西的目的就是希望能讓大家了解到pmp的各種格式的區別. 
我希望自己有時間和能力來給大家做一個pmp-mod,支持pmp2.0(包括pmp-mp4v,pmp-avc),但實際上,我現在的工作比較繁忙,沒有太多精力來編寫這個。 
所以,寫這個的另一個目的是分享我的研究,希望能有技術高手能通過這篇東西,寫出一個新的pmp-mod,支持pmp2.0格式的播放(包括pmp-mp4v和pmp-avc)。
上一篇:obj格式簡介

下一篇:不同語言的URLEncode

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 花莲市| 如东县| 仲巴县| 石景山区| 金堂县| 石景山区| 德令哈市| 孟津县| 安康市| 顺义区| 武夷山市| 嘉兴市| 颍上县| 阜城县| 文水县| 开鲁县| 高要市| 托克托县| 新丰县| 白银市| 嘉峪关市| 临澧县| 永仁县| 梓潼县| 巴林左旗| 彭水| 互助| 哈密市| 宝鸡市| 济宁市| 藁城市| 嫩江县| 唐海县| 大冶市| 习水县| 同仁县| 林周县| 永济市| 祥云县| 宁明县| 海淀区|