如何在 Ubuntu 上合并多个(超过两个)视频?

Dhr*_*gal 70 command-line video vlc ffmpeg mencoder

我想以每个二十 (20) 的批量大小合并视频。我正在运行 Linux 机器。视频为 mp4 格式,质量中等。有些甚至丢失了音频流。到目前为止,我已经试过ffmpegmencodercvlc/vlcMP4Box。我想编写一个命令行脚本来实现这一点,因为我正在做批处理。

主要问题是我尝试的一些解决方案适用于两个视频,一些适用于带有音频流的视频,而另一些适用于我的视频集的其他一些子集。但是,我一直无法为这项任务找到一个全面的解决方案。

小智 62

我正在使用mkvmerge将多个 MP4 文件合并为一个:

mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4
Run Code Online (Sandbox Code Playgroud)

  • 要安装“mkvmerge”,请执行“sudo apt install mkvtoolnix” (7认同)
  • 输出文件最好使用扩展名 `.mkv`,因为它是一个 Matroska 容器,不管你提供什么扩展名。 (4认同)
  • 以下是安装 `mkvmerge` 的方法:[tipsonubuntu.com](http://tipsonubuntu.com/2017/06/27/mkvtoolnix-13-0-0-released-install-ubuntu/) (2认同)
  • 只有这个命令 mkvmerge 有效。所有 ffmpeg 至少都因音频移位而失败。 (2认同)

May*_*hux 42

您可以使用ffmpeg

ffmpeg -i concat:"input1.mp4|input2.mp4" output.mp4
Run Code Online (Sandbox Code Playgroud)

参考和更多信息

  • 不要使用 concat 协议来连接 MP4。它仅适用于大多数普通用户不会遇到的某些格式。改用 [concat demuxer 或 concat filter](http://trac.ffmpeg.org/wiki/Concatenate)。 (7认同)
  • 我试着这样做。问题在于它没有给出适当的输出。1.音轨混乱。2. 视频轨道有一些干扰。 (4认同)
  • 与支持文件级连接的格式(MPEG-1、MPEG-2 PS、DV)一起使用。请勿与 MP4 一起使用。来源:/sf/ask/513326271/ (2认同)

小智 22

创建一个文件 files.txt,其中包含您要以以下形式连接的所有文件(以 # 开头的行将被忽略):

# this is a comment
file 'file1.mp4'
file '/path/to/file2.mp4'
file 'file3.mp4'
Run Code Online (Sandbox Code Playgroud)

请注意,这些可以是相对或绝对路径。然后您可以流式复制或重新编码您的文件:

ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)


Dhr*_*gal 11

这解决了这个问题:https : //stackoverflow.com/a/22324018/5014767

melt是一个很好的命令行实用程序。 是页面

从评论中编辑:解决我的问题的命令是这个 melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264


Raw*_*Bag 5

我写了一个小 shell 脚本来连接 MP4,而无需使用 ffmpeg 进行转码。

for f in $(ls *.MP4); do
    ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
done

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")

ffmpeg -i "concat:$CONCAT" -c copy -bsf:a aac_adtstoasc output.mp4

rm *.ts
Run Code Online (Sandbox Code Playgroud)

这会在 MPEG 容器中创建中间文件,然后将它们连接成 MP4。

  • 请务必注意,如果任何文件名包含空格或在某些情况下包含特殊字符,则此脚本将失败。对于循环,最好只使用 `for f in *.MP4` 而不使用 `ls`。(出于几个重要原因,您应该始终避免在脚本中使用 `ls`;还有更好的选择。)此外,对变量使用引号,除非您_确定_没有空格或其他特殊字符,因此 `"${f }"`(或只是`"$f"`)而不是未加引号的`$f`。 (2认同)