最近在下載下傳直播視訊時,大器發現下載下傳的視訊是FLV格式,在快進或者拖動播放進度條時,視訊圖像會卡住不動很長時間,極大影響觀看體驗。解決FLV播放問題的方法是将FLV轉換為大部分裝置都支援的MP4格式。雖然本文是以FLV轉MP4為例,但同樣适用于其他類型視訊檔案的轉換,包括WebM、AVI和WMV。
編碼簡介
FLV格式釋出于2002年,一經推出便迅速成為了網頁預設的視訊格式,是第一個在網際網路上被廣泛使用的視訊格式。
随着移動裝置成為網際網路的主力軍,HTML5取代了大多數網頁中的Flash,MP4取代了FLV容器,MP4成為視訊的事實标準。由于FLV檔案隻能在基于Flash的視訊播放器中播放,Flash被淘汰後,FLV檔案要想在移動裝置或者不帶Flash的浏覽器中播放的話,需要将FLV轉為MP4格式。
要對視訊進行格式轉換有非常多的工具,比較常用的是格式工廠(FormatFactory),但絕大部分工具都基于FFmpeg或者使用了FFmpeg的編解碼庫。直接使用FFmpeg可以更靈活地實作我們的需求。
在使用FFmpeg工具前需要先下載下傳并在電腦中配置好,具體操作方法可以檢視大器之前的文章《FFmpeg安裝配置指南》。
目前常見的MP4檔案的視訊和音頻編碼方式分别為H.264和AAC。H.264與MPEG-2和MPEG-4編碼相比,在同等圖像品質條件下壓縮率更高,還能提供連續、流暢的高品質圖像(相當于DVD品質)。AAC編碼能夠保證完美的音質,極高的壓縮比。AAC與MP3相比,增加了對立體聲的完美再現、降噪等特性,再現CD的音質。
FLV容器可以存儲多種視訊和音頻編碼,視訊編碼主要有Sorenson Spark、VP6、H.264,音頻編碼主要有Nellymoser Asao、Speex、MP3。可以通過以下指令檢視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, progressive), 720x1280, 2000 kb/s, 15 fps, 15 tbr, 1k tbn
編碼轉換
實際上編碼轉換可以隻用下面的第四種指令,但是對相同編碼的流重新編碼會損失資料,并且花費更長的時間。根據FLV源檔案的編碼格式,FLV轉MP4可分為以下四種情況:
1. H.264視訊編碼和AAC音頻編碼
如果FLV檔案的編碼分别為H.264和AAC,直接将視訊和音頻流複制到MP4即可。此指令僅僅改變資料流的容器而無需重新編碼,視訊和音頻品質相同,檔案大小基本保持不變,并且處理速度最快。
ffmpeg -i video.flv -codec copy video.mp4
2. H.264視訊編碼和非AAC音頻編碼
直接複制視訊流,音頻流會自動按MP4的标準重新編碼。此指令會對音頻品質造成損失,檔案大小可能有一些差異,處理速度一般。
ffmpeg -i video.flv -vcodec copy video.mp4
對于音頻流可以使用-ar指定采樣率(kHz),-ac指定聲道數量(1:單聲道,2:雙聲道)
ffmpeg -i video.flv -ar 44100 -ac 2 -vcodec copy video.mp4
3. 非H.264視訊編碼和AAC音頻編碼
直接複制音頻流,視訊流會自動按MP4的标準重新編碼。此指令會對視訊品質造成損失,檔案大小可能有較大差異,處理速度較慢。實際上這種規格的檔案是非常罕見的。
ffmpeg -i video.flv -acodec copy video.mp4
4. 非H.264視訊編碼和非AAC音頻編碼
如果FLV檔案的視訊編碼不是H.264并且音頻編碼不是AAC,那麼視訊和音頻需要按MP4的标準重新編碼。此指令會對視訊和音頻品質造成損失,檔案大小可能有很大差異,處理速度最慢。
ffmpeg -i video.flv video.mp4
了解FFmpeg的輸出資訊
FFmpeg在運作過程中會輸出以下資訊:
- FFmpeg的版本号和詳細的建構指令
- 輸入流的資訊 (類型,碼率,幀率,采樣率,聲道數)
- 輸出流的資訊
- 輸入輸出流的對應關系 (複制和轉碼的情況)
- 轉換的統計資料 (時間,碼率等)
我是大器,正在建立自己的知識庫,并将這些經驗分享給你,請關注我,一起交流學習。