关于FFmpeg VMAF 的一些记录
一、FFmpeg的一些介紹
具體可參照FFmpeg的百度百科、FFmpeg官網
多媒體視頻處理工具FFmpeg有非常強大的功能包括視頻采集功能、視頻格式轉換、視頻抓圖、給視頻加水印等。
它包含可以由應用程序使用的libavcodec,libavutil,libavformat,libavfilter,libavdevice,libswscale和libswresample。與ffmpeg,ffplay和ffprobe一樣,最終用戶也可以使用它們進行轉碼和播放。
FFmpeg工程主要包括三個exe文件:
? ffmpeg.exe 進行格式轉換
? ffplay.exe 當作播放器用,能播放各種格式的音視頻
? ffprobe.exe 查看音視頻文件格式詳細信息
二、圖像質量評估
圖像質量評估:利用計算機程序將目標圖像和參考圖像進行對比,得出的對目標圖像壓縮與處理系統優劣客觀的、自動的評價。
關于圖像質量評估的一些評價方法,主要有PSNR、SSIM、VMAF三種方法。
客觀評價指標分為三類:基于誤差的評價指標、基于感知模型與圖像結構信息的評價指標以及基于機器學習的評價指標。
基于誤差評價指標是將壓縮圖像和原始圖像進行對比,計算兩個圖像之間的差異(稱為噪聲或誤差),代表指標是均方誤差(Mean square error, MSE)、峰值信噪比(Peak signal noise ratio, PSNR)。
基于感知模型與圖像結構評價指標通過引入人類視覺系統模型(Human Visual System, HVS)將圖像質量下降轉化為感知結構信息的變化和一些感知現象(亮度、對比度、觀看距離)的變化,對人類如何感知這些誤差進行數學建模,代表指標是結構相似度(Structure similarity Index, SSIM)、恰可識別閾值(Just Noticeable Difference, JND)。
基于機器學習的評價指標一般用來度量長時間視頻,從某個可訓練的模型開始,將基于誤差評價指標或基于感知評價指標結果與主觀MOS分數進行比較,并對模型進行微調以使其隨時間推移而改善,或是多種評價指標體系的融合,這些多種指標包括度量圖像質量的指標和度量時間質量的指標,基于機器學習的評價指標有代表性的指標是視頻多評估方法融合(Visual Multimethod Assessment Fusion, VMAF)。
關于圖像質量評估,詳細的介紹可參考該知乎分享:視頻/圖像質量評價綜述
具體的一些區別簡單整理如下圖:
三、下載FFmpeg
可以從官網直接進行下載FFmpeg官網,下載后解壓,配置好環境變量就可以直接用了。
不過我并沒有特意去配置環境變量,是直接在static\bin的目錄下運行cmd命令提示符窗口,運行命令的時候直接輸入對應的exe文件就可以了。比如使用ffplay播放視頻,他的命令格式是
ffplay [options] [input_url]我使用的時候就輸入ffplay.exe?[options] [input_url]就可以了。(就是寫明使用的exe文件就好了)
四、FFmpeg的使用
存在問題:VMAF主要問題是其結果非絕對指標,不同視頻、不同分辨率的VMAF得分不能直接比較。
ffmpeg是一個非常快速的視頻和音頻轉換器,也可以從實時音頻/視頻源中獲取。它還可以在任意采樣率之間轉換,并使用高質量的多相濾波器即時調整視頻大小。
FFmpeg的命令語句格式
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...(如果沒有配置環境變量,記得需要在static\bin目錄下進入cmd窗口哦,再將ffmepg寫明成ffmpeg.exe)
關于ffmpeg的一些命令說明:
- ffmpeg從該選項指定的任意數量的輸入“文件”(可以是常規文件,管道,網絡流,抓取設備等)中讀取-i,并寫入任意數量的由以下選項指定?的輸出“文件”一個普通的輸出網址。在命令行上找到的所有不能解釋為選項的內容都被視為輸出URL。
- 通常,選項將應用于下一個指定的文件。因此,順序很重要,您可以在命令行上多次使用相同的選項。然后,將每次出現都應用于下一個輸入或輸出文件。此規則的例外是全局選項(例如,詳細級別),應首先指定。
- 要在選項中引用輸入文件,必須使用它們的索引(從0開始)。例如,第一個輸入文件為0,第二個輸入文件為,1等等。類似地,文件中的流由它們的索引引用。例如,2:3引用第三輸入文件中的第四流。
1、查看視頻文件參數值
使用ffmpeg -i input_url?可以查看一下這個視頻文件的一些參數值,如幀率、碼率、編碼格式、分辨率;但是ffmpeg也會提示你,At least one output file must be specified(必須至少指定一個輸出文件),所以這種方式還是不推薦。
ffmpeg -i input_url 例如: ffmpeg.exe -i demo\60fps_8M_h264.avi命令輸入結果如下:
2、轉換音視頻文件(缺省情況下,ffmpeg試圖盡可能的無損轉換,采用與輸入同樣的音頻視頻參數來輸出。)
ffmpeg [options] -i input_url [options] output.url 例如: ffmpeg.exe -i demo\60fps_8M_h264.avi demo\60fps_8M_h264.mp4上述的命令中,demo是一個目錄名
由于ffmpeg是逐幀進行轉換,所以需要的時間也比較長(轉換期間占用的CPU也會比較高),耐心等待轉換完成就好,然后你就可以在指定目錄下看到轉換好的文件了。(比如說我這個視頻文件是3分鐘的視頻,60FPS的幀率,所以總共的幀數應該是在10800左右)
轉換完成
3、ffmpeg的一些常用參數命令
- -f 強制輸入或輸出文件格式。通常會自動為輸入文件檢測格式,并從輸出文件的文件擴展名中猜測該格式,因此大多數情況下不需要此選項
- -y 覆蓋輸出文件而無需詢問
- -n 不要覆蓋輸出文件,如果指定的輸出文件已經存在,請立即退出
- -b 設置比特率,缺省200kb/s
- -s 設置幀大小,格式為WXH 缺省160*128
- -bufsize 設置碼率控制緩沖區大小
- -r?設置幀率
- -psnr? ?計算壓縮幀的PSNR
關于FFmpeg詳細的參數說明,可參考該篇博客:FFmpeg參數中文詳細解釋,或是可以直接從FFmpeg官網上查看
缺省情況下,ffmpeg試圖盡可能的無損轉換,采用與輸入同樣的音頻視頻參數來輸出。如果想要進行碼率的調整或是幀率的調整,可以通過以下命令語句來實現:
注:以下命令中input_url均指代輸入文件,output_url均指代輸出文件覆蓋輸出文件且不提示: ffmpeg -i input_url -y output_url設置幀率為30: ffmpeg –i input_url –r 30 output_url設置音頻碼率為128k、視頻碼率為1500kbps: ffmpeg -i input_url -b:a 128k -b:v 1500k output_url (音頻:-b:a 、視頻:-b:v )使用libx264編碼所有視頻流,并復制所有音頻流: ffmpeg -i input_url -map 0 -c:v libx264 -c:a copy output_url使用265編碼,并降低碼率為2000kbps: ffmpeg -i input_url -b:v 2000k -vcodec libx265 output_url -bufsize 用于設置碼率控制緩沖器的大小,設置的好處是,讓整體的碼率更趨近于希望的值,減少波動 ffmpeg -i input.url -b:v 2000k -bufsize 2000k output.url 截取視頻(從開始位置截取到30秒的視頻) ffmpeg -i input_url -vcodec copy -acodec copy -ss 00:00:00 -t 30 output_url (其中,00:00:00是要截取視頻的起始時間,30是要截取視頻的持續時間長度)這篇博客針對上述的具體參數也講解得比較詳細:FFmpeg使用基礎、總結 視頻質量評價技術零基礎學習方法
4、使用ffmpeg VMAF 進行評分
關于VMAF的一些介紹:Netflix: VMAF 視頻質量評價工具簡介、Netflix VMAF 視頻質量評估工具概述
簡單的一個命令格式如下(個人常用)
ffmpeg.exe -i input1_url -i input2_url -lavfi libvmaf="model_path=vmaf_v0.6.1.pkl:log_path=VMAF.txt" -report -f null -參數說明:
model_path、log_path的參數值都在static\bin目錄下(即ffmpeg同級目錄下),Model?中,vmaf_v0.6.1.pkl適用于1080P分辨率的視頻,vmaf_4k_v0.6.1.pkl適用于4K分辨率的視頻。
該條命令語句會在bin文件下生成日志文件,大概的明明格式和位置如下:
VMAF詳細的使用說明:
具體的可參考FFmpeg使用libvmaf交叉評估筆記、
Usage: vmafossexec fmt width height ref_path dis_path model_path [--log log_path] [--log-fmt log_fmt] [--thread n_thread] [--subsample n_subsample] [--disable-clip] [--disable-avx] [--psnr] [--ssim] [--ms-ssim] [--phone-model] [--ci] fmt: yuv420p yuv422p yuv444p yuv420p10le yuv422p10le yuv444p10le log_fmt: xml (default) json n_thread: maximum threads to use (default 0 - use all threads) n_subsample: n indicates computing on one of every n frames (default 1)還是剛剛那個avi格式的視頻文件,我們將其轉碼成了mp4格式,評分命令在最下方已經寫明了,前面寫的是avi格式的,后面寫的是mp4格式的,評分為38分左右。
說明:
1、交換前后兩個輸入文件,對評分會有一定影響
2、評分的時候依舊是逐幀進行比較的,所以耗費的時間長,占用的CPU也比較高
或許你會覺得轉碼過后啥也沒干咋就評分這么低呢?
emmm,關于這一點,我也沒有太弄懂,不過后面又嘗試將avi格式轉碼成了mkv格式,再使用avi和mkv兩個視頻文件來進行評分,評分結果高達99。
(avi和mkv也評分過了,依舊只有38分的樣子。目前還在找原因,莫不是因為他們讀流的方式不一樣,所以兩個視頻比較的幀數不同?如果有知道的同學,歡迎指出)
總結
以上是生活随笔為你收集整理的关于FFmpeg VMAF 的一些记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java当中jvm运行时区域新生代、老年
- 下一篇: 简单易用的AI桌面工具系列 - 图片无损