使用 ffmpeg 连接两个 mp4 文件而不损失质量

使用 ffmpeg 连接两个 mp4 文件而不损失质量

我想使用 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解复用器。这样,您可以避免创建临时的、有损的中间文件,并跳过重新编码的额外步骤。

笔记:所有输入必须具有相同的流类型(相同的格式、相同的时间基准等)。

  1. 创建一个文本文件并包含要连接(或“联接”)的每个文件的路径和名称。示例文件input.txt

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. 现在您可以使用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.mp4input.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

  • 你可以用这个轻松解决这个问题回答@Gyan
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

  1. >input.txt使用(命令块)输出创建/覆盖文件

      >input.txt (for %x in (*.mp4)do @echo file '%~x')
    
  2. 列出所有带有名称.扩展名的文件以使用布局输出file '%~x'

      >input.txt (for %x in (*.mp4)do @echo file '%~x')
    
  3. 仅当最后(块命令)执行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"
    

相关内容