FFmpeg音频交叉淡入淡出

时间:2015-05-22 11:25:07

标签: linux audio ffmpeg cross-fade

我尝试使用ffmpeg合并多个视频,并在两者之间应用交叉淡入淡出过渡。我通过参考this获得了视频交叉淡入淡出的工作。与此同时,我还需要将音频应用于与每个视频相关联的原始音频的交叉淡入淡出。我引用了几个地方,但结果却是,

  

缓冲区队列溢出,丢弃。

我引用了

Thisthisthis。我得到thisthis的解决方案,产生带concat选项的输出,其中音频的长度大于视频。虽然我使用了视频中使用的确切fade值,但它在视频中不起作用。 以下是我正在测试的ffmpeg命令。

ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -i 5.mp4 -f lavfi -i color=black -filter_complex "
[0:v]scale=iw*min(1280/iw\,720/ih):ih*min(1280/iw\,720/ih),pad=1280:720:(1280-iw*min(1280/iw\,720/ih))/2:(720-ih*min(1280/iw\,720/ih))/2,format=pix_fmts=yuva420p,fade=t=out:st=15:d=2:alpha=1,setpts=expr=PTS-STARTPTS[va0];
[1:v]scale=iw*min(1280/iw\,720/ih):ih*min(1280/iw\,720/ih),pad=1280:720:(1280-iw*min(1280/iw\,720/ih))/2:(720-ih*min(1280/iw\,720/ih))/2,format=pix_fmts=yuva420p,fade=t=in:st=0:d=2:alpha=1,fade=t=out:st=30:d=2:alpha=1,setpts=expr=PTS-STARTPTS[va1];
[2:v]scale=iw*min(1280/iw\,720/ih):ih*min(1280/iw\,720/ih),pad=1280:720:(1280-iw*min(1280/iw\,720/ih))/2:(720-ih*min(1280/iw\,720/ih))/2,format=pix_fmts=yuva420p,fade=t=in:st=0:d=2:alpha=1,fade=t=out:st=43:d=2:alpha=1,setpts=expr=PTS-STARTPTS[va2];
[3:v]scale=iw*min(1280/iw\,720/ih):ih*min(1280/iw\,720/ih),pad=1280:720:(1280-iw*min(1280/iw\,720/ih))/2:(720-ih*min(1280/iw\,720/ih))/2,format=pix_fmts=yuva420p,fade=t=in:st=0:d=2:alpha=1,fade=t=out:st=54:d=2:alpha=1,setpts=expr=PTS-STARTPTS[va3];
[4:v]scale=iw*min(1280/iw\,720/ih):ih*min(1280/iw\,720/ih),pad=1280:720:(1280-iw*min(1280/iw\,720/ih))/2:(720-ih*min(1280/iw\,720/ih))/2,format=pix_fmts=yuva420p,fade=t=in:st=0:d=2:alpha=1,setpts=expr=PTS-STARTPTS[va4];
[5:v]scale=1280x720,trim=duration=69[over0];
[0:a]afade=t=out:st=15:d=2,asetpts=PTS-STARTPTS[a0];
[1:a]afade=t=in:st=0:d=2,afade=t=out:st=30:d=2,asetpts=PTS-STARTPTS[a1];
[2:a]afade=t=in:st=0:d=2,afade=t=out:st=43:d=2,asetpts=PTS-STARTPTS[a2];
[3:a]afade=t=in:st=0:d=2,afade=t=out:st=54:d=2,asetpts=PTS-STARTPTS[a3];
[4:a]afade=t=in:st=0:d=2,asetpts=PTS-STARTPTS[a4];
[a0][a1][a2][a3][a4]concat=n=5:v=0:a=1[outa];
[over0][va0]overlay[over1];
[over1][va1]overlay[over2];
[over2][va2]overlay[over3];
[over3][va3]overlay[over4];
[over4][va4]overlay=format=yuv420[outv]" 
-vcodec libx264 -preset fast -r 60 -b:v 45000k -aspect 1.78 -map [outv] -map [outa] -c:a libfdk_aac -ac 2 -b:a 128k -shortest test.mp4

此外,当我使用与视频相同的asetpts时,会产生与上述相同的问题。 我在这里做错了什么,有没有其他方法可以让视频和音频交叉褪色?

2 个答案:

答案 0 :(得分:2)

我尝试通过减少到只有两个视频/音频流来简化您正在使用的命令(为了清晰起见),但我认为它应该适用于5个或更多视频。

我不会想;

  

缓冲区队列溢出,丢弃。

是一个错误...它是与您的视频相关的警告。我也得到了这些,但我的输出似乎很好。也许有经验的人可以在这里为您提供更多信息。

我认为您的音频无法按预期运行,因为您使用的是concat过滤器。这会将音频流附加到上一个流的末尾。我认为你真正想要的是合并/覆盖你的音频流,就像你对视频流一样。这可以通过amerge过滤器实现:

ffmpeg -y -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex "\          
[0:v]scale=iw*min(1280/iw\,720/ih):ih*min(1280/iw\,720/ih),pad=1280:720:(1280-iw*min(1280/iw\,720/ih))/2:(720-ih*min(1280/iw\,720/ih))/2,format=pix_fmts=yuva420p,fade=t=out:st=5:d=2:alpha=1,setpts=expr=PTS-STARTPTS[va0];\
[1:v]scale=iw*min(1280/iw\,720/ih):ih*min(1280/iw\,720/ih),pad=1280:720:(1280-iw*min(1280/iw\,720/ih))/2:(720-ih*min(1280/iw\,720/ih))/2,format=pix_fmts=yuva420p,fade=t=in:st=0:d=2:alpha=1,setpts=expr=PTS-STARTPTS+5/TB[va1];\
[2:v]scale=1280x720,trim=duration=10[over0];\                                   
[0:a]afade=t=out:st=5:d=2,asetpts=PTS-STARTPTS[a0];\                            
[1:a]afade=t=in:st=5:d=2,asetpts=PTS-STARTPTS[a1];\                             
[a0][a1]amerge[outa];\                                                          
[over0][va0]overlay[over1];\                                                    
[over1][va1]overlay=format=yuv420[outv]" \                                      
-vcodec libx264 -preset fast -r 60 -b:v 45000k -aspect 1.78 -t 12 -map [outv] -map [outa] -c:a libfdk_aac -ac 2 -b:a 128k -shortest test.mp4

此示例在5秒内拍摄两个视频并在音频和视频中淡出。

答案 1 :(得分:1)

最后通过在第一个音频之后的每个音频的开头附加静音空格来解决问题。这将一个接一个地混合音频。

[0:a]afade=t=out:st=15:d=2[a0];
[1:a]afade=t=in:st=0:d=2[a1];
aevalsrc=0:d=15[s1];
[s1][a1]concat=n=2:v=0:a=1[ac1];
[a0][ac1]amix[a]