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的壓縮器自然是無法勝任了??墒蔷W上的視頻轉換工具多如牛毛,要找一款好用的真的很難。本著“免費、易用、專業、通吃”這四個標準,經過大量測試,終于找到一款優秀的國產編碼軟件MediaCoder(中文名:影音轉碼寶盒),以下是來自MediaCoder官方網站的介紹:
MediaCoder是一個免費的通用音頻/視頻批量轉碼工具,它將眾多來自開源社區的優秀音頻視頻編解碼器和工具整合為一個通用的解決方案,可以將音頻、視頻文件在各種格式之間進行轉換。
功能和特點
- 基于優秀的眾多的開源編解碼后臺,能夠解碼和編碼的格式多
- 極為豐富的可調整的編碼參數
- 全部編解碼器自帶,不依賴于系統的編解碼器和任何組件
- 良好的可擴展的程序架構,快速適應新的需求,不斷增加新的格式的支持
- 利用腳本語言擴展的界面,有支持眾多影音設備(如PSP、iPod)的專用界面
- 高性能,特別在雙核處理器上表現優異
典型應用
- 提高影音文件壓縮率,減小其文件尺寸
- 轉換至可在各種影音設備上播放的影音文件,如MP3播放器、MP4播放器、手機、PDA、VCD/DVD播放機
- 提取視頻文件中的音軌并轉換成MP3、AAC、WMA等音頻文件
- 修復和改善一些損壞的、部分下載的或質量不佳的影音文件
支持格式
- MP3, Vorbis, AAC, AAC+, AAC+v2, MusePack, Speex, AMR, WMA, RealAudio, mp3PRO*
- FLAC, WavPack, Monkey’s Audio, OptimFrog, AAC Lossless, WMA Lossless, WAV/PCM
- H.264, Xvid, MPEG 1/2/4, Theora, Flash Video, Dirac, 3ivx*, RealVideo*, Windows Media Video
- AVI, MPEG/VOB, Matroska, MP4, RealMedia*, ASF, Quicktime*, OGM*
- CD, VCD, DVD, CUE Sheet*
*僅支持輸入
編碼工具搞定,接著就可以“制作”影片了。
我采用的源片是著名的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視頻設置
HE-AAC音頻設置
視頻大小設置
將這三個設置調整好即可。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中都無法播放聲音??磥碇挥?a class="st_tag internal_tag" title="標簽 H.264 下的日志" >H.264+AAC可以被Flash Player支持。封裝可以使用3GP或者MP4,但不支持MKV封裝。
關于封裝容器和視頻文件后綴
我們知道,我們不能僅僅從視頻文件的擴展名判斷文件的編碼。因為很多擴展名是支持多種編碼的。例如AVI就只是一種封裝容器,它里面的視頻和音頻編碼可以有很多種組合??梢允荄ivX,也可以是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的選項
如果采用CT AAC+編碼器,選項就變成了下面這樣,更加復雜了。經過測試,這幾個選項的組合也都可以被Flash Player支持。不論選擇MPEG-4 AAC還是MPEG-2 AAC,都沒有問題。
CT AAC+的選項
如果采用FAAC編碼器,選項就變成了下面這樣。經過測試,這幾個選項的組合也都可以被Flash Player支持,MPEG版本的選擇也沒有關系。
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。
參考鏈接
- http://bbs.lmtw.com/dispbbs.asp?boardID=111&ID=141583&page=1
- http://mediacoder.sourceforge.net/index_zh.htm
- http://www.sxzkw.com/1Qm/MediaCoder_jiaocheng_cn.swf
- http://www.adobe.com/devnet/flashplayer/articles/http://www.adobe.com/devnet/flashplayer/articles/hd_video_flash_player.html
- http://tech.163.com/05/0624/11/1N0Q0HJ800091589.html
- http://kb.adobe.com/selfservice/viewContent.do?externalId=kb402866&sliceId=1