流媒体应用中TS和MP4格式分析应该是封包格式。不能简单理解成MPEG4的简称。要详细解释这个问题,需要提一下MPEG4和.mp4在概念上的区别。
一般来说,仅提“MPEG4”,是指一种视频压缩算法。可以把原始画面通过数学运算变换成一组二进制数据,达到有损存储的目的。但是光是这样压缩出来的数据,一般不会直接用于播放。因为它只有一帧接一帧的画面,没有其它一些播放所必须的支持数据,比如说:音频;播放速度信息(一秒应该放多少帧,才和原场景速度一致);以及影音同步数据(确保声音和画面一致,不会出现画面中的人物开了枪,结果枪声晚几秒才出现这种情况)等等。要把一个场景记录成可以播放的格式,除了把画面逐帧压缩成MPEG4以外,还需要记录音频,然后和上面提到的类似播放速度这种附加信息一起寸存储。
*.mp4是就是满足这个需求的一种文件容器格式。这种格式面向最终的播放。一个常见的.mp4文件中有一个音频轨和一个视频轨,每个轨可以是若干种格式之一,任意组合后,以一种交叉的方式存贮在*.mp4文件中。常见的.mp4中用到的视频轨格式,有前面提到的MPEG4,还有可能是YUV(未压缩),H.263, H.264/AVC, XVID以及一些其它;常用的音频轨格式有AMR, QCELP, AAC, MP3等。音频和视频轨不需要同时存在。只要有其中一个,常见的播放器都能正常处理(当成声音文件或者是无声电影播放)。
.mp4格式规范是MPEG4 Part 1标准定义的。但是这个格式本身相当通用,并不是只能用来存贮MPEG4视频格式。举个例子,一个.mp4文件中包含的可能是H.263的视频轨及AMR的音频轨。这样它和MPEG4视频压缩算法就半点边都沾不上。但它绝对是一个合法的.mp4文件。从这个意义上讲,.mp4是一个独立的封包格式。也许它的原始设计意图是仅用于MPEG4,但事实上大家觉得它很好用,已经把它扩展成可以包容其它格式了。
象.avi, .3gp, .3g2, .mkv等,其实基本作用和.mp4非常接近,没有本质的区别。出现这么多类似格式,很多时候并不是技术原因,而是不同组织在不同时间提出来的标准。有些甚至只是为了避免专利和知识产权冲突。不同的格式当然也有一些不同的侧重点,比如一般认为mp4和mkv这一类格式相对于avi来说,扩展性更强一些,本身在设计时就考虑了一些附加应用,比如内置字幕轨等。但如果仅用于视频和音频的播放,这些格式并不会造成最终用户在体验上有任何不同。
.rm/.rmvb其实也可以这么理解。唯一区别就是它们在设计的时候人为的加入了限制,仅允许封装real自家的视频和音频格式。我觉得不能说rm/rmvb是包括视频音频在内的一个完整格式。它仍然只是一个封包格式。视频还是由realvideo标准定义的,音频由realaudio标准定义,而且还可能有不同的版本,比如realvideo就有8.0, 9.0, 10.0等各个版本,都可以封装到rm/rmvb中。所以应该认为rm/rmvb, realvideo, realaudio是三个规范,只是real设计得来让它们可以在一起工作而已。理论上,把realvideo视频和realaudio音频封装成avi等其它格式,应该也是可行的。只不过市场意义不大;反过来,用rm/rmvb来封装MPEG4视频和AAC音频,我相信如果real肯放开人为限制,应该只需要很少的改动就可以实现。但同样,这样做没有实际的意义。
回到mp4, 现在市场上对这种东西的称呼其实是不准确的。比如某产品号称“支持MP4播放”,到底是什么意思呢?如果它是指可以播放*.mp4这种文件,那里面的音频和视频格式它能支持多少种组合呢?理论上,我把一个场景的画面一帧接一帧,不加压缩的直接存放(你可以大致想象成把一堆BMP文件一个接一个的复制在一起),加个简单的文件头,也可以生成一个巨大的mp4文件,还可以省掉音频。播放这种文件是没有任何技术可言的,但它的文件名也确实是*.mp4。现在假设我生产了一台设备,仅支持这种格式,是不是也可以在盒子上印上“支持MP4”呢?你买回去,复制一个网上下载的.mp4文件(MPEG4视频和AAC音频应该是一个比较流行的组合),结果发现根本不能播放。现在你来找我,我告诉你说我只能支持“视频为未压缩YUV以及不带音频轨的mp4文件”,算不算骗人呢?就算不举这么极端的例子,一般.mp4文件中常见的视频音频格式也有多种,一个产品要做到支持所有的格式是很难的。所以,如果要准确的描述,应该写清楚类似“支持视频格式为MPEG4或H.264/AVC,音频为AMR或AAC的*.mp4文件”。
更严格一些,还应该写清楚MPEG4支持到哪种profile, AMR是NB还是WB,AAC是LC还是HE等更多细节。几年前刚出来的手持媒体播放器,有些号称支持“xvid视频轨和mp3音频轨的.avi文件”。你以为写得够清楚了吧,结果把下载的一些符合这个格式的文件复制上去,有些能放,有些不能放,有些放一段黑一段。原因就在于,设备支持的是“不带B帧的xvid”(即simple profile),而一般以PC播放为目的的xvid,在压缩时都是用到了B帧的。B帧可以提高画质和文件大小控制精度,但对编码和解码的运算要求都提高了。一些设备硬件能力达不到这个要求的设备,就在这些小地方省略一些细节。最终结果就是,用户如果真要把下载的视频弄上去播放,还要再转换一次。用户看到盒子上的说明,以为他说的xvid是“我平时下载的那种xvid”,但厂家实际上暗示的是“我们只支持带某种限制的xvid,你平时下载那种一般都不符合我的要求”。
当然,随着软硬件水平的提高以及市场竞争,这种误导型的说明正在减少。不过如果有比较确切的格式需求,最好还是先搞清楚这些细节。
N73,据我了解,应该只支持视频为MPEG4 Simple Profile / Advanced SP及H.263 Profile 0 & 3,音频为AMR-NB/WB或者AAC-LC, HE-AAC的mp4文件。如果你放一个视频格式为H.264/AVC的mp4上去,是无法播放出画面来的。