最近在下載直播視頻時(shí),大器發(fā)現(xiàn)下載的視頻是FLV格式疯攒,在快進(jìn)或者拖動(dòng)播放進(jìn)度條時(shí)嗦随,視頻圖像會(huì)卡住不動(dòng)很長(zhǎng)時(shí)間,極大影響觀看體驗(yàn)敬尺。解決FLV播放問(wèn)題的方法是將FLV轉(zhuǎn)換為大部分設(shè)備都支持的MP4格式枚尼。雖然本文是以FLV轉(zhuǎn)MP4為例,但同樣適用于其他類型視頻文件的轉(zhuǎn)換砂吞,包括WebM署恍、AVI和WMV。
編碼簡(jiǎn)介
FLV格式發(fā)布于2002年蜻直,一經(jīng)推出便迅速成為了網(wǎng)頁(yè)默認(rèn)的視頻格式锭汛,是第一個(gè)在互聯(lián)網(wǎng)上被廣泛使用的視頻格式。
隨著移動(dòng)設(shè)備成為互聯(lián)網(wǎng)的主力軍袭蝗,HTML5取代了大多數(shù)網(wǎng)頁(yè)中的Flash唤殴,MP4取代了FLV容器,MP4成為視頻的事實(shí)標(biāo)準(zhǔn)到腥。由于FLV文件只能在基于Flash的視頻播放器中播放朵逝,F(xiàn)lash被淘汰后,F(xiàn)LV文件要想在移動(dòng)設(shè)備或者不帶Flash的瀏覽器中播放的話乡范,需要將FLV轉(zhuǎn)為MP4格式配名。
要對(duì)視頻進(jìn)行格式轉(zhuǎn)換有非常多的工具,比較常用的是格式工廠(FormatFactory)晋辆,但絕大部分工具都基于FFmpeg或者使用了FFmpeg的編解碼庫(kù)渠脉。直接使用FFmpeg可以更靈活地實(shí)現(xiàn)我們的需求。
在使用FFmpeg工具前需要先下載并在電腦中配置好瓶佳,具體操作方法可以查看大器之前的文章《FFmpeg安裝配置指南》芋膘。
目前常見(jiàn)的MP4文件的視頻和音頻編碼方式分別為H.264和AAC。H.264與MPEG-2和MPEG-4編碼相比霸饲,在同等圖像質(zhì)量條件下壓縮率更高为朋,還能提供連續(xù)、流暢的高質(zhì)量圖像(相當(dāng)于DVD質(zhì)量)厚脉。AAC編碼能夠保證完美的音質(zhì)习寸,極高的壓縮比。AAC與MP3相比傻工,增加了對(duì)立體聲的完美再現(xiàn)霞溪、降噪等特性孵滞,再現(xiàn)CD的音質(zhì)。
FLV容器可以存儲(chǔ)多種視頻和音頻編碼鸯匹,視頻編碼主要有Sorenson Spark坊饶、VP6、H.264忽你,音頻編碼主要有Nellymoser Asao幼东、Speex、MP3科雳「罚可以通過(guò)以下命令查看FLV文件的視頻和音頻編碼:
ffmpeg -i video.flv
然后可以在輸出信息中找到以下信息:
Input #0, flv, from 'video.flv':
Duration: 02:02:07.46, start: 3758.107000, bitrate: 1007 kb/s
Stream #0:0: Audio: aac (HE-AAC), 44100 Hz, stereo, fltp
Stream #0:1: Video: h264 (High), yuv420p(tv, smpte170m/unknown/unknown, progressive), 720x1280, 2000 kb/s, 15 fps, 15 tbr, 1k tbn
編碼轉(zhuǎn)換
實(shí)際上編碼轉(zhuǎn)換可以只用下面的第四種命令,但是對(duì)相同編碼的流重新編碼會(huì)損失數(shù)據(jù)糟秘,并且花費(fèi)更長(zhǎng)的時(shí)間简逮。根據(jù)FLV源文件的編碼格式,F(xiàn)LV轉(zhuǎn)MP4可分為以下四種情況:
1. H.264視頻編碼和AAC音頻編碼
如果FLV文件的編碼分別為H.264和AAC尿赚,直接將視頻和音頻流復(fù)制到MP4即可散庶。此命令僅僅改變數(shù)據(jù)流的容器而無(wú)需重新編碼,視頻和音頻質(zhì)量相同凌净,文件大小基本保持不變悲龟,并且處理速度最快。
ffmpeg -i video.flv -codec copy video.mp4
2. H.264視頻編碼和非AAC音頻編碼
直接復(fù)制視頻流冰寻,音頻流會(huì)自動(dòng)按MP4的標(biāo)準(zhǔn)重新編碼须教。此命令會(huì)對(duì)音頻質(zhì)量造成損失,文件大小可能有一些差異斩芭,處理速度一般轻腺。
ffmpeg -i video.flv -vcodec copy video.mp4
對(duì)于音頻流可以使用-ar
指定采樣率(kHz),-ac
指定聲道數(shù)量(1:單聲道划乖,2:雙聲道)
ffmpeg -i video.flv -ar 44100 -ac 2 -vcodec copy video.mp4
3. 非H.264視頻編碼和AAC音頻編碼
直接復(fù)制音頻流贬养,視頻流會(huì)自動(dòng)按MP4的標(biāo)準(zhǔn)重新編碼。此命令會(huì)對(duì)視頻質(zhì)量造成損失琴庵,文件大小可能有較大差異误算,處理速度較慢。實(shí)際上這種規(guī)格的文件是非常罕見(jiàn)的细卧。
ffmpeg -i video.flv -acodec copy video.mp4
4. 非H.264視頻編碼和非AAC音頻編碼
如果FLV文件的視頻編碼不是H.264并且音頻編碼不是AAC尉桩,那么視頻和音頻需要按MP4的標(biāo)準(zhǔn)重新編碼。此命令會(huì)對(duì)視頻和音頻質(zhì)量造成損失贪庙,文件大小可能有很大差異,處理速度最慢翰苫。
ffmpeg -i video.flv video.mp4
MOOV放到文件開(kāi)頭
所有的MP4文件都包含MOOV元數(shù)據(jù)止邮。MOOV中記錄了視頻的時(shí)長(zhǎng)和可用音軌的信息这橙,在播放時(shí)可以作為視頻數(shù)據(jù)的索引。
FFmpeg默認(rèn)是將MOOV放在MP4文件的末尾导披。如果是在網(wǎng)頁(yè)中打開(kāi)視頻屈扎,瀏覽器需要下載完整個(gè)文件后才能播放。因此為了節(jié)省網(wǎng)絡(luò)帶寬和加速視頻播放撩匕,有必要將MOOV放在MP4文件的開(kāi)頭鹰晨,使用-movflags faststart
選項(xiàng)即可。
ffmpeg -i video.flv -movflags faststart video.mp4
了解FFmpeg的輸出信息
FFmpeg在運(yùn)行過(guò)程中會(huì)輸出以下信息:
- FFmpeg的版本號(hào)和詳細(xì)的構(gòu)建命令
- 輸入流的信息 (類型止毕,碼率模蜡,幀率,采樣率扁凛,聲道數(shù))
- 輸出流的信息
- 輸入輸出流的對(duì)應(yīng)關(guān)系 (復(fù)制和轉(zhuǎn)碼的情況)
- 轉(zhuǎn)換的統(tǒng)計(jì)數(shù)據(jù) (時(shí)間忍疾,碼率等)
我是大器,正在建立自己的知識(shí)庫(kù)谨朝,并將這些經(jīng)驗(yàn)分享給你卤妒,請(qǐng)關(guān)注我,一起交流學(xué)習(xí)字币。