python - FFMPEG concat 在剪辑之间留下音频间隙

标签 python ffmpeg subprocess

我正在编写一个使用 subprocess 调用 FFMPEG 的 python 脚本,而不是使用 pyffmpeg。

我的脚本使用 AAC 音频编解码器生成可变数量的 MP4 文件,并使用 FFMPEG 将它们连接在一起。这是我构建每个剪辑的方式:

ffmpeg -loop 1 -i image.jpg -i recording.mp3 -tune stillimage -c:a aac -b:a 256k -shortest clip.mp4

我用来连接它们的命令是:
ffmpeg -f concat -i clip_names.txt -c copy video_raw.mp4

然后我拍摄生成的视频,并在其上混合循环音轨,并调整音量。 (对不起,糟糕的格式)
ffmpeg -i video_raw -filter_complex
                 "amovie=Tracks/Breaktime.mp3:loop=0,
                  volume=0.1,
                  asetpts=N/SR/TB[aud];
                  [0:a][aud]amix[a]"
-map 0:v -map [a] -b:a 256k -shortest final_video.mp4

这些命令似乎按我的意图工作。当我从本地机器播放生成的 MP4 时,一切播放都没有问题。

但是,我将视频上传到 YouTube,并遇到了问题。从 YouTube 播放视频时,在连接两个剪辑的每个时间戳处,在下一个剪辑开始之前,会有大约一秒钟的静默。我在 Chrome、IE 和 Firefox 上都试过了,都遇到了同样的问题。

根据我目前所研究的情况,我认为如何处理每个剪辑的启动样本可能是一个问题。我没有义务继续使用 MP4 或 AAC,所以如果使用不同的音频/视频编解码器效果更好,请随时提出建议!

我可以在 FFMPEG 中进行某种类型的操作来摆脱启动样本,或者以不同的方式处理它们吗?最后,我正在寻找每个剪辑来背靠背播放,而不会出现 concat 操作似乎插入的延迟。谢谢!

最佳答案

这不是由于启动样本。 -shortest不保证所有流的长度相同,因为当复用器接收到停止输出的信号时,复用队列中可能有缓冲的数据包。对于 25 fps 的视频流,1 秒的溢出似乎是正确的。有办法mitigate持续时间溢出,但我建议您获取音频的持续时间并设置 -t X按照这个并跳过-最短。

此外,使用音频编解码器保存到 MOV -c:a pcm_s16le .您将避免启动样本偏移。

关于python - FFMPEG concat 在剪辑之间留下音频间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61128138/

相关文章:

Windows 上的 Python : path as subprocess argument gets modified and generating error

python - 如何从picamera(python,opencv)中提取数组中的图像

python - Google App Engine + 表单验证

macos - 如何在 OS X 上编译静态 FFmpeg 二进制文件

python - 使用带有 Python3 子进程的 ffmpeg 将多个 PNG 转换为视频

linux - 终止子进程

python - 使用 Python 从 txt 文件中提取行

python - 如何使用二进制文件。覆盖特定字节

ffmpeg - 为什么某些方法在ffmpeg中以数字结尾

c# - 用于合并音频和视频的 FFmpeg 命令不起作用 - C#