使用FFmpeg色度键将视频绿幕转透明背景却出现黑底问题求助
解决FFmpeg色度键后背景变黑的问题
你现在的问题主要出在三个地方:
- 没必要引入第一个透明背景视频,叠加操作反而把chromakey生成的透明区域覆盖成了该视频的背景(大概率是黑色)
- libx264编码器默认配置不支持Alpha通道,得指定对应的profile
- alpha_mode参数设置不对
直接修改命令如下:
val outputVideoPath = FileUtil.createMediaFilePathforChroma(this@ChromaActivity, 1) cmdList.append("ffmpeg").append("-y") cmdList.append("-i").append(reducedFrameRatePath) // 去掉第一个透明视频的输入 cmdList.append("-filter_complex") cmdList.append("[0:v]scale=$width:$height,chromakey=0x00FF00:similarity=.455[out]") // 直接对原视频做色度键处理,生成带Alpha通道的流 cmdList.append("-map").append("[out]") cmdList.append("-t").append(TimeUnit.MILLISECONDS.toSeconds(videodata?.endduration!!).toString()) cmdList.append("-preset").append("ultrafast") cmdList.append("-c:a").append("copy") cmdList.append("-c:v").append("libx264") cmdList.append("-profile:v").append("high444") // 必须指定high444 profile才能让libx264支持Alpha通道 cmdList.append("-pix_fmt").append("yuva420p") cmdList.append("-metadata:s:v:0").append("alpha_mode=1") // alpha_mode设为1表示启用透明模式 cmdList.append(outputVideoPath)
补充说明:
- 去掉第一个输入的透明视频后,直接对目标视频做chromakey,滤镜会自动把绿色区域替换成透明(生成Alpha通道)
high444是libx264支持Alpha通道的必要profile,默认的baseline/main/high都不包含Alpha支持- 输出的MP4容器本身支持透明,但要确保播放工具能识别(比如大部分专业视频软件支持,普通播放器可能显示黑色背景,这是播放器的问题,不是视频本身的问题)
内容的提问来源于stack exchange,提问作者Rinki Sharma
相关产品推荐
相关产品推荐

