使用 ffmpeg 连接两个 mp4 文件而不会降低质量

24 ffmpeg

我想使用 ffmpeg 连接 2 个视频。我在用:

ffmpeg -i output1.mp4 -scodec copy -vbsf h264_mp4toannexb i0.ts
Run Code Online (Sandbox Code Playgroud)

但是我得到的 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
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

llo*_*gan 42

考虑使用concatdemuxer。通过这种方式,您可以避免创建临时的、有损的中间文件,并跳过重新编码的额外步骤。

注意:所有输入必须具有相同的流类型(相同的格式、相同的时基等)。

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

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在您可以使用concat分路器:

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

如果您没有此功能,那么要么您的 ffmpeg 太旧,要么您使用的是来自 libav fork 的“假”ffmpeg。

易于使用的静态构建可通过FFmpeg 下载页面用于 Linux、OS X 和 Windows ,或者您可以按照分步指南来编译 ffmpeg

另见:


Hac*_*ron 8

最快的 1-liner 将是:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)

  • 在 Linux 上我使用了这个 oneliner:`ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output .mkv`(mkv 接受比 mp4 更多的编解码器,但您也可以尝试使用 mp4)。`-safe 0` 用于抱怨 **Unsafe file name** 的最新 ffmpeg 版本,而 `-type f` 仅用于列出文件。我加了`| sort` 按字母顺序对文件进行排序;因为 find 会按照保存在文件系统中的顺序读取它们。也适用于带有空格的文件。 (2认同)