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

在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

火山引擎 最新活动