FFmpeg筆記-基本使用

FFmpeg是目前最牛逼的開源跨平臺音視頻處理工具。html

準備知識

我不是音視頻編解碼出身的,對於這一塊很是的不瞭解,致使在學習FFmpeg的時候雲裏霧裏的,因此學習以前最好看些資料對音視頻編解碼有點認識。html5

安裝

Windows和MacOS用戶能夠從Builds - Zeranoe FFmpeg下載編譯好的FFmpeg,解壓加入環境變量PATH便可使用。git

同時安裝包我上傳到百度雲中,還有一些測試用的視頻:
連接: https://pan.baidu.com/s/1nwLh4hF 密碼: v7ytgithub

播放視頻,FFplay

學習FFmpeg免不了要看效果,而windows的自帶播放器又垃圾得一匹,並且咱們會須要看視頻的元數據,看他的編碼,用通常的這播放器,能看可是不是很方便。其實FFmpeg自帶了一個播放器FFplay!web

FFplay是結合FFmpeg和SDL實現的一個簡易的跨平臺播放器。使用起來特別簡單:json

ffplay [選項] ['輸入文件']

並且控制檯會打印出視頻的各類信息,對於咱們查看視頻轉換結果很是有幫助。c#

file

FFplay具體文檔:segmentfault

獲取視頻信息,FFprobe

FFplay命令中會打印出視頻的元數據,那若是咱們只是想獲取這些數據而不想播放視頻呢?好比在程序中咱們想獲取視頻的時長,要用什麼命令?用FFprobe命令。windows

ffprobe [選項] ['輸入文件']

看輸出必定以爲很熟悉,由於和FFplay打印出的信息如出一轍:網絡

file

咱們還可使用一些參數:

  • -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命令的語法:

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

ffmepg支持多個輸入源(文件,管道,網絡流,採集設備),經過-i指定輸入。ffmpeg支持多個輸出,命令行中全部沒法被解析爲參數的字段都會被做爲輸出的url。

參數通常做用於且只做用於下一個指定的文件,因此參數的位置是很是重要的。因此全局生效的參數要在最前面。

ffmpeg命令完整的說明參考:

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筆記-基本使用 | 木杉的博客

相關文章
相關標籤/搜索