抛弃FLV,迎接MP4——制作Flash Player支持的H.264视频格式

  • 本站文章除注明转载外,均为本站原创或者翻译。
  • 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
  • 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
  • 本博客采用 WPCMD 维护;
  • 本文标题:抛弃FLV,迎接MP4——制作Flash Player支持的H.264视频格式
  • 本文链接:http://zengrong.net/post/393.htm


Flash Player 9.0.115发布了,这是一个支持H.264的正式版本。关于H.264,已经说得太多,播放H.264的视频也很简单,用NetStream即可(也就是播放FLV的那一套,想了解的可以看这篇官方提供的教程),但是怎么把现有的视频压缩成Flash Player支持的H.264格式呢?

首先,要了解Flash Player 9.0.115对视频编码到底支持到哪个程度。

下面是Adobe官方提供的一个Flash Player支持的视频编码列表(原文):

视频编码 SWF 文件格式版本(发布的版本) 支持播放的最小Flash Player版本
Sorenson Spark 6 6
On2 VP6 6 8
H.264 (MPEG-4 Part 10) 9 9.0.115.0*
音频编码 SWF 文件格式版本(发布的版本) 支持播放的最小Flash Player版本
ADPCM 6 6
MP3 6 6
HE-AAC (MPEG-4 Part 3) 9 9.0.115.0*

*Flash Player 可以播放视频编码为H.264,音频编码为AAC的标准MPEG-4文件。文件的扩展名可以是:F4V, MP4, M4A, MOV, MP4V, 3GP, 3G2等等。

注意:如果没有特别说明,下面的Flash Player都指Flash Player 9(v 9.0.115.0)

Flash Player 9 (v 9.0.115.0) 支持下面的 MPEG-4 标准的子集:

MPEG-4 标准 Flash Player Update 3
ISO/IEC 14496-3 (Audio AAC) AAC Main; AAC LC; SBR
ISO/IEC 14496-10 (Video AVC) Base (BP); Main (MP); High (HiP). All levels are supported.
ISO/IEC 14496-12 (Container) 1 Audio track; 1 Video track
3GPP TS 26.245 (Timed text format) Full support.

那么,什么是H.264?“MPEG4 Part 10”是什么?它和“Part 3”、“Part 2” 有什么关系?可以看这篇文章

简单的讲,H.264、MPEG4 Part 10、MPEG4 AVC和ISO/IEC 14496-10 都是一个东东,就是一种视频编码格式,同时也是高清电影采用的视频编码格式之一(另外两种是MPEG2和VC-1)。

而平常我们熟悉的DivX以及XviD编码,都属于MPEG4标准的范畴,但它们属于MPEG4 Part 2,Flash Player是不支持它们的。

了解了基础知识之后,我们首先需要找到一个编码工具。

选择一个优秀的压缩工具至关重要。Flash CS3自带的用于压缩FLV的压缩器自然是无法胜任了。可是网上的视频转换工具多如牛毛,要找一款好用的真的很难。本着“免费、易用、专业、通吃”这四个标准,经过大量测试,终于找到一款优秀的国产编码软件MediaCoder(中文名:影音转码宝盒),以下是来自MediaCoder官方网站的介绍:

MediaCoder是一个免费的通用音频/视频批量转码工具,它将众多来自开源社区的优秀音频视频编解码器和工具整合为一个通用的解决方案,可以将音频、视频文件在各种格式之间进行转换。

功能和特点

  • 基于优秀的众多的开源编解码后台,能够解码和编码的格式多
  • 极为丰富的可调整的编码参数
  • 全部编解码器自带,不依赖于系统的编解码器和任何组件
  • 良好的可扩展的程序架构,快速适应新的需求,不断增加新的格式的支持
  • 利用脚本语言扩展的界面,有支持众多影音设备(如PSPiPod)的专用界面
  • 高性能,特别在双核处理器上表现优异


典型应用

  • 提高影音文件压缩率,减小其文件尺寸
  • 转换至可在各种影音设备上播放的影音文件,如MP3播放器、MP4播放器、手机、PDA、VCD/DVD播放机
  • 提取视频文件中的音轨并转换成MP3、AAC、WMA等音频文件
  • 修复和改善一些损坏的、部分下载的或质量不佳的影音文件

