FFmpeg非顺序排列acrossfade滤镜图时出现EOF错误求助
FFmpeg非顺序排列acrossfade滤镜图时出现EOF错误求助
嘿,这个问题我太熟了!你碰到的是FFmpeg滤镜依赖顺序的坑😉
先看你现在的滤镜图写法,核心问题出在节点引用的顺序搞反了:你先写了调用[v12]和[a12]的代码段,但生成这两个节点的代码却放在了后面!
FFmpeg处理滤镜图的时候,是按你编写的代码顺序来解析依赖关系的。当它执行到[v12][v3]xfade...这行时,[v12]节点还没被创建出来,对应的音频节点[a12]也是一样。这就导致输出端的sink在等数据的时候,源头根本还没开始生成帧,自然就会抛出EOF错误。
解决办法:先定义节点,再使用节点
你只需要把生成[v12]和[a12]的代码段,移到调用它们的代码前面就行,不管片段的时间 chronological 顺序如何,滤镜节点必须遵循“先定义、后使用”的规则。
修正后的完整滤镜图代码如下:
# 先裁剪出所有需要的音视频片段 [0:v]trim=start=10:duration=5,setpts=PTS-STARTPTS,fps=30[v2]; [0:a]atrim=start=10:duration=5,asetpts=PTS-STARTPTS[a2]; [0:v]trim=start=20:duration=5,setpts=PTS-STARTPTS,fps=30[v3]; [0:a]atrim=start=20:duration=5,asetpts=PTS-STARTPTS[a3]; [0:v]trim=start=30:duration=5,setpts=PTS-STARTPTS,fps=30[v4]; [0:a]atrim=start=30:duration=5,asetpts=PTS-STARTPTS[a4]; [0:v]trim=start=60:duration=5,setpts=PTS-STARTPTS,fps=30[v1]; [0:a]atrim=start=60:duration=5,asetpts=PTS-STARTPTS[a1]; # 先创建[v12]和[a12]节点,确保后续能正常引用 [v1][v2]xfade=transition=wiperight:duration=1:offset=4[v12]; [a1][a2]acrossfade=d=1[a12]; # 现在可以放心使用[v12]和[a12]了 [v12][v3]xfade=transition=radial:duration=1:offset=8[v23]; [a12][a3]acrossfade=d=1[a23]; [v23][v4]xfade=transition=fade:duration=1:offset=12[vo]; [a23][a4]acrossfade=d=1[ao];
调整后FFmpeg就能正确解析每个节点的依赖关系,不管你想把片段按什么逻辑拼接,只要保证节点定义在前、使用在后,就能正常工作啦。
备注:内容来源于stack exchange,提问作者Javier Giménez
相关产品推荐
相关产品推荐

