ffmpeg使用轉碼學習


ffmpeg在官網上描述自身:是一個對視頻和音頻進行記錄,轉換,流化的完整的跨平台解決方案。事實上,現在有很多工具都是基於ffmpeg來進行視頻音頻的處理工具的。比如鼎鼎大名的格式工廠,就是使用ffmpeg來作為內核的轉碼工具。

理解一些音視頻的編碼知識。

我們平時看的視頻文件格式:mp4/rmvb/mkv/avi其實是一個容器。這個容器中裝的東西分為兩大類:音頻和視頻。對於視頻這部分,它包含的編碼格式有:H264/H265/VP8/VC1等。對於音頻這個部分,它包含的編碼格式有:AAC/MP3/mid等。所以說,我們平常籠統說的【視頻格式】其實包含了三個部分:視頻編碼,音頻編碼,容器格式。這里說的【編碼】其實包含的是兩層:編碼和解碼。比如視頻編碼,就是將視頻圖像轉換成為二進制數據的過程。視頻解碼就是將二進制數據轉化成圖像的過程。音頻編碼也是一樣的。那么我們看一個視頻文件的時候,能同時看到聲音和圖像,就說明我們至少同時存在視頻編碼和音頻編碼兩組數據。那么這兩組數據是按照什么規則組織起來的呢?這就要看【容器格式】的規定了。容器里面存放的數據可能采用多種不同的編碼方式。比如avi文件存放的通常是xvid或者divx編碼的視頻和mp3編碼的音頻。rmvb 文件里面存放的通常是 RV40 編碼的視頻和 cook 編碼的音頻。mp4 文件里面通常存放的是 H.264 編碼的視頻和 AAC 編碼的音頻。mkv 文件里面存放的則可能包含前面各種。

如果你安裝了ffmpeg,你使用ffmpeg -codecs就可以看到ffmpeg支持的哪些音視頻編碼了(幾乎已經囊括了大部分現有編碼了)。截取其中的一部分:

Codecs:
D..... = Decoding supported (支持解碼)
.E.... = Encoding supported (支持編碼)
..V... = Video codec (視頻編碼)
..A... = Audio codec (音頻編碼)
..S... = Subtitle codec (字幕編碼)
...I.. = Intra frame-only codec (幀編解碼)
....L. = Lossy compression (有損壓縮的編碼)
.....S = Lossless compression (無損壓縮的編碼)
-------
D.V.L. 4xm                  4X Movie
D.VI.S 8bps                 QuickTime 8BPS video
.EVIL. a64_multi            Multicolor charset for Commodore 64 (encoders: a64multi )
.EVIL. a64_multi5           Multicolor charset for Commodore 64, extended with 5th color (colram) (encoders: a64multi5 )
D.V..S aasc                 Autodesk RLE
DEVIL. amv                  AMV Video
D.V.L. anm                  Deluxe Paint Animation
D.V.L. ansi                 ASCII/ANSI art

好了,那我們經常說的轉碼其實就是這么個過程:

原視頻 -- 解碼 -- 像素數據 -- 編碼 -- 目標視頻

原音頻 -- 解碼 -- 音頻數據 -- 編碼 -- 目標音頻

我們使用aac轉mp3的例子來看ffmpeg在音頻轉碼方面的使用。

aac名字就很高大上,高級音頻編碼,出現於1997年,出現的目的是為了取代MP3格式。相比於MP3格式來說,它的壓縮算法更優秀,是一種高壓縮比的編碼。它是蘋果和諾基亞等公司共同開發的,現在蘋果手機上的itunes音樂播放器都是支持和使用AAC文件的。

但是,aac格式的音頻文件在html5中不是可以被所有的瀏覽器所支持的。瀏覽器對音頻文件的支持如下:

Image

再回到ffmpeg工具,它的格式是這樣的:

usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

所以假設我有個aac文件在這個位置:

/home/web/mycareer/upload/61/1d0452670723c3ba2e1b10d02d789c61.aac

我需要將它轉換成mp3文件:

/home/web/mycareer/upload/61/1d0452670723c3ba2e1b10d02d789c61.mp3

音頻的參數有這么幾個:http://ffmpeg.org/ffmpeg.html#Audio-Options

首先ffmpeg自身有帶aac的解碼器,但是沒有帶mp3的編碼器,需要編譯的時候帶上--enable-libmp3lame

當然這個需要你先安裝libmp3lame

curl -L -O http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz

tar xzvf lame-3.99.5.tar.gz

make

make install

然后在ffmpeg編譯安裝的時候帶上:--enable-libmp3lame

然后ffmpeg的命令就是:

ffmpeg -i /home/web/mycareer/upload/61/1d0452670723c3ba2e1b10d02d789c61.aac -acodec libmp3lame  /home/web/mycareer/upload/61/1d0452670723c3ba2e1b10d02d789c61.mp3

記得這里要說明下-acodec libmp3lame

轉碼就完成了。

參考文章:

http://apple4us.com/2011/01/html5-video-war-part-1.html

http://blog.csdn.net/leixiaohua1020/article/details/11842919

http://blog.csdn.net/axdc_qa_team/article/details/4204358


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM