{
  "schemaVersion": 1,
  "contentVersion": "ca42e61ede0a24f789d7287a0001244ad22f4abf",
  "id": "docs/tools/hardware-encoders/qsv",
  "collection": "docs",
  "title": "QSV",
  "description": "Quick Sync Video is the hardware video encoder in Intel integrated graphics and Arc GPUs, used from FFmpeg as h264_qsv, hevc_qsv, vp9_qsv and av1_qsv.",
  "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/",
  "apiUrl": "https://encode.wiki/api/v1/documents/docs/tools/hardware-encoders/qsv.json",
  "markdownUrl": "https://encode.wiki/api/v1/markdown/docs/tools/hardware-encoders/qsv.md",
  "status": "current",
  "tags": [
    "migrated"
  ],
  "license": "CC BY-SA 4.0",
  "dates": {
    "lastVerified": "2026-10-08T00:00:00.000Z"
  },
  "authors": [],
  "sources": [
    {
      "title": "FFmpeg 9.0.2 common QSV encoder code and rate-control selection",
      "url": "https://github.com/FFmpeg/FFmpeg/blob/n9.0.2/libavcodec/qsvenc.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "FFmpeg 9.0.2 encoder documentation (QSV encoders)",
      "url": "https://github.com/FFmpeg/FFmpeg/blob/n9.0.2/doc/encoders.texi",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Intel VPL GPU runtime (supported platforms)",
      "url": "https://github.com/intel/vpl-gpu-rt",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Intel VPL dispatcher",
      "url": "https://github.com/intel/libvpl",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Intel media driver supported encoding features",
      "url": "https://github.com/intel/media-driver/blob/master/docs/media_features.md",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    }
  ],
  "provenance": {
    "originUrl": "https://github.com/av1-community-contributors/codec-wiki/blob/37c3317fd058b23c71a87679bed5619a98f77752/docs/encoders_hw/qsv.mdx",
    "originCommit": "37c3317fd058b23c71a87679bed5619a98f77752",
    "migratedAt": "2026-08-21T00:00:00.000Z",
    "modified": true,
    "originPath": "docs/encoders_hw/qsv.mdx"
  },
  "headings": [
    {
      "depth": 2,
      "text": "Hardware or software encoder?",
      "anchor": "hardware-or-software-encoder"
    },
    {
      "depth": 2,
      "text": "Which hardware supports what",
      "anchor": "which-hardware-supports-what"
    },
    {
      "depth": 2,
      "text": "Quality-oriented encode",
      "anchor": "quality-oriented-encode"
    },
    {
      "depth": 3,
      "text": "Bitrate-targeted",
      "anchor": "bitrate-targeted"
    },
    {
      "depth": 2,
      "text": "Full-GPU pipeline",
      "anchor": "full-gpu-pipeline"
    },
    {
      "depth": 2,
      "text": "Options that matter",
      "anchor": "options-that-matter"
    },
    {
      "depth": 2,
      "text": "Pitfalls",
      "anchor": "pitfalls"
    },
    {
      "depth": 2,
      "text": "Full option reference",
      "anchor": "full-option-reference"
    },
    {
      "depth": 3,
      "text": "Private options",
      "anchor": "private-options"
    },
    {
      "depth": 3,
      "text": "Codec-specific generic initialization overrides",
      "anchor": "codec-specific-generic-initialization-overrides"
    }
  ],
  "sections": [
    {
      "id": "_preamble",
      "title": "Page introduction",
      "depth": 0,
      "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/_preamble.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/_preamble.md",
      "checksum": "2990dfc8191bbc55e2a109f80d906676648fb071758ca7178cf6c1cdc5abfcd0",
      "bytes": 319
    },
    {
      "id": "hardware-or-software-encoder",
      "title": "Hardware or software encoder?",
      "depth": 2,
      "anchor": "hardware-or-software-encoder",
      "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/#hardware-or-software-encoder",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/hardware-or-software-encoder.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/hardware-or-software-encoder.md",
      "checksum": "36234f5e0b7840b16f82967f7ac724a756fab8efe102ede2c3861a95fc28335a",
      "bytes": 552
    },
    {
      "id": "which-hardware-supports-what",
      "title": "Which hardware supports what",
      "depth": 2,
      "anchor": "which-hardware-supports-what",
      "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/#which-hardware-supports-what",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/which-hardware-supports-what.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/which-hardware-supports-what.md",
      "checksum": "865461de9e125ed58190674c42858aa93553265213a164c6e1d1311918da34a9",
      "bytes": 888
    },
    {
      "id": "quality-oriented-encode",
      "title": "Quality-oriented encode",
      "depth": 2,
      "anchor": "quality-oriented-encode",
      "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/#quality-oriented-encode",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/quality-oriented-encode.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/quality-oriented-encode.md",
      "checksum": "6f73dd82d87260596cdb66d45931ed72a3ac9cab7534a0b49215b176e54d43d4",
      "bytes": 1210
    },
    {
      "id": "bitrate-targeted",
      "title": "Bitrate-targeted",
      "depth": 3,
      "anchor": "bitrate-targeted",
      "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/#bitrate-targeted",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/bitrate-targeted.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/bitrate-targeted.md",
      "checksum": "2df0dbe366ab169b4c4e58c3e1092aff36d89a07fae49b27860f474ec14043cf",
      "bytes": 425
    },
    {
      "id": "full-gpu-pipeline",
      "title": "Full-GPU pipeline",
      "depth": 2,
      "anchor": "full-gpu-pipeline",
      "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/#full-gpu-pipeline",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/full-gpu-pipeline.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/full-gpu-pipeline.md",
      "checksum": "1d297c1a21f464e39edbe8c5217cc76da3322db92bbd27c903085bbbfaa65142",
      "bytes": 509
    },
    {
      "id": "options-that-matter",
      "title": "Options that matter",
      "depth": 2,
      "anchor": "options-that-matter",
      "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/#options-that-matter",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/options-that-matter.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/options-that-matter.md",
      "checksum": "eccbbcb9e2ecb776306f0951005780a24cdd2c781a1ec701e3d02cf0c157c04c",
      "bytes": 1081
    },
    {
      "id": "pitfalls",
      "title": "Pitfalls",
      "depth": 2,
      "anchor": "pitfalls",
      "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/#pitfalls",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/pitfalls.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/pitfalls.md",
      "checksum": "9c188bf221b1b34dcf762271e6eb002f626ed0676300bf1e2d227aa096273a10",
      "bytes": 525
    },
    {
      "id": "full-option-reference",
      "title": "Full option reference",
      "depth": 2,
      "anchor": "full-option-reference",
      "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/#full-option-reference",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/full-option-reference.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/full-option-reference.md",
      "checksum": "78468be048915739c3b14ed90d5d375f96eb825917362c88dcb7ca8433f1840a",
      "bytes": 2937
    },
    {
      "id": "private-options",
      "title": "Private options",
      "depth": 3,
      "anchor": "private-options",
      "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/#private-options",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/private-options.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/private-options.md",
      "checksum": "91ee4019fa410aadbd4fde0cfb81fec007704d334671e078527cd94bf4f2349b",
      "bytes": 2291
    },
    {
      "id": "codec-specific-generic-initialization-overrides",
      "title": "Codec-specific generic initialization overrides",
      "depth": 3,
      "anchor": "codec-specific-generic-initialization-overrides",
      "canonicalUrl": "https://encode.wiki/tools/hardware-encoders/qsv/#codec-specific-generic-initialization-overrides",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/codec-specific-generic-initialization-overrides.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/hardware-encoders/qsv/codec-specific-generic-initialization-overrides.md",
      "checksum": "ea272e8e7b02976b635edbdb312ec9f29359e95e3af957ca8e0a4b93ba9fb21e",
      "bytes": 411
    }
  ],
  "outboundReferences": [
    "/tools/hardware-encoders/amf/",
    "/tools/hardware-encoders/nvenc/#hardware-or-software-encoder",
    "/tools/software-encoders/svt-av1/",
    "/tools/software-encoders/x264/",
    "/tools/software-encoders/x265/"
  ],
  "checksum": "8f16191a2b4309262cdbfc033ebcbdc7bf26f1233bcf6e3c084fcb4457413625",
  "contentFormat": "markdown",
  "markdown": "Quick Sync Video (QSV) is the fixed-function media engine in Intel integrated graphics and Arc GPUs. FFmpeg exposes it as `h264_qsv`, `hevc_qsv`, `vp9_qsv`, `av1_qsv`, `mpeg2_qsv` and `mjpeg_qsv`. It is fast and sips power, which is why it is popular for home servers, Plex/Jellyfin transcoding, laptops and recording.\n\n## Hardware or software encoder?\n\nQSV trades compression efficiency for speed and power like every hardware encoder: at the same bitrate it loses to [x264](/tools/software-encoders/x264/), [x265](/tools/software-encoders/x265/) and [SVT-AV1](/tools/software-encoders/svt-av1/) at slow presets. It is generally considered competitive with [NVENC](/tools/hardware-encoders/nvenc/#hardware-or-software-encoder) and ahead of [AMF](/tools/hardware-encoders/amf/). Use it for transcodes where speed matters; use a software encoder when quality per bit does.\n\n## Which hardware supports what\n\n| Codec | Support |\n| --- | --- |\n| H.264 | Every Quick Sync generation. 8-bit 4:2:0 only in FFmpeg (`nv12`). |\n| HEVC | 8-bit from Skylake (6th gen), 10-bit from Kaby Lake (7th gen). The Linux media driver only exposes 10-bit encode from Ice Lake. |\n| VP9 | Ice Lake onward, 8 and 10-bit, low-power mode only. Lunar Lake and Battlemage have no VP9 encoder. |\n| AV1 | Arc (Alchemist, Battlemage) and Meteor Lake or newer integrated graphics, 8 and 10-bit. Tiger Lake, Alder Lake and Raptor Lake only decode AV1. |\n\nCurrent FFmpeg builds QSV against libvpl (2.6 or newer); the older libmfx path is deprecated and has no `av1_qsv`. On Linux you also need `intel-media-driver` and a GPU runtime: `vpl-gpu-rt` for Tiger Lake and newer (including Arc), or the legacy Media SDK runtime for older iGPUs. On Windows the regular Intel graphics driver includes it.\n\n## Quality-oriented encode\n\n```sh\nffmpeg -i input.mkv -c:v hevc_qsv -preset slower -global_quality 24 -c:a copy output.mkv\n```\n\n`-global_quality` without `-maxrate` selects ICQ (intelligent constant quality), QSV's CRF-like mode. The range is 1–51 and lower is better, but the number is not comparable to x264/x265 CRF. For AV1:\n\n```sh\nffmpeg -i input.mkv -c:v av1_qsv -preset slower -global_quality 30 -c:a copy output.mkv\n```\n\nFor 10-bit HEVC or AV1 add `-pix_fmt p010le`. `h264_qsv` only takes `nv12`.\n\nWith neither `-global_quality` nor `-b:v` you get fixed-QP encoding (CQP at 26, or 128 for AV1) and a warning, which is rarely what you want.\n\nH.264 can add `-look_ahead 1` to `-global_quality` for LA_ICQ, which looks ahead for better bit distribution at the cost of latency.\n\n### Bitrate-targeted\n\n```sh\nffmpeg -i input.mkv -c:v hevc_qsv -preset slower -b:v 6M -maxrate 9M -bufsize 12M -c:a copy output.mkv\n```\n\nFFmpeg picks the mode from the options: `-b:v` with `-maxrate` equal to it is CBR, otherwise VBR. Adding `-global_quality` to a VBR command turns it into QVBR, quality-targeted with the bitrate settings as limits. For better VBR on supported hardware add `-extbrc 1 -look_ahead_depth 40`.\n\n## Full-GPU pipeline\n\n```sh\nffmpeg -hwaccel qsv -hwaccel_output_format qsv -i input.mkv -vf vpp_qsv=w=1920:h=1080 -c:v hevc_qsv -preset slower -global_quality 24 output.mkv\n```\n\nFrames stay in GPU memory from decode to encode. `vpp_qsv` scales and converts formats on the GPU; any filter that is not a QSV filter needs `hwdownload` first. With more than one GPU on Linux, create the device explicitly, for example `-init_hw_device vaapi=va:/dev/dri/renderD128 -init_hw_device qsv=hw@va -filter_hw_device hw`.\n\n## Options that matter\n\n| Option | What it does |\n| --- | --- |\n| `-preset veryfast`–`veryslow` | Speed/quality trade-off, `veryslow` is the best quality. |\n| `-global_quality` | Quality target for ICQ (1–51). Combined with `-look_ahead 1` (H.264) it selects LA_ICQ. |\n| `-b:v`, `-maxrate`, `-bufsize` | Bitrate mode selection: CBR when `-maxrate` equals `-b:v`, VBR otherwise. |\n| `-extbrc 1`, `-look_ahead_depth N` | Extended bitrate control with lookahead (up to 100 frames) for CBR and VBR. Needs support from the runtime and codec. |\n| `-bf`, `-b_strategy`, `-adaptive_b`, `-adaptive_i` | B-frame count and adaptive B/I placement. `-1` leaves it to the driver. |\n| `-low_power` | Selects the fixed-function (VDENC) encoder instead of the programmable one. Default `auto`. Some codecs and GPUs only have this path; it has a smaller feature set, so some options are rejected. |\n| `-async_depth` | Frames in flight. Lower it for latency, raise it for throughput. |\n| `-qsv_params key=value:…` | Passes options straight to the VPL runtime when FFmpeg has no named option. |\n\n## Pitfalls\n\n- A listed encoder only means FFmpeg was built with it. Whether AV1, 10-bit or low-power works depends on the GPU and runtime; `vpl-inspect` (from libvpl) lists what the runtime supports.\n- The runtime can end up in a different rate-control mode than the one you asked for. `-v verbose` prints a \"Using the … ratecontrol method\" line with the mode FFmpeg requested.\n- `-bf` and lookahead interact with latency settings; low-delay settings (`-async_depth 1 -bf 0 -low_delay_brc 1`) cost compression efficiency.\n\n## Full option reference\n\nEvery private option of `av1_qsv` in FFmpeg 9.0.2; `h264_qsv` and `hevc_qsv` have more. `-1` and `auto` leave the setting to the oneVPL runtime, and `INT_MAX` is 2147483647.\n\n{/* ffmpeg-parameters:start */}\n\n### Private options\n\n| Parameter | Type | Default | Meaning | Range / named values |\n| --- | --- | --- | --- | --- |\n| `-async_depth` | `int` | `4` | Frames processed in parallel; higher improves throughput and adds latency. | `1` to `INT_MAX` |\n| `-preset` | `int` | `0` | Target usage from `veryslow` (1, best) to `veryfast` (7). 0 leaves it to the runtime. `-compression_level` overrides it. | `0` to `7`; `veryfast`=`7`, `faster`=`6`, `fast`=`5`, `medium`=`4`, `slow`=`3`, `slower`=`2`, `veryslow`=`1` |\n| `-forced_idr` | `boolean` | `false` | Make every I-frame a key frame, not only those flagged as keyframes. | `0` to `1` |\n| `-low_power` | `boolean` | `auto` | Use the fixed-function (VDEnc) encoder. `auto` leaves it to the runtime. | `-1` to `1` |\n| `-qsv_params` | `dictionary` | `not exposed` | Pass oneVPL/MediaSDK parameters directly, as `key=value:key=value`. | — |\n| `-b_strategy` | `int` | `-1` | 1 uses B-frames as references (pyramid); 0 keeps them non-reference. -1 = runtime default. | `-1` to `1` |\n| `-adaptive_i` | `int` | `-1` | Let the encoder insert I-frames at scene changes. -1 = runtime default. | `-1` to `1` |\n| `-adaptive_b` | `int` | `-1` | Let the encoder adapt B-frame placement. -1 = runtime default. | `-1` to `1` |\n| `-extbrc` | `int` | `-1` | Extended bitrate control, required for `-look_ahead_depth` with VBR/CBR. -1 = runtime default. | `-1` to `1` |\n| `-low_delay_brc` | `boolean` | `auto` | Strictly obey the average frame size, for low-latency streaming. `auto` = runtime default. | `-1` to `1` |\n| `-max_frame_size` | `int` | `-1` | Largest encoded frame, in bytes; -1 = no limit. | `-1` to `INT_MAX` |\n| `-max_frame_size_i` | `int` | `-1` | Largest encoded I-frame, in bytes; -1 = no limit. | `-1` to `INT_MAX` |\n| `-max_frame_size_p` | `int` | `-1` | Largest encoded P-frame, in bytes; -1 = no limit. | `-1` to `INT_MAX` |\n| `-profile` | `int` | `unknown` | AV1 profile; `unknown` lets the runtime choose. | `0` to `INT_MAX`; `unknown`=`0`, `main`=`1` |\n| `-tile_cols` | `int` | `0` | Tile columns; 0 = runtime default. | `0` to `65535` |\n| `-tile_rows` | `int` | `0` | Tile rows; 0 = runtime default. | `0` to `65535` |\n| `-look_ahead_depth` | `int` | `0` | Lookahead frames for VBR/CBR when `-extbrc 1` is set; 0 = off. | `0` to `100` |\n\n### Codec-specific generic initialization overrides\n\nThe wrapper replaces these generic FFmpeg defaults for this encoder. `-b` is in bits/s; `-g` and\n`-bf` count frames. `-1`, and `0` for `-b` and `-refs`, leave the value to the preset, driver or\nrate-control logic.\n\n| Generic parameter | Default |\n| --- | --- |\n| `-b` | `0` |\n| `-g` | `-1` |\n| `-bf` | `-1` |\n| `-refs` | `0` |\n\n{/* ffmpeg-parameters:end */}\n"
}
