# [FFmpeg] Quick Sync Video ## 說明 Intel QSV (Quick Sync Video) 是使用 Intel CPU 與 Graphics 的硬體編/解碼技術。要使用 QSV,Intel CPU 內建的 Graphics 必須在啟用狀態。注意 (CPU)Graphics 必須要相容 QSV 與 OpenCL。一些 (比較舊的) QSV 啟用 Graphics 與 OpenCL 不相容。 FFmpeg 對於 QSV 的支援依賴 libmfx,此為額外的函式庫,FFmpeg 的 configuration 之中必須有 `--enable-libmfx` 才能在 FFmpeg 上使用 OSV 編碼器。 ### FFmpeg 包含的 QSV 系列解碼器、編碼器、篩選器 * 使用 `-decoders` 選項列出所有解碼器,名稱帶有 `_qsv` 後輟為 QSV 解碼器。 使用 `-h decoder=NAME` 以獲得名為 `NAME` 的解碼器說明得說明。 * 使用 `-encoders` 選項列出所有編碼器,名稱帶有 `_qsv` 後輟為 QSV 篩選器。 使用 `-h encoder=NAME` 以獲得名為 `NAME` 的編碼器說明得說明。 * 使用 `-filters` 選項列出所有篩選器,名稱帶有 `_qsv` 後輟為 QSV 篩選器。 使用 `-h filter=NAME` 以獲得名為 `NAME` 的篩選器說明得說明。 ## 硬體支援 | 平台名稱 | 圖形 | 加入支援... | | ------------- | ------- | ------------------------------------------- | | Ironlake | gen5 | MPEG-2, H.264 解碼 | | Sandy Bridge | gen6 | VC-1 解碼; H.264 編碼 | | Ivy Bridge | gen7 | JPEG 解碼; MPEG-2 編碼 | | Bay Trail | gen7 | - | | Haswell | gen7.5 | - | | Broadwell | gen8 | VP8 解碼 | | Braswell | gen8 | H.265 解碼; JPEG, VP8 編碼 | | Skylake | gen9 | H.265 編碼 | | Apollo Lake | gen9 | VP9, H.265 Main10 解碼 | | Kaby Lake | gen9.5 | VP9 profile 2 解碼; VP9, H.265 Main10 編碼 | | Coffee Lake | gen9.5 | - | | Gemini Lake | gen9.5 | - | | Cannon Lake | gen10 | - | | Ice Lake | gen11 | H.265 8 bits 422/444 解碼,編碼; vp9 8/10 bits 444 解碼,編碼 | | Tiger Lake | gen12 | av1 8,10 bits; H.265 12 bits 解碼;vp9 12 bits 解碼 | | Rocket Lake | gen12 | - | | Alder Lake | gen12 | - | | DG1 | gen12 | 移除 vp8 編碼 | | SG1 | gen12 | - | ## 解碼 解碼 H.264 視訊: ```powershell ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -f null - ``` > 使用 `-f null -` 將不會產生任何輸出,這通常被用在解碼測試。 解碼 HEVC 10bit 視訊: ```powershell ffmpeg -hwaccel qsv -c:v hevc_qsv -load_plugin hevc_hw -i input.mp4 -vf "hwdownload,format=p010" -f null - ``` ## 轉碼 ### 軟體解碼 → QSV 編碼 軟體解碼 → QSV 編碼輸出 H.264 視訊: ```powershell ffmpeg -i input.mp4 -c:v h264_qsv output.mp4 ``` 承上,使用軟體篩選器,例如 `scale`: ```powershell ffmpeg -i input.mp4 -vf "scale=1280:720" -c:v h264_qsv output.mp4 ``` 承上,使用 QSV 篩選器,例如 `scale_qsv`: ```powershell ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -i input.mp4 -vf "hwupload=extra_hw_frames=64,scale_qsv=1280:720" -c:v h264_qsv output.mp4 ``` ### QSV 解碼 → QSV 編碼 QSV 解碼 → QSV 編碼輸出 H.264 視訊: ```powershell ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -c:v h264_qsv output.mp4 ``` 承上,使用 QSV 視訊篩選器: ```powershell ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf "scale_qsv=1280:720" -c:v h264_qsv output.mp4 ``` 承上,使用軟體篩選器,例如 `scale`: ```powershell ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf "hwdownload,format=nv12,format=yuv420p,scale=1280x720" -c:v h264_qsv output.mp4 ``` ### QSV 解碼 → 軟體編碼 QSV 解碼 → 軟體編碼 (x264) 輸出 H.264 視訊: ```powershell ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf "hwdownload,format=nv12,format=yuv420p" -c:v libx264 output.mp4 ``` 承上,使用軟體篩選器,例如 `scale`: ```powershell ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf "hwdownload,format=nv12,format=yuv420p,scale=1280x720" -c:v libx264 output.mp4 ``` 承上,使用 QSV 篩選器,例如 `scale_qsv`: ```powershell ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf "scale_qsv=1280:720,hwdownload,format=nv12,format=yuv420p" -c:v libx264 output.mp4 ``` ## 速率控制 (Rate control) ### 以品質為基礎 (quality-based) 的模式 -global_quality *value* 設定目標品質,設定值可用範圍 1-51 預設為 23,數值越小輸出品質越佳。可用模式依推薦排序 LA_ICQ, ICQ, CQP。 > 注意:不同的 QSV 版本支援的模式與預設模式不同。 以下示範如何設定速率控制模式: LA_ICQ (啟用 look_ahead): ```powershell ffmpeg -i input.mp4 -global_quality:v 20 -look_ahead 1 output.mp4 ``` ICQ (禁用 look_ahead): ```powershell ffmpeg -i input.mp4 -global_quality:v 20 -look_ahead 0 output.mp4 ``` CQP (使用 qscale 旗標): ```powershell ffmpeg -i input.mp4 -flag:v qscale -global_quality:v 20 output.mp4 ``` CQP (與上面的範例相同意義): ```powershell ffmpeg -i input.mp4 -q:v 20 output.mp4 ``` ### 以位元速率為基礎 (bitrate-based) 的模式 -b 位元率 設定目標平均位元率。可用模式 CBR, VBR, LA_VBR/LA, AVBR, VCM。 > 注意:不同的 QSV 版本支援的模式與預設模式不同。 以下示範如何設定速率控制模式: LA_VBR / LA (啟用 look_ahead 選項): ```powershell ffmpeg -i input.mp4 -b:v 2000k -look_ahead 1 output.mp4 ``` VBR (使用 maxrate 選項指定最大值位元率): ```powershell ffmpeg -i input.mp4 -b:v 2000k -maxrate:v 4000k -look_ahead 0 output.mp4 ``` CBR (使用 maxrate 選項指定最大值位元率與平均位元率相同): ```powershell ffmpeg -i input.mp4 -b:v 2000k -maxrate:v 4000k -look_ahead 0 output.mp4 ``` VCM (啟用 vcm): ```powershell ffmpeg -i input.mp4 -b:v 2000k -look_ahead 0 -vcm 1 output.mp4 ``` ## 詳細編碼器訊息 根據你的系統,編碼器可能選擇與你指定的模式不同的模式。將 loglevel 設定為 verbose 或更高來檢視 QSV 編碼器執行時實際使用的模式與設定值。 例如: ```powershell ffmpeg -i input.mp4 -loglevel verbose -c:v h264_qsv -global_quality 20 -look_ahead 0 output.mp4 ``` FFmpeg 主控台輸出訊息 (某一行): ```powershell [h264_qsv @ 0000023f1db73c80] Using the intelligent constant quality (ICQ) ratecontrol method ``` ## FFmpeg 選項映射到 MSDK 選項 選項對照表 libavcodec | MSDK ----------------------------- | -------- -g *integer* | GopPicSize -bf *integer* | GopRefDist -rc_init_occupancy *integer* | InitialDelayInKB -slices *integer* | NumSlice -refs *integer* | NumRefFrame -b_strategy *integer* | BRefType -flags *cgop* | GopOptFlag -i_qfactor *float* | QP factor between P and I frames. -b_qfactor *float* | QP factor between P and B frames. -i_qoffset *float* | QP offset between P and I frames. -b_qoffset *float* | QP offset between P and B frames. -coder vlc | CAVLC (H.264 encoder) ###### tags: `ffmpeg`