支持格式

*仅支持输入

编码工具搞定,接着就可以“制作”影片了。

我采用的源片是著名的Backkom Assa Game Contest片段,片源编码如下:

G:\Movie\Backkom\Assa Game Contest.wmv
General
Complete name : G:\Movie\Backkom\Assa Game Contest.wmv
Format : Windows Media
File size : 1.89 MiB
PlayTime : 33s 991ms
Bit rate : 467 Kbps
Movie name : Assa
Performer : Aaron Lim
Copyright : rg animation studios
Comment : rg animation studios
Video
Codec : WMV3
Codec/Info : Windows Media Video 9
Bit rate : 408 Kbps
Width : 320 pixels
Height : 240 pixels
Aspect ratio : 4/3
Audio
Codec : WMA2
Codec/Info : Windows Media Audio 2
Bit rate : 48 Kbps
Channel(s) : 2 channels
Sampling rate : 44 KHz

在压缩前,最重要的就是在MediaCoder中选择视频编码和音频编码。根据上面的表格我们知道,Flash Player 9.0.115支持H.264视频编码和HE-AAC音频编码。下图是我在MediaCoder中的设置。

H.264视频设置
H.264视频设置

 

HE-AAC音频编码
HE-AAC音频设置

 

h264video2
视频大小设置

将这三个设置调整好即可。H.264的编码优于WMV9,所以在压缩的时候,选择的视频和音频码率都小于源文件的码率。

转换完后的视频扩展名为MP4,详细编码信息如下:

G:\Movie\Backkom\Assa Game Contest.mp4
General
Complete name : G:\Movie\Backkom\Assa Game Contest.mp4
Format : MPEG-4
Format/Info : ISO 14496-1 Base Media
Format/Family : MPEG-4
File size : 1.40 MiB
PlayTime : 33s 920ms
Bit rate : 347 Kbps
StreamSize : 11.2 KiB
Encoded date : UTC 2007-12-06 15:51:38
Tagged date : UTC 2007-12-06 15:51:38
Video #1
Codec : H.264
Codec/Info : H.264 (3GPP)
PlayTime : 33s 920ms
Bit rate : 314 Kbps
Width : 320 pixels
Height : 240 pixels
Aspect ratio : 4/3
Frame rate : 25.000 fps
Bits/(Pixel*Frame) : 0.160
StreamSize : 1.27 MiB
Encoded date : UTC 2007-12-06 15:51:38
Tagged date : UTC 2007-12-06 15:51:38
Audio #2
Codec : AAC LC-SBR
Codec/Info : AAC Low Complexity with Spectral Band Replication
PlayTime : 32s 415ms
Bit rate : 32 Kbps
Bit rate mode : VBR
Channel(s) : 2 channels
Sampling rate : 44 KHz
Resolution : 16 bits
StreamSize : 126 KiB
Encoded date : UTC 2007-12-06 15:51:38
Tagged date : UTC 2007-12-06 15:51:38

此视频在Flash Player 9.0.115中顺利播放,声音也没有问题。

研究一下视频和音频的组合

到了这里,就有一些问题了。H.264视频是否一定要搭配AAC音频呢?搭配MP3行么?我压缩了一个采用H.264视频编码,Mp3音频编码(采用LAME MP3)的影片,用终极解码播放正常,但是在Flash Player中,只有图像可以显示,却听不到声音。下面是这个文件的编码信息:

