|
隨著HTML5的發(fā)展,今后會(huì)有越來(lái)越多的應(yīng)用程序基于HTML5開(kāi)發(fā),多媒體應(yīng)用程序也不例外,HTML5新增加的video/audio tag提供了在網(wǎng)頁(yè)中直接播放音視頻的能力而無(wú)需借助任何插件,因此可以用HTML5開(kāi)發(fā)一個(gè)媒體播放器,網(wǎng)上也已經(jīng)出現(xiàn)了不少HTML5播放器例如jPlayer。但目前各家瀏覽器支持的HTML5音視頻格式種類(lèi)很有限,比如IE9只支持H.264,F(xiàn)irefox只支持VP8和Theora。Google Chrome算是支持格式最全的,支持的視頻格式包括H.264、VP8、Theora,音頻包括Vorbis、MP3、AAC、WAV。這些格式對(duì)于播放網(wǎng)絡(luò)在線(xiàn)音視頻(不算flash)基本上足夠了,但如果我們想播放本地音視頻就會(huì)遇到很多不支持的格式,比如在中國(guó)很流行的rmvb視頻,高清影片最常見(jiàn)的mkv、avi格式,這些格式目前所有瀏覽器都不支持,僅僅從這一點(diǎn)來(lái)看,目前基于HTML5的播放器還不可能代替象QQ影音、射手播放器這樣的傳統(tǒng)播放器。 有沒(méi)有可能自己給瀏覽器增加支持更多的音視頻格式?分析Google開(kāi)源瀏覽器Chromium后得知它的音視頻解碼是由FFmpeg提供的(代碼在third_party\ffmpeg\),Chrome也是這樣,所以完全可以給Chrome增加支持更多種類(lèi)的音視頻格式。 Chrome中的媒體播放架構(gòu)如下圖所示:
其中Pipeline是Google給Chrome開(kāi)發(fā)的媒體框架引擎,HTML5 video/audio tag就是由這個(gè)引擎實(shí)現(xiàn)媒體播放的,F(xiàn)Fmpeg在其中提供demuxer和decoder,因此要增加支持音視頻格式主要修改FFmpeg就可以了。 從Chromium的源碼third_party\ffmpeg\chromium\config\Chrome\linux\ia32\config.h可以得知Chrome采用的FFmpeg的配置選項(xiàng),在原有的配置選項(xiàng)后面添加如下選項(xiàng):
用新的配置選項(xiàng)重新配置和編譯FFmpeg,用生成的3個(gè)動(dòng)態(tài)鏈接庫(kù)avcodec-54.dll、avformat-54.dll、avutil-51.dll替換掉Chrome里面原來(lái)的,要注意用來(lái)編譯FFmpeg的Chromium源碼的版本要跟Chrome差不多,相差太大的話(huà)替換庫(kù)后可能會(huì)造成Chrome無(wú)法正常運(yùn)行。在Windows上編譯FFmpeg的方法參見(jiàn)本人的另一篇文檔《在Windows上編譯Chromium中的FFmpeg》。 這樣修改FFmpeg后在Chrome中用HTML5 video/audio tag就可以播放更多格式的音視頻了,大部分常見(jiàn)的mkv、avi、flv、mov、amr都可以播放了。但是rmvb仍然無(wú)法播放,用Visual Studio 2010跟蹤后找到了原因,原來(lái)常見(jiàn)的rmvb電影視頻編碼是RV40,音頻編碼是COOK,這兩種codec類(lèi)型在Chrome中都未被定義,在解析rmvb的時(shí)候會(huì)認(rèn)為是未知的codec類(lèi)型(kUnknownVideoCodec和kUnknownAudioCodec),為此需要修改media\base\video_decoder_config.h和media\base\audio_decoder_config.h分別在里面的枚舉類(lèi)型VideoCodec和AudioCodec中增添這兩種格式,然后還要修改media\ffmpeg\ffmpeg_common.cc,具體修改方法就不贅述了,一看代碼就知道。這樣修改以后Chrome的媒體引擎就可以識(shí)別RV40和COOK這兩種格式了,常見(jiàn)的rmvb電影也可以播放了。 可見(jiàn)要讓Chrome能播放更多格式的音視頻其實(shí)不難,當(dāng)然目前只是第一步,還有不少問(wèn)題,比如播放rmvb電影時(shí)一拖動(dòng)進(jìn)度條屏幕顯示就亂了,要想把兼容性和穩(wěn)定性做好就要下更多功夫了。 |
|
|
來(lái)自: 昵稱(chēng)597197 > 《HTML5》