linux - FFmpeg 音频交叉淡入淡出

标签 linux audio ffmpeg cross-fade

我正在尝试使用 ffmpeg 合并多个视频,并在它们之间应用交叉淡入淡出过渡。我通过引用 this 使视频交叉淡入淡出工作。 .同时,我还需要音频才能对与每个视频关联的原始音频应用交叉淡入淡出。我提到了几个地方,但结果是,

Buffer queue overflow, dropping.

This , thisthis我提到的很少。我得到了 this 的解决方案和 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 时,它会导致上述相同的问题。 我在这里做错了什么,还有其他方法可以让视频和音频交叉淡入淡出吗?

最佳答案

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

我不认为;

Buffer queue overflow, dropping.

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

我认为您遇到的问题是您的音频无法按预期工作,因为您使用的是 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 秒在音频和视频中淡入淡出。

关于linux - FFmpeg 音频交叉淡入淡出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30395469/

相关文章:

c++ - 阻塞队列竞争条件?

regex - 搜索出现在同一文件中但可能不在同一行中的文件中的两个模式

c++ - 如何将音频添加到使用 SinkWriter 创建的 mp4 文件?

iphone - 当 iPod 音乐停止时获取通知

encoding - 如何在 Android 中使用 FFMpeg 进行编码(使用 H263)

linux - 如何在 GoDaddy 的网络托管服务上提供没有扩展名的文件?

c++ - 在 c++ Eclipse CDT 中使用不同的值构建

android - 从SD卡加载声音时出现问题

python - 使用重新编码自动连接 FFMPEG

ffmpeg - Wowza 错误 :Failed to play myStream; stream not found.