FFmpeg是目前最牛逼的開源跨平臺音視頻處理工具。html
我不是音視頻編解碼出身的,對於這一塊很是的不瞭解,致使在學習FFmpeg的時候雲裏霧裏的,因此學習以前最好看些資料對音視頻編解碼有點認識。html5
Windows和MacOS用戶能夠從Builds - Zeranoe FFmpeg下載編譯好的FFmpeg,解壓加入環境變量PATH便可使用。git
同時安裝包我上傳到百度雲中,還有一些測試用的視頻:
連接: https://pan.baidu.com/s/1nwLh4hF 密碼: v7ytgithub
學習FFmpeg免不了要看效果,而windows的自帶播放器又垃圾得一匹,並且咱們會須要看視頻的元數據,看他的編碼,用通常的這播放器,能看可是不是很方便。其實FFmpeg自帶了一個播放器FFplay!web
FFplay是結合FFmpeg和SDL實現的一個簡易的跨平臺播放器。使用起來特別簡單:json
ffplay [選項] ['輸入文件']
並且控制檯會打印出視頻的各類信息,對於咱們查看視頻轉換結果很是有幫助。c#
FFplay具體文檔:segmentfault
FFplay命令中會打印出視頻的元數據,那若是咱們只是想獲取這些數據而不想播放視頻呢?好比在程序中咱們想獲取視頻的時長,要用什麼命令?用FFprobe命令。windows
ffprobe [選項] ['輸入文件']
看輸出必定以爲很熟悉,由於和FFplay打印出的信息如出一轍:網絡
咱們還可使用一些參數:
-v quiet
:不打印日誌,這樣默認的輸出就不會顯示了,就不會干擾咱們想要輸出的信息-print_format json
:用JSON格式打印出信息。還支持xml,csv,flat,ini格式-show_format
:打印出輸入的格式信息-show_streams
:打印出每一個流的信息默認的輸出是比較簡略的,咱們可使用-show_format
和-show_streams
打印出咱們想要的詳細信息,好比:
ffprobe -v quiet -show_format -print_format json res\BCSPA039_pre.mp4
![Uploading file...]()
而後咱們程序讀取解析json,獲取duration字段就是視頻的時長。
ffmpeg命令的語法:
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
ffmepg支持多個輸入源(文件,管道,網絡流,採集設備),經過-i
指定輸入。ffmpeg支持多個輸出,命令行中全部沒法被解析爲參數的字段都會被做爲輸出的url。
參數通常做用於且只做用於下一個指定的文件,因此參數的位置是很是重要的。因此全局生效的參數要在最前面。
ffmpeg命令完整的說明參考:
ffmpeg的參數太多了,咱們仍是經過經常使用命令來學習會比較好。
ffmpeg -i input_file -vcodec copy -an output_file_video //只輸出視頻 ffmpeg -i input_file -acodec copy -vn output_file_audio //分輸出音頻
參數解釋:
-i
:指定輸入文件-vcodec
:指定視頻編碼器,這裏指定copy是一個特殊值,表示複製輸入的視頻流到輸出不作更改-an
:關閉音頻輸出-vn
:關閉視頻輸出ffmpeg -i input_file output_file
這是最簡單的視頻轉碼命令,ffmpeg會從input的內容推測格式,從output_file的後綴名推測格式,而後進行轉碼輸出。
來看一個我在工做中接觸的比較複雜的視頻轉碼命令:
ffmpeg -i "#src#" -y -s 1920x1080 -vcodec libx264 -c:a libvo_aacenc -b:a 48k -ar 44100 -ac 2 -qscale 4 -f #targetFmt# -movflags faststart -map 0:v:0 -map 0:a? "#destDir#/1080p/#fileNameNoEx#.mp4"
參數解釋:
-y
:覆蓋輸出文件-s 1920x1080
:設置幀的大小,也就是視頻分辨率,格式爲WxH
-vcodec libx264
:設置視頻編碼器,-codec:v libx264
是另一種寫法-c:a libvo_aacenc
:設置音頻編碼器-b:a 48k
:設置音頻的比特率-ar 44100
:設置音頻採樣率爲44100-ac 2
:設置聲道數-f #targetFmt#
:設定輸出的格式。若是不指定,則會輸入文件從內容中推測,輸出文件經過後綴名推測。-movflags faststart
:把MOV/MP4文件的索引信息放到文件前面以支持邊下邊播-map 0:v:0
:選擇輸入文件的第一個視頻流輸出-map 0:a?
:選擇輸入文件的音頻流輸出,若是沒有不報錯qscale <數值>
以<數值>質量爲基礎的VBR,取值0.01-255,越小質量越好在mp4轉ogv的時候,若是沒有指定-qscale 4
,轉出來的視頻畫面比較差,有不少噪點,並且有卡頓。
指定時間截取一幀做爲輸出:
ffmpeg -i input.flv -ss 00:00:14.435 -vframes 1 out.png
參數解釋:
-ss
:若是做用於輸入文件表示seek輸入文件到這個位置,可是不少格式不支持seek的,因此只能作個大概。若是做用於輸出文件,則輸入會被解碼,可是指定時間以前的數據都會被忽略。這裏是做用於輸出文件,因此至關於00:00:14.435以前的內容都被忽略了-vframes 1
:指定輸出多少幀,這裏就輸出一幀。-vframes
是-frames:v
的別名。每隔一段時間截一張圖:
# 每一秒輸出一幀圖像爲圖片, 圖片命名爲 out1.png, out2.png, out3.png,依次順序輸出: ffmpeg -i input.flv -vf fps=1 out%d.png # 每一分鐘截一次圖, 命名 img001.jpg, img002.jpg, img003.jpg, 依次順序遞增: ffmpeg -i myvideo.avi -vf fps=1/60 img%03d.jpg # 每十分鐘輸出一張圖片: ffmpeg -i test.flv -vf fps=1/600 thumb%04d.bmp
參數解釋:
-vf fps=1
:設置視頻的filter爲fps。後面參數表示一秒幾幀。這裏設置爲1,表示一秒一幀。-vf
是-filter:v
的別名out%d.png
:輸出多個圖片,%d
佔位符表示數字,從1開始。還可使用%2d
指定固定兩位fps過濾器的文檔:fps Documentation
在學習ffmpeg的過程當中,閱讀了幾篇很是好的博客,而後發現做者都是雷霄驊。沒想到他居然在2016年的時候去世了。唉,又是一個業內悲劇,並且他居然是在大學裏猝死的,真的是太拼了。努力雖好,也得注意身體啊。
這裏引用如何看待雷霄驊之死?裏的一句話
天妒英才,不誇張的說,若是不知道雷霄驊,可能你音視頻還沒入門
的確,他的文章對我入門使用ffmpeg起了很大的幫助。謝謝雷神,一路走好。
網上隨便找的能下載到小容量視頻而且多種格式的網站:
本文獨立博客地址:FFmpeg筆記-基本使用 | 木杉的博客