FFmpeg筆記-基本使用


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

准備知識

我不是音視頻編解碼出身的,對於這一塊非常的不了解,導致在學習FFmpeg的時候雲里霧里的,所以學習之前最好看些資料對音視頻編解碼有點認識。

安裝

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

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

播放視頻,FFplay

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

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

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

而且控制台會打印出視頻的各種信息,對於我們查看視頻轉換結果非常有幫助。

file

FFplay具體文檔:

獲取視頻信息,FFprobe

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

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


免責聲明!

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



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