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


16

我想使用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

我怎么解决这个问题?


您到底想做什么?术语“ concat”意味着要合并多个文件,但是您仅指的是一个输入,output1.mp4一个输出i0.ts。编码到ts输出容器将mpeg2video默认使用编码器(至少在您的内部版本中使用),并且上次我检查此编码器的默认比特率或质量设置-b:v 200k对于大多数情况而言太低了。
llogan

抱歉。然后,我用ffmpeg -i“ concat:i0.ts | i1.ts” output1111.mp4连接它们。但是问题是我制作ts文件时质量已经很差了

您可能不需要重新编码为MPEG-2视频。您所有的原始输入(output1.mp4,等)是否都具有相同的格式,帧速率和帧大小?
llogan 2013年

对,就是这样。所有人都一样

Answers:


36

考虑使用解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分支的“假” ffmpeg。

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

另请参阅:


这正是我想要的,并帮助我从iPhone 6合并了2个.mov文件。谢谢。
瑞安

7

最快的1班轮是:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4

有机会为Windows命令行获取这样的1-onliner吗?
PeterCo'9

2
在Linux上,我使用了以下oneliner :(ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkvmkv比mp4接受更多的编解码器,但您也可以在mp4上尝试使用它)。的-safe 0是最近的ffmpeg版本抱怨不安全的文件名,并且-type f仅适用于上市文件。我添加| sort了按字母顺序对文件进行排序;因为find读取它们的顺序是保存在文件系统中。也适用于带有空格的文件。
erik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.