ffmpeg alpha 通道视频生成
Ffmpeg alpha channel video generation
我正在尝试使用 ffmpeg 和执行此操作的 PY 库从视频中删除背景,PY 库(backgroundremover)只是创建一个 matte.mp4 文件作为输出,背景为黑色,人作为白色剪影。
PY 库:https://github.com/nadermx/backgroundremover#advance-usage-for-video
我现在在做什么:
缩小视频并将其转换为 MP4
ffmpeg -i ios.mov -s 320x240 -filter:v fps=30 -vf scale=320:-2 edited.mp4
创建遮罩视频
backgroundremover -i edited.mp4 -wn 4 -mk -o matte.mp4
创建带 alpha 通道的视频(问题)
ffmpeg -i edited.mp4 -i matte.mp4 -filter_complex "[0:v][1:v]alphamerge" -shortest -c:v qtrle -an output.mov
最后一条命令因帧大小无效而失败,我该如何强制帧大小或跳过此检查?
错误:
[swscaler @ 0x7ff5c957b000] No accelerated colorspace conversion found from yuv420p to argb.
[Parsed_alphamerge_0 @ 0x7ff5c4e6d480] Input frame sizes do not match (320x240 vs 426x320).
[Parsed_alphamerge_0 @ 0x7ff5c4e6d480] Failed to configure output pad on Parsed_alphamerge_0
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
答案:
ffmpeg -y -i edited.mp4 -i matte.mp4 -f lavfi -i color=c=black:s=320x240 -filter_complex "[1:v]scale=320:240,setsar=1:1,split[vs][alpha];[0:v][vs]alphamerge[vt];[2:v][vt]overlay=shortest=1[rgb];[rgb][alpha]alphamerge" -shortest -c:v hevc_videotoolbox -allow_sw 1 -alpha_quality 0.75 -vtag hvc1 -pix_fmt yuva420p -an output.mov
错误 Input frame sizes do not match (320x240 vs 426x320)
是“自我解释”。
edited.mp4
的分辨率为320x240
。
matte.mp4
的分辨率是426x320
。
不知道为什么backgroundremover
把分辨率从320x240
修改为426x320
。
其余消息只是警告。
我不太确定,但我认为第一个 FFmpeg 命令应该是:
ffmpeg -y -i ios.mov -filter:v fps=30 -vf scale=320:240,setsar=1:1 edited.mp4
它没有解决问题 - matte.mp4
的分辨率仍然是 426x320
。
这可能是 backgroundremover
...
中的错误
您可以使用 scale
文件管理器解决错误消息。
alpha 合并后应跟一个 overlay
过滤器:
ffmpeg -y -i edited.mp4 -i matte.mp4 -f lavfi -i color=c=black:s=320x240 -filter_complex "[1:v]scale=320:240,setsar=1:1[vs];[0:v][vs]alphamerge[vt];[2:v][vt]overlay=shortest=1" -shortest -c:v qtrle -an output.mov
示例输出:
我正在尝试使用 ffmpeg 和执行此操作的 PY 库从视频中删除背景,PY 库(backgroundremover)只是创建一个 matte.mp4 文件作为输出,背景为黑色,人作为白色剪影。
PY 库:https://github.com/nadermx/backgroundremover#advance-usage-for-video
我现在在做什么:
缩小视频并将其转换为 MP4
ffmpeg -i ios.mov -s 320x240 -filter:v fps=30 -vf scale=320:-2 edited.mp4
创建遮罩视频
backgroundremover -i edited.mp4 -wn 4 -mk -o matte.mp4
创建带 alpha 通道的视频(问题)
ffmpeg -i edited.mp4 -i matte.mp4 -filter_complex "[0:v][1:v]alphamerge" -shortest -c:v qtrle -an output.mov
最后一条命令因帧大小无效而失败,我该如何强制帧大小或跳过此检查?
错误:
[swscaler @ 0x7ff5c957b000] No accelerated colorspace conversion found from yuv420p to argb.
[Parsed_alphamerge_0 @ 0x7ff5c4e6d480] Input frame sizes do not match (320x240 vs 426x320).
[Parsed_alphamerge_0 @ 0x7ff5c4e6d480] Failed to configure output pad on Parsed_alphamerge_0
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
答案:
ffmpeg -y -i edited.mp4 -i matte.mp4 -f lavfi -i color=c=black:s=320x240 -filter_complex "[1:v]scale=320:240,setsar=1:1,split[vs][alpha];[0:v][vs]alphamerge[vt];[2:v][vt]overlay=shortest=1[rgb];[rgb][alpha]alphamerge" -shortest -c:v hevc_videotoolbox -allow_sw 1 -alpha_quality 0.75 -vtag hvc1 -pix_fmt yuva420p -an output.mov
错误 Input frame sizes do not match (320x240 vs 426x320)
是“自我解释”。
edited.mp4
的分辨率为320x240
。matte.mp4
的分辨率是426x320
。
不知道为什么backgroundremover
把分辨率从320x240
修改为426x320
。
其余消息只是警告。
我不太确定,但我认为第一个 FFmpeg 命令应该是:
ffmpeg -y -i ios.mov -filter:v fps=30 -vf scale=320:240,setsar=1:1 edited.mp4
它没有解决问题 - matte.mp4
的分辨率仍然是 426x320
。
这可能是 backgroundremover
...
您可以使用 scale
文件管理器解决错误消息。
alpha 合并后应跟一个 overlay
过滤器:
ffmpeg -y -i edited.mp4 -i matte.mp4 -f lavfi -i color=c=black:s=320x240 -filter_complex "[1:v]scale=320:240,setsar=1:1[vs];[0:v][vs]alphamerge[vt];[2:v][vt]overlay=shortest=1" -shortest -c:v qtrle -an output.mov
示例输出: