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




