我正在尝试使用 ffmpeg 将三个视频文件(每个 16 秒长)合并到一个文件中。由于它们是 mpeg 格式,我只是尝试使用 cat
将它们连接到一个文件中。命令。问题是当我运行生成的文件( video.mpg
)时,它被报告为大约 16 秒长(与第一个连接的视频相同)。有趣的是,当我在 VLC 中播放文件时,我可以观看整个 48 秒的视频,即使视频进度条也最多只报告 16 秒。
使用 cat
添加另外两个视频后,文件“属性”(例如持续时间等)似乎没有更新。命令。
希望有任何关于我如何解决这个问题的建议。
以下是我创建的 BASH 脚本的相关部分:
mkfifo intermediate1.mpg
mkfifo intermediate2.mpg
mkfifo intermediate3.mpg
ffmpeg -i "./tmp/final01.mp4" -qscale 1 -y intermediate1.mpg < /dev/null &
ffmpeg -i "./tmp/final02.mp4" -qscale 1 -y intermediate2.mpg < /dev/null &
ffmpeg -i "./tmp/final03.mp4" -qscale 1 -y intermediate3.mpg < /dev/null &
echo "[audioforge] Stitching files "
cat intermediate1.mpg >> ./tmp/video.mpg
cat intermediate2.mpg >> ./tmp/video.mpg
cat intermediate3.mpg >> ./tmp/video.mpg
# Convert back to mp4 format.
ffmpeg -i "./tmp/video.mpg" -qscale 1 -y "./tmp/video.mp4"
最佳答案
看起来您还没有“等待”所有转换完成。
使用命令wait
在 3 行 ffmpeg 之后(这些行,在后台运行)
我不确定确切的语法,但很容易理解。
另外,你必须只使用fifo吗?你可以在/tmp 中使用一个简单的文件;除非它会占用一个非常大的空间。
编辑:由于 fifo 固有的阻塞 I/O 特性,可能不需要等待命令;但是,正因为如此,您无法在并行转换 3 个文件时实现所需的并行性。在转换输出文件的前 4k(或任何您的 fifo 大小)后,2(第 2 和第 3)个转换命令将停止,直到从 fifo 读取数据。
关于bash - 在 BASH 脚本中连接视频文件后报告错误的视频时长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13360099/