ffmpeg 在命令行中使用 ffmpeg 连接两个 mp4 文件

Fab*_*ias 43 ffmpeg command-line

我可以使用以下命令成功加入多个文件:

ffmpeg -f concat -i input.txt -codec copy output.mp4
Run Code Online (Sandbox Code Playgroud)

此命令的唯一问题是您需要从名为input.txt的文本文件中读取文件路径,其内容如下:

file 'C:\Users\fabio\Downloads\Super\Sharks\01.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\02.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\03.mp4'
Run Code Online (Sandbox Code Playgroud)

有没有办法实现相同的目标而不必从文件中读取文件路径?我尝试了以下但没有运气:

ffmpeg -f concat -i file "C:\a\b\01.mp4" file "C:\a\b\02.mp4" -codec copy output.mp4
ffmpeg -f concat -i "C:\a\b\01.mp4" "C:\a\b\02.mp4" -codec copy output.mp4
Run Code Online (Sandbox Code Playgroud)

我必须使用不同的命令吗?

Car*_*ing 51

2019 更新:

正如评论中提到的,Stack Overflow 对可用的连接选项进行了很好的描述,并根据您使用的文件类型讨论了使用哪种方法:

如何使用 FFmpeg 连接两个 MP4 文件?

2016 年原答案:

您应该能够使用concat 协议方法来组合文件:

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

此外,FFmpeg 手册讨论了一种专门针对 MP4 文件的方法,以便无损地连接它们,但要求您创建临时文件(或命名管道):

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
Run Code Online (Sandbox Code Playgroud)

  • 第一个命令对我不起作用。它只是复制了第一个文件。 (39认同)
  • 这不起作用,它只是将第一个文件复制到 `output.mp4`。 (10认同)
  • 文件级连接对 MP4 不起作用,因此不建议将此格式使用 concat 协议,并且通常不会起作用。 (4认同)

Qwe*_*tiy 9

您可以通过将列表输出到ffmpegstdout并从中读取列表来将文件替换为列表stdin

(echo file 'a.mp4' & echo file 'b.mp4') | ffmpeg -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -vcodec copy -acodec copy "result.mp4"
Run Code Online (Sandbox Code Playgroud)

  • 这是我搜索数小时后找到的最佳答案,它甚至适用于 shell 脚本。 (3认同)