我可以使用以下命令成功合并多个文件:
ffmpeg -f concat -i input.txt -codec copy output.mp4
此命令的唯一问题是您需要从名为的文本文件中读取文件路径输入.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'
有没有办法实现相同的目标,而不必从文件中读取文件路径?我尝试了以下方法,但没有成功:
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
我必须使用不同的命令吗?
答案1
2019 年更新:
正如评论中提到的,Stack Overflow 对可用的连接选项进行了很好的描述,并讨论了根据您使用的文件类型使用哪种方法:
2016 年原始答案:
你应该能够使用concat 协议合并文件的方法:
ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy output.mp4
此外,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
答案2
stdout
您可以通过将列表输出到 ffmpeg并从中读取列表来用列表替换文件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"
答案3
不,似乎没有办法在不使用某些 hack 的情况下在单个命令行上使用 ffmpeg concat demuxer。您需要使用文件列表创建输入文本文件。我自己也觉得这很奇怪,也许以后有人会将其添加到 FFMpeg 中。
该问题的可接受答案使用 concat 协议,而不是 OP 所要求的 concat 解复用器。
答案4
无需外部文本文件,一行命令即可合并文件夹中的所有 MP4 文件:
在命令(命令提示符):
(FOR /R %A IN (*.mp4) DO @ECHO file '%A') | ffmpeg -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -vcodec copy -acodec copy "Videos_Merged.mp4"
在一个蝙蝠ch 文件:
(FOR /R %%A IN (*.mp4) DO @ECHO file '%%A') | ffmpeg -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -vcodec copy -acodec copy "Videos_Merged.mp4"
PS:CHCP 65001
如果目录包含unicode字符,则需要命令。
(此代码基于键盘的一行命令。我再次感谢键盘感谢他回复中的信息。所以我修复了代码。