我试图连接三个 .mp3 音频文件合而为一 .m4a 文件和这个ffmpeg命令工作。
.mp3
.m4a
输入命令:
ffmpeg -i input1.mp3 -i input2.mp3 -i input3.mp3 -filter_complex concat=n=3:v=0:a=1 -f MOV -vn -y input.m4a
含义: 的 “-filter_complex concat = n = 3:v = 0:a = 1” 强> :
的 CONCAT 强> 表示使用媒体连接(连接)功能。 的 ñ 强> 表示确认输入文件的总数。 的 v 强> 手段 有视频 ?使用0 =没有视频,1 =包含视频。 的 一个 强> 手段 有音频 ?使用0 =无音频,1 =包含音频。 的 -F 强> 表示强制设置文件格式(要查看所有支持的格式,请使用 ffmpeg -formats ) 的 -vn 强> 意味着禁用视频(以及 -an 如果不想要会禁用音频) 的 -y 强> 表示覆盖输出文件(如果输出文件已存在)。
ffmpeg -formats
-an
有关更多信息:使用 ffmpeg -h full 打印所有选项(包括所有格式和编解码器特定选项,非常长)
ffmpeg -h full
经过各种尝试下面的脚本在Windows 10 PowerShell上为我工作。
$files=Get-ChildItem -path e:\ -Filter *.mp4 $files| ForEach-Object {"file '$($_.FullName)'"}| Out-File -FilePath e:\temp.txt -Encoding ASCII if (-not (test-path "e:\ffmpeg\bin\ffmpeg.exe")) {throw "e:\ffmpeg\bin\ffmpeg.exe needed"} E:\ffmpeg\bin\ffmpeg.exe -safe 0 -f concat -i "e:\temp.txt" -c copy -bsf:v hevc_mp4toannexb -an e:\joined.mp4 # Conversion Cleanup Remove-Item e:\temp.txt
这里前两行创建一个文本文件temp.txt,其中包含以下内容
file 'e:\first.mp4' file 'e:\second.mp4'
第3行,第4行检查ffmpeg是否在路径中可用并创建“joined.mp4”
与其他答案的主要区别如下
usage of -bsf:v hevc_mp4toannexb -an
对于我上面的mp4文件,您可能需要使用其他替代方案,具体取决于您的视频编码。
h264_mp4toannexb
所有这些可能的比特流过滤器都可以在 https://ffmpeg.org/ffmpeg-bitstream-filters.html
我发现在使用选项3在接受的答案中在Mac上连接多个MP4时,管道操作员对我不起作用。
以下单行程序在Mac(High Sierra)上工作以连接mp4s,无需创建中间文件。
ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
ffmpeg \ -i input_1.mp4 \ -i input_2.mp4 \ -filter_complex '[0:v]pad=iw*2:ih[int];[int][1:v]overlay=W/2:0[vid]' \ -map [vid] \ -c:v libx264 \ -crf 23 \ -preset veryfast \ output.mp4
FFmpeg有三种串联方法。
ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv \ -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] concat=n=3:v=1:a=1 [v] [a]" \ -map "[v]" -map "[a]" output.mkv
请注意,此方法执行重新编码。
$ cat mylist.txt file '/path/to/file1' file '/path/to/file2' file '/path/to/file3' $ ffmpeg -f concat -i mylist.txt -c copy output
对于Windows :
(echo file 'first file.mp4' & echo file 'second file.mp4' )>list.txt ffmpeg -safe 0 -f concat -i list.txt -c copy output.mp4
ffmpeg -i "concat:input1|input2" -codec copy output
由于这些格式的性质以及通过此方法执行的简单连接,此方法不适用于许多格式,包括MP4。
的 concat过滤器 强> :如果您的输入没有相同的参数(宽度,高度等),或者格式/编解码器不相同,或者您想要执行任何过滤,请使用此选项。 (您可以仅重新编码不匹配的输入,以便它们共享相同的编解码器和其他参数,然后使用concat解复用器来避免重新编码其他输入)。
的 concat demuxer 强> :当您想要避免重新编码和格式时使用 不支持文件级别连接(一般用户使用的大多数文件不支持文件级别连接)。
的 concat协议 强> :与支持文件级别连接的格式一起使用 (MPEG-1,MPEG-2 PS,DV)。不要与MP4一起使用。
如果有疑问,请尝试使用concat demuxer。
这是一个快速(不到1分钟)和无损的方式来做到这一点,而不需要中间文件:
ls Movie_Part_1.mp4 Movie_Part_2.mp4 | perl -ne 'print "file $_"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
“ls”包含要加入的文件 “perl”将连接文件即时创建到管道中 “-i - ”部分告诉ffmpeg从管道读取
(注意 - 我的文件中没有空格或奇怪的东西 - 如果你想用“硬”文件做这个想法,你需要适当的shell转义)。
对于 .mp4 文件,我发现使用opensource命令行工具更好,更快: mp4box 。然后你可以这样使用它:
.mp4
mp4box
mp4box.exe -add video1.mp4 -cat video2.mp4 destvideo.mp4
在大多数平台上下载: https://gpac.wp.imt.fr/mp4box/
这对我有用(在Windows上)
特别是
ffmpeg -i "concat:01.mp4|02.mp4" -codec copy output.mp4
使用一些python代码来执行与mp4一样多的文件夹 导入glob 进口口
stringa = "" for f in glob.glob("*.mp4"): stringa += f + "|" os.system("ffmpeg -i \"concat:" + stringa + "\" -codec copy output.mp4")
我最终使用mpg作为中间格式并且它有效(注意这是一个危险的例子,-qscale 0将重新编码视频......)
ffmpeg -i 1.mp4 -qscale 0 1.mpg ffmpeg -i 2.mp4 -qscale 0 2.mpg cat 1.mpg 2.mpg | ffmpeg -f mpeg -i - -qscale 0 -vcodec mpeg4 output.mp4