【问题标题】:How can I reencode a video to match another's codec exactly?如何重新编码视频以完全匹配另一个编解码器?
【发布时间】:2020-01-24 19:39:18
【问题描述】:

当我在度假时,我通常使用我们的摄像机来录制视频。由于它们都是相同的格式,我可以使用 ffmpeg 将它们连接成一个大而流畅的视频,而无需重新编码。

但是,有时我会使用手机或其他相机录制视频(如果摄像机空间/电池不足或被留在酒店)。

我想确定我的摄像机使用的编解码器、帧速率等,并使用这些参数将手机视频转换为相同的格式。这样,我将能够连接所有视频,而无需重新编码摄像机视频。

使用 ffprobe,我发现我的摄像机有这样的编码:

  Input #0, mpegts, from 'camcorderfile.MTS':
  Duration: 00:00:09.54, start: 1.936367, bitrate: 24761 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDPR / 0x52504448), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 59.94 fps, 59.94 tbr, 90k tbn, 119.88 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s
    Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090), 1920x1080

手机(iPhone 5s)编码为:

  Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'mov.MOV':
  Metadata:
    major_brand     : qt  
    minor_version   : 0
    compatible_brands: qt  
    creation_time   : 2017-01-02T03:04:05.000000Z
    com.apple.quicktime.location.ISO6709: +12.3456-789.0123+456.789/
    com.apple.quicktime.make: Apple
    com.apple.quicktime.model: iPhone 5s
    com.apple.quicktime.software: 10.2.1
    com.apple.quicktime.creationdate: 2017-01-02T03:04:05-0700
  Duration: 00:00:14.38, start: 0.000000, bitrate: 11940 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 11865 kb/s, 29.98 fps, 29.97 tbr, 600 tbn, 1200 tbc (default)
    Metadata:
      creation_time   : 2017-01-02T03:04:05.000000Z
      handler_name    : Core Media Data Handler
      encoder         : H.264
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
    Metadata:
      creation_time   : 2017-01-02T03:04:05.000000Z
      handler_name    : Core Media Data Handler
    Stream #0:2(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
    Metadata:
      creation_time   : 2017-01-02T03:04:05.000000Z
      handler_name    : Core Media Data Handler
    Stream #0:3(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
    Metadata:
      creation_time   : 2017-01-02T03:04:05.000000Z
      handler_name    : Core Media Data Handler

我假设 ffmpeg 会自动采用任何可接受的视频格式,并且我只需要弄清楚输出设置。我想我需要使用-s 1920x1080-pix_fmt yuv420p 进行输出,但我还需要哪些其他标志才能使手机视频与摄像机视频的编码相同?

我能否获得一些关于如何将 ffprobe 输出转换为我需要提供给 ffmpeg 的标志的指示?

编辑:为两个媒体文件添加了整个 Input #0。

【问题讨论】:

  • 原则上多段mkv容器支持codec and resolution switching。这样您就可以按顺序连接不同的视频格式。但它是一个相当小众的功能,所以我不知道玩家对它的支持程度。
  • 除了音频编解码器和音频采样率外,您手机的所有视频参数似乎都与摄像机视频匹配。您可以使用 -c:a ac3 来实现音频兼容性。我认为这就足够了。
  • @mdasari 转换手机视频以便匹配的音频流不起作用。输出视频的长度不正确,并且我收到了很多关于Non-monotonous DTS in output stream 的警告,即使在我更改帧速率以匹配之后也是如此。要使concat 工作,还需要做更多的事情。
  • 无论如何提供一个示例 Iphone-5 视频文件?即使是拍摄墙壁或地板的 5 秒也足够了。如果有我们可以检查的可测试内容(代码、文件、链接等),您将获得更快的答案。谢谢。
  • 我想最好的方法是将两个视频都转换为一种通用格式,然后轻松地将它们与ffmpegconcat连接起来

标签: video command-line ffmpeg re-encoding


【解决方案1】:

Ffmpeg 有一个与concat 一起使用的过滤器,看起来像这样(复制自https://trac.ffmpeg.org/wiki/Concatenate):

ffmpeg -i input1.mp4 -i input2.webm -i input3.mov \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mkv

链接的网站解释了它是如何工作的。使用此功能,您不必担心比特率。程序会自动调整它。旧版本的 ffmpeg 在匹配比特率方面遇到了一些问题,但我最近用它来连接视频和动画,效果很好。不确定它是否适用于帧速率。

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多