在macOS下使用FFmpeg将Alpha遮罩视频与彩色视频合成为带透明通道的HEVC(.mov)视频的问题
在macOS下使用FFmpeg将Alpha遮罩视频与彩色视频合成为带透明通道的HEVC(.mov)视频的问题
看起来你在macOS上尝试用FFmpeg把彩色视频和Alpha遮罩合成带透明通道的HEVC .mov文件时,遇到了像素格式不兼容和非法硬件指令的报错,我来帮你解决这个问题:
问题根源分析
你之前用的命令里指定了-pix_fmt yuva420p,但macOS的硬件编码器hevc_videotoolbox并不支持这个像素格式作为输入——从你用ffmpeg -h encoder=hevc_videotoolbox查到的支持列表来看,它只支持videotoolbox_vld、nv12、yuv420p、bgra、p010le这几种格式,其中带透明通道的只有bgra和10位的p010le。另外,之前命令里引入的lavfi黑色背景源其实是多余的,alphamerge滤镜可以直接合并彩色视频和Alpha遮罩。
修正后的解决方案
根据你的需求,我整理了两种场景的命令:
场景1:彩色视频和Alpha遮罩分辨率一致
如果两个视频的尺寸完全相同,直接用这个命令即可:
ffmpeg -y -i color.mp4 -i alpha.mp4 -filter_complex "[1:v]format=bgra,extractplanes=a[alpha];[0:v]format=bgra[color];[color][alpha]alphamerge" -c:v hevc_videotoolbox -vtag hvc1 -pix_fmt bgra -an output.mov
命令说明:
- 先把Alpha遮罩视频转成
bgra格式,单独提取出Alpha通道 - 把彩色视频也转成
bgra格式,保证格式统一 - 用
alphamerge将彩色视频和Alpha通道合并 - 指定
hevc_videotoolbox硬件编码,-vtag hvc1确保mov文件的兼容性,-an去掉音频(如果需要保留音频可以移除这个参数)
场景2:彩色视频和Alpha遮罩分辨率不一致
如果两个视频尺寸不同,需要先将Alpha遮罩匹配彩色视频的分辨率,再合并:
ffmpeg -y -i color.mp4 -i alpha.mp4 -filter_complex "[1:v]scale=iw:ih:force_original_aspect_ratio=decrease,pad=iw:ih:(ow-iw)/2:(oh-ih)/2,format=bgra,extractplanes=a[alpha];[0:v]format=bgra[color];[color][alpha]alphamerge" -c:v hevc_videotoolbox -vtag hvc1 -pix_fmt bgra -an output.mov
命令说明:
scale会把Alpha遮罩按比例缩小到不超过彩色视频的尺寸pad会把缩放后的遮罩居中对齐,补全到彩色视频的尺寸- 后续的通道提取和合并逻辑和场景1一致
额外注意事项
- 如果还是出现「illegal hardware instruction」报错,可以尝试添加
-allow_sw 1参数,让编码器在硬件加速失败时 fallback 到软件编码(速度会变慢,但兼容性更好) - 如果需要更高质量的10位透明视频,可以把
-pix_fmt bgra改成-pix_fmt p010le,但需要你的Mac硬件支持10位HEVC编码 - 先确认你的FFmpeg版本支持
hevc_videotoolbox,可以用ffmpeg -encoders | grep hevc_videotoolbox验证
备注:内容来源于stack exchange,提问作者James




