我想使用 ffmpeg 连接 2 个视频。我正在使用:
ffmpeg -i output1.mp4 -scodec copy -vbsf h264_mp4toannexb i0.ts
但我得到的 mp4 文件看起来比源文件差很多。
以下是有关这两个文件的信息
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output1.mp4':
Metadata:
major_brand : isom
minor_version : 1
compatible_brands: isom
creation_time : 2013-06-13 15:40:36
Duration: 00:00:15.72, start: 0.000000, bitrate: 2053 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 1931 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 128 kb/s
Input #0, mpegts, from 'i0.ts':
Duration: 00:00:15.64, start: 1.400000, bitrate: 1382 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: Libav
Stream #0.0[0x100]: Video: mpeg2video (Main), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 104857 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0.1[0x101](und): Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s
我怎么解决这个问题?
答案1
考虑使用concat
解复用器。这样,您可以避免创建临时的、有损的中间文件,并跳过重新编码的额外步骤。
笔记:所有输入必须具有相同的流类型(相同的格式、相同的时间基准等)。
创建一个文本文件并包含要连接(或“联接”)的每个文件的路径和名称。示例文件
input.txt
:file '/home/jenia/input1.mp4' file '/home/jenia/input2.mp4' file '/home/jenia/input3.mp4'
现在您可以使用
concat
解复用器了:ffmpeg -f concat -i input.txt -codec copy output.mp4
如果您没有此功能,则说明您的 ffmpeg 太旧了,或者您正在使用来自 libav fork 的“假”ffmpeg。
Linux、OS X 和 Windows 上可通过以下方式轻松使用静态构建:FFmpeg 下载页面,或者您可以关注编译 ffmpeg 的分步指南。
另请参阅:
答案2
最快的一行代码是:
ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4
答案3
为了回答 erik 对 Windows 单行程序的请求,这里是 llogan 的解决方案,如下所示:
(type NUL > input.txt) && (for /F "usebackq delims=" %x in (`dir /B *.mp4`) do echo file '%x' >> input.txt) && (ffmpeg -f concat -i input.txt -codec copy output.mp4)
这实际上是将以下 3 个命令粘合在一起:
input.txt
用空文件覆盖任何预先存在的文件:
type NUL > input.txt
对于每个匹配的文件*.mp4
,附加file filename.mp4
到input.txt
。
for /F "usebackq delims=" %x in (`dir /B *.mp4`) do echo file '%x' >> input.txt
最后按照 llogan 的回答所示运行 FFMPEG。
ffmpeg -f concat -i input.txt -codec copy output.mp4
答案4
*/ EDIT
ffmpeg -i "concat:File1.mp4|File2.mp4" -c:v copy -c:a copy -codec copy .\output.mp4
ffmpeg -i "concat:File_1.mp4|File_2.mp4|File_3.mp4|File_4.mp4|...| File_nn.mp4" -c:v copy -c:a copy -codec copy .\output.mp4
EDIT */
这可以通过一行完成:
>input.txt (for %x in (*.mp4)do @echo file '%~x') && ffmpeg -safe 0 -f concat -i input.txt -codec copy .\output.mp4
>input.txt
使用(命令块)输出创建/覆盖文件>input.txt (for %x in (*.mp4)do @echo file '%~x')
列出所有带有名称.扩展名的文件以使用布局输出
file '%~x'
>input.txt (for %x in (*.mp4)do @echo file '%~x')
仅当最后(块命令)执行
return 0
(由操作员&&
)时,才运行ffmpeg
命令:&& ffmpeg -safe 0 -f concat -i input.txt -codec copy .\output.mp4
您还可以使用不同的驱动程序/文件夹:
>"%temp%\input.txt" (for %x in ("d:\movies\last\*.mp4")do @echo file '%~x') && "c:\ffmepg\bin\ffmpeg.exe" -safe 0 -f concat -i "%temp%\input.txt" -codec copy "d:\movies\last\concat\output.mp4"