使用ffmpeg-go裁剪混合音频报错,需split过滤器求解决
解决ffmpeg-go音频裁剪混合时的trim滤镜报错问题
问题重现
使用ffmpeg-go对两个音频文件裁剪后混合,触发如下panic:
panic: encountered trim with multiple outgoing edges with same upstream label ; a 'split'' filter is probably required
问题原因
ffmpeg-go的Trim方法内部会生成多输出的滤镜节点,当该流被直接传入后续的混合滤镜时,库的滤镜链校验逻辑会判定存在未明确的多分支输出,从而抛出错误。
解决方案
在裁剪操作后显式添加Split滤镜,指定使用分流后的单个分支即可解决该问题。以下是两种修正方式:
方式1:修改Trim函数,添加Split分流
func AssembleAudio(music, effect string, userId int) { outputFilePath := filepath.Join(utils.GetRoot(), "users", fmt.Sprintf("%d", userId), "audio.mp3") musicStream := Trim(ffmpeg_go.Input(music), 60) effectStream := Trim(ffmpeg_go.Input(effect), 60) Mix(musicStream, effectStream).Output(outputFilePath).Run() } func Mix(music, effect *ffmpeg_go.Stream) *ffmpeg_go.Stream { return ffmpeg_go.Filter( []*ffmpeg_go.Stream{music, effect}, "amix", ffmpeg_go.Args{"inputs=2:duration=longest:dropout_transition=2"}, ) } func Trim(music *ffmpeg_go.Stream, duration int) *ffmpeg_go.Stream { // 裁剪后添加Split,取第一个分流分支 return music.Trim(ffmpeg_go.KwArgs{"duration": fmt.Sprintf("%d", duration)}).Split().Get("0") }
方式2:改用Filter直接构建trim滤镜
如果不想依赖Trim方法的隐式实现,也可以直接通过Filter函数手动构建trim滤镜:
func Trim(music *ffmpeg_go.Stream, duration int) *ffmpeg_go.Stream { return ffmpeg_go.Filter( []*ffmpeg_go.Stream{music}, "trim", ffmpeg_go.KwArgs{"duration": fmt.Sprintf("%d", duration)}, ) }
原理说明
通过Split显式分流后,明确指定后续使用单个分支流,符合ffmpeg-go的滤镜链校验规则;而直接用Filter构建trim滤镜则会生成单输出的滤镜节点,从根源避免多分支问题。
内容的提问来源于stack exchange,提问作者princessluna
相关产品推荐
相关产品推荐