F:\Material\Flash Platform\Flash\Cases\播放H.264视频\333.mp4
General
Complete name : F:\Material\Flash Platform\Flash\Cases\播放H.264视频\333.mp4
Format : MPEG-4
Format/Info : ISO 14496-1 Base Media
Format/Family : MPEG-4
File size : 2.59 MiB
PlayTime : 33s 920ms
Bit rate : 641 Kbps
StreamSize : 13.9 KiB
Encoded date : UTC 2007-12-05 09:21:21
Tagged date : UTC 2007-12-05 09:21:21
Video #1
Codec : H.264
Codec/Info : H.264 (3GPP)
PlayTime : 33s 920ms
Bit rate : 516 Kbps
Width : 320 pixels
Height : 240 pixels
Aspect ratio : 4/3
Frame rate : 25.000 fps
Bits/(Pixel*Frame) : 0.260
StreamSize : 2.09 MiB
Encoded date : UTC 2007-12-05 09:21:21
Tagged date : UTC 2007-12-05 09:21:21
Audio #2
Codec : MPEG-1 Audio
PlayTime : 32s 365ms
Bit rate : 128 Kbps
Bit rate mode : CBR
Channel(s) : 2 channels
Sampling rate : 44 KHz
Resolution : 16 bits
StreamSize : 506 KiB
Encoded date : UTC 2007-12-05 09:21:21
Tagged date : UTC 2007-12-05 09:21:21

又测试了H.264+MP3用AVI封装和3GP封装,在Flash Player中都无法播放声音。看来只有H.264+AAC可以被Flash Player支持。封装可以使用3GP或者MP4,但不支持MKV封装。

关于封装容器和视频文件后缀

我们知道,我们不能仅仅从视频文件的扩展名判断文件的编码。因为很多扩展名是支持多种编码的。例如AVI就只是一种封装容器,它里面的视频和音频编码可以有很多种组合。可以是DivX,也可以是XviD,还可以是MPEG-1。下面的表格(表格来源,ZRong做部分调整)简单的描述了几种封装容器和视频、音频编码的对应情况:

封装容器 视频流编码格式 音频流编码格式 Flash Player是否支持
AVI Xvid MP3 不支持
AVI Divx MP3 不支持
MKV Xvid MP3 不支持
MKV Xvid AAC 不支持
MKV H.264 AAC 不支持
MP4 H.264 AAC 支持
3GP H.263 AAC 不支持
3GP H.264 AAC 支持
FLV Sorenson Spark MP3 支持
FLV On2 VP6 MP3 支持

从上表可以看出,要让Flash Player成功播放H.264视频,最好采用3GP或者MP4封装容器。

AAC编码的混乱情况

上面的压缩,AAC编码器使用的都是Nero Encoder,其中“规格”有这样几个选项:Auto、LC-AAC、LE-AAC和HE-AAC v2。经过测试,这几个规格压缩的音频都可以被Flash Player支持。

Nero Encoder的规格|
Nero Encoder的选项

如果采用CT AAC+编码器,选项就变成了下面这样,更加复杂了。经过测试,这几个选项的组合也都可以被Flash Player支持。不论选择MPEG-4 AAC还是MPEG-2 AAC,都没有问题。

h264ctaac
CT AAC+的选项

如果采用FAAC编码器,选项就变成了下面这样。经过测试,这几个选项的组合也都可以被Flash Player支持,MPEG版本的选择也没有关系。

h264faac
FAAC的选项

事实上,NERO Encoder和CT AAC+中的LC-AAC,就是FAAC中的Low Complexity(无长时预测的AAC);而NERO Encoder中的HE-AAC,就是CT AAC+中的aacPlus,它加了SBR(spectral band replication),HE代表high efficiency。这也是为什么前面压缩WMV视频的时候,选择的是HE-AAC编码,在编码之后的文件信息里面显示的却是下面这些内容的原因了:

Codec : AAC LC-SBR
Codec/Info : AAC Low Complexity with Spectral Band Replication

根据Adobe公布的信息,Flash Player支持这些AAC编码:AAC Main; AAC LC; SBR ,因此,我一般选择使用NERO Encoder的HE-AAC。

参考链接

  1. http://bbs.lmtw.com/dispbbs.asp?boardID=111&ID=141583&page=1
  2. http://mediacoder.sourceforge.net/index_zh.htm
  3. http://www.sxzkw.com/1Qm/MediaCoder_jiaocheng_cn.swf
  4. http://www.adobe.com/devnet/flashplayer/articles/http://www.adobe.com/devnet/flashplayer/articles/hd_video_flash_player.html
  5. http://tech.163.com/05/0624/11/1N0Q0HJ800091589.html
  6. http://kb.adobe.com/selfservice/viewContent.do?externalId=kb402866&sliceId=1