# [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`