You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu 24.04.1下使用Intel Quick Sync硬件加速转码H.264到HEVC失败求助

Ubuntu 24.04.1下使用Intel Quick Sync硬件加速转码H.264到HEVC失败求助

看起来你已经仔细确认了系统的QSV解码/编码支持,但转码时触发了一堆H.264 NAL单元错误和流参数识别问题,我来帮你梳理下问题根源和可行的解决办法:

先复盘下你的环境和问题

已确认的环境信息

  • CPU:Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz(原生支持QSV加速)
  • 系统:Ubuntu 24.04.1 LTS
  • 视频源:Codec ID为mp4v-20的8位H.264视频
  • FFmpeg QSV支持:同时具备h264_qsv解码和hevc_qsv编码能力

你遇到的错误

执行这条转码命令时:

ffmpeg -c:v h264_qsv -i $1 -c:v hevc_qsv -c:a copy $2

出现大量类似错误:

[h264 @ 0x5e67e9970b80] Invalid NAL unit 0, skipping.
[h264 @ 0x5e67e9970b80] no frame!
...
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5e67e996e440] Could not find codec parameters for stream 1 (Video: h264 (mp4v / 0x7634706D), none, 3948 kb/s): unspecified size

问题根源

这些错误的核心是FFmpeg在启用QSV解码器时,没能正确读取输入视频的流元数据(比如分辨率),导致QSV解码器初始化失败,FFmpeg回退到软件H.264解码器后又无法解析QSV传递的数据流,最终触发NAL单元错误。

可行的解决办法

1. 调整命令顺序,让FFmpeg先探测流参数

把QSV解码器的指定移到输入之后,让FFmpeg先自动识别视频流的元数据,再启用QSV解码:

ffmpeg -i $1 -c:v h264_qsv -c:v hevc_qsv -c:a copy $2

如果视频文件有多个流,还可以明确指定视频流索引,避免FFmpeg认错流:

ffmpeg -i $1 -map 0:v:0 -c:v h264_qsv -c:v hevc_qsv -map 0:a -c:a copy $2

2. 手动指定视频分辨率(如果元数据缺失)

如果你的视频流本身分辨率元数据丢失,可以手动指定(替换成你实际的视频分辨率,比如1920x1080):

ffmpeg -c:v h264_qsv -video_size 1920x1080 -i $1 -c:v hevc_qsv -c:a copy $2

3. 确保QSV驱动组件完整

Ubuntu 24.04下,先检查并安装完整的Intel媒体驱动和VA-API依赖:

sudo apt update && sudo apt install intel-media-va-driver-non-free ffmpeg libva2 libva-drm2

安装完成后,用vainfo验证VA-API是否正常工作:

vainfo

如果输出里能看到H.264解码和HEVC编码的配置项,说明驱动没问题。

4. 先软件解码读参数,再QSV编码

如果以上方法都无效,可以暂时用软件解码器读取流参数,再交给QSV编码(解码性能会略降,但能解决参数识别问题):

ffmpeg -i $1 -c:v hevc_qsv -c:a copy $2

5. 指定VA-API设备路径

如果错误提示提到“Consider increasing the va...”,可以手动指定VA-API设备:

ffmpeg -vaapi_device /dev/dri/renderD128 -c:v h264_qsv -i $1 -c:v hevc_qsv -c:a copy $2

备注:内容来源于stack exchange,提问作者stuart balfour

火山引擎 最新活动