今年二月Zeranoe大神宣布他的版本的ffmpeg原生支援 h.264/AVC 10bit和 h.265/HEVC 10bit編碼
ffmpeg是一款文字介面的多功能軟體,這裡不贅述
而現在逐漸崛起(會重蹈3D影像覆轍嗎?)的HDR高動態影音已經將10位元設定為基本要求
現在有三大影音格式支援HDR,分別是開源的VP9和授權的h.264和h.265
文獻上說10位元可以達到市面上8位元的四倍精細度,或且更高的壓縮比
總之,畫質會比較好吧
這裡整理一些我常用的指令(適合進階使用者參考)
一、比對畫質
ffmpeg -i [操作組影片] -i [對照組影片] -lavfi psnr=stats_file=psnr.log -f null -
move psnr.log [統計檔]
[對照組影片]通常是原始沒有更動過的影片,也通常是畫質最好的。
[操作組影片]通常是編碼過的影片。
-lavfi psnr表示採用PSNR衡量畫質損失,SSIM或許是另一個常見的,但比較複雜
stats_file是將結果輸出成文字檔案
-f null -表示不需要編碼
move 具有搬移和更改檔案名稱功能
範例
ffmpeg -i "C:\video.mp4" -i "C:\raw.mp4" -lavfi psnr=stats_file=psnr.log -f null -
move psnr.log "C:\psnr.csv"
二、計算影格數
ffprobe [影片] -select_streams v:0 -show_entries stream=nb_frames
-select_streams v:0選取第幾個影像,惟一/第一個預設從0開始
-show_entries是將結果顯示在指令程式內
stream是指定哪個屬性,nb_frames為計算出來的總共的影格數目
有時候剪輯後會少會多一兩個影格,就會利用這個指令檢查
範例
ffprobe "C:\video.mp4" -select_streams v:0 -show_entries stream=nb_frames
重頭戲來了
三、編碼為10-bit h.265/HEVC
ffmpeg -i [輸入影片] -c:v libx265 -pix_fmt yuv420p10le -c:a copy [輸出影片]
-c:v libx265表示呼叫x265編碼成h.265格式
-pix_fmt指定顏色格式,yuv420p10le就是常見的YCbCr 4:2:0 10位元
-c:a copy是無損音訊,因為ffmpeg內建的非常非常低劣,不建議為了編碼而犧牲音質
^^^^動詞
範例
ffmpeg -i "C:\in.mp4" -c:v libx265 -pix_fmt yuv420p10le -c:a copy "C:\out.mp4"
四、編碼為10-bit h.264/AVC
ffmpeg -i [輸入影片] -c:v libx264 -pix_fmt yuv420p10le -c:a copy [輸出影片]
同上,只是改呼叫x264編碼成h.264格式
範例
ffmpeg -i "C:\in.mp4" -c:v libx264 -pix_fmt yuv420p10le -c:a copy "C:\out.mp4"
剪輯需求
五、無損影片切片段,指定間隔
ffmpeg -i [輸入影片] -map 0 -c copy -f segment -segment_time [秒數] -reset_timestamps 1 [輸出路徑]
-c copy表示完全複製影像和音訊
-f segment進行切割指令
-segment_time指定切割秒數,會從關鍵影格裁切比較適用目標影片是h.264格式的
-reset_timestamps 1令時間起訂重設為真
範例
ffmpeg -i "C:\in.mp4" -map 0 -c copy -f segment -segment_time 30 -reset_timestamps 1 "C:\outd.mp4"
六、無損影片切片段,指定區間
ffmpeg -i [輸入影片] -map 0 -c copy -f segment -segment_times [秒數] -reset_timestamps 1 [輸出路徑]
-segment_times指定切割時間點,會從關鍵影格裁切比較適用目標影片是h.264格式的
範例
ffmpeg -i "C:\in.mp4" -map 0 -c copy -f segment -segment_times 10,20,25 -reset_timestamps 1 "C:\outd.mp4"
七、擷取原始影像,mp4 -> yuv
ffmpeg -i [輸入影片] -c:v rawvideo -pix_fmt [色彩格式] [輸出影片]
-c:v rawvideo指定輸出原始格式,這容量會暴增百倍以上,10MB ->-> 2GB,只適合小片段影片
-pix_fmt指定顏色格式
範例
ffmpeg -i "C:\video.mp4" -c:v rawvideo -pix_fmt yuv420p "C:\out.yuv"
八、原始影像的編碼,yuv -> mp4
ffmpeg -f rawvideo -s [長寬] -r [幀數] -pix_fmt [色彩格式] -i [輸入影片] -c:v [函式庫] -b:v [位元率] [輸出影片]
-f rawvideo告訴ffmpeg這是原始編碼格式
-s告訴ffmpeg解析度
-r告訴ffmpeg幀數
-pix_fmt指定格式
-b:v指定目標位元率
範例
ffmpeg -f rawvideo -s 640x360 -r 24000/1001 -pix_fmt yuv420p -i "C:\video.yuv" -c:v libx264 -b:v 300k "C:\out.mp4"
九、二步驟編碼,h.265/HEVC
ffmpeg -i [輸入影片] -c:v libx265 -x265-params pools=[核心數]:pass=1 -b:v [位元率] -c:a copy dummy.mp4
del dummy.mp4
ffmpeg -i [輸入影片] -c:v libx265 -x265-params pools=[核心數]:pass=2 -b:v [位元率] -c:a copy [輸出影片]
-x265-params指定參數
pools限制編碼使用的執行緒數目,選用,因為x265平行化不完善,可以多開ffmpeg然後限制各自的效能避免競爭
pass=1步驟一
dummy.mp4表示生成一個過渡檔案,這是次佳作法但能夠有效同步音訊和視訊
del表示刪除檔案指令
pass=2步驟二
高階二步驟編碼dummy.mp4可視情況替換為-f null -省略過渡檔案運算
範例
ffmpeg -i "C:\in.mp4" -c:v libx265 -x265-params pools=4:pass=1 -b:v 940k -c:a copy dummy.mp4
del dummy.mp4
ffmpeg -i "C:\in.mp4" -c:v libx265 -x265-params pools=4:pass=2 -b:v 940k -c:a copy "C:\out.mp4"
同上,改為h.264格式
十、二步驟編碼,h.264/AVC
ffmpeg -i [輸入影片] -c:v libx264 -b:v [位元率] -pass 1 -c:a copy dummy.mp4
del dummy.mp4
ffmpeg -i [輸入影片] -c:v libx264 -b:v [位元率] -pass 2 -c:a copy [輸出影片]
範例
ffmpeg -i "C:\in.mp4" -c:v libx264 -b:v 940k -pass 1 -c:a copy dummy.mp4
del dummy.mp4
ffmpeg -i "C:\in.mp4" -c:v libx264 -b:v 940k -pass 2 -c:a copy "C:\out.mp4"
十一、無損影片合併
高階應用,$$$$跳過
十二、活用篇
擷取30秒影片,檢查影格數,試編碼,正式二階段編碼,檢查影格數,比較畫質損失
範例
ffmpeg -i "C:\in.mp4" -map 0 -c copy -f segment -segment_times 30 -reset_timestamps 1 "C:\outd.mp4"
ffprobe "C:\out00.mp4" -select_streams v:0 -show_entries stream=nb_frames
ffmpeg -i "C:\out00.mp4" -c:v libx265 -pix_fmt yuv420p10le -c:a copy "C:\out.mp4"
ffmpeg -i "C:\out00.mp4" -c:v libx265 -pix_fmt yuv420p10le -x265-params pools=4:pass=1 -b:v 940k -c:a copy dummy.mp4
del dummy.mp4
ffmpeg -i "C:\out00.mp4" -c:v libx265 -pix_fmt yuv420p10le -x265-params pools=4:pass=2 -b:v 940k -c:a copy "C:\video.mp4"
ffprobe "C:\video.mp4" -select_streams v:0 -show_entries stream=nb_frames
ffmpeg -i "C:\video.mp4" -i "C:\out00.mp4" -lavfi psnr=stats_file=psnr.log -f null -
move psnr.log "C:\psnr.csv"
謝謝收看!
14/4/2018補充
十三、番外篇,實驗性質,AV1/AOMedia Video 1
ffmpeg -i [輸入影片] -c:v libaom -strict -2 [輸出影片]
-strict -2實驗性質參數,目前必要
範例
ffmpeg -i "C:\in.mp4" -c:v libaom -strict -2 "C:\out.webm"
6/6/2018補充
八之二、原始影像的編碼YUV 8bit <--> YUV 10bit
ffmpeg -f rawvideo -s [長寬] -r [幀數] -pix_fmt [色彩格式] -i [輸入影片] -c:v rawvideo -pix_fmt [色彩格式] [輸出影片]
範例
ffmpeg -f rawvideo -s 640x360 -r 24000/1001 -pix_fmt yuv420p -i "C:\video_8bit.yuv" -c:v rawvideo -pix_fmt yuv420p10le "C:\video_10bit.yuv"
X




























































































