PMP格式详解

所属分类: 实用技巧 / 应用技巧 阅读数: 920
收藏 0 赞 0 分享
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)。
更多精彩内容其他人还在看

DEDECMS插入表时的出错

修改服务器mysql的sql-mode配置以解决DEDECMS插入表时的出错的BUG
收藏 0 赞 0 分享

Firefox浏览器狂占CPU解决办法

这两天 Firefox 突然变态,时不时的占用接近 50% CPU 资源,带来的现象是系统应用程序响应极慢。开始还以为是个别页面带来的问题,后来发现原来是普遍现象。这类问题开始不好求助于 Google ,说实话,不知道用啥作关键字搜索。
收藏 0 赞 0 分享

TMP、TEMP和TMP文件区别解析

总是发现很多tmp和temp等缓存文件,不懂为什么要那么多区别,看了下文,感觉不错
收藏 0 赞 0 分享

保存网页图片的八种方法小结

为了增加互动性和美观,现在的网页中都有许多精美的图片,这些都是网页制作者精心制作出来的,如果你想拿来为自己所用就必须把它们保存下来。另外,在一些电子书中也有精美的图片,为了防止有人复制,作者禁用了鼠标右键无法直接下载,针对以上情况,我们可以想办法来突破限制,从易到难可以顺次采用以
收藏 0 赞 0 分享

高手总结的电脑应用技巧第1/3页

声明:以下技巧都是一些电脑常用技巧,但也并不是每个人都很清楚,请只选择你感兴趣的内容选择性的观看。
收藏 0 赞 0 分享

不用任何软件修改mac地址的图文方法

一直都用的软件修改mac地址,没想到可以直接修改,学到一招
收藏 0 赞 0 分享

安装ppstream后出现的ppsap.exe进程解决办法

程文件:ppsap.exe 进程名称:ppsap.exe 描述: ppstream每次启动都会另开一个进程“网络加速器”(ppsap.exe), (1)每次开机都会自动运行, (2)退出ppstream之后会继续存在, (3)可手动在taskmanager
收藏 0 赞 0 分享

SIM卡的基本知识

一直用SIM卡不知道是怎么回事呢
收藏 0 赞 0 分享

删除XP中“自定义通知”的历史项目

XP中自定义通知很反感,告诉大家它的删除方法
收藏 0 赞 0 分享

更改IE浏览器的图标

注册表更改IE图标
收藏 0 赞 0 分享
查看更多