3

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

缓冲区队列溢出,丢弃。

我提到的这个这个这个很少。我得到了解决方案,并在音频长度大于视频的情况下产生输出。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的视频时,它会导致上述相同的问题。我在这里做错了什么,还有其他方法可以用来让视频和音频交叉淡化吗?

4

2 回答 2

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 秒时以音频和视频的形式在它们之间淡入淡出。

于 2015-05-22T13:54:04.030 回答
2

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

[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]
于 2015-05-27T14:00:45.297 回答