ffmpeg - 加入具有不同时基的两部电影

T4n*_*10r 3 video ffmpeg

我有来自两个视频源的数百部电影。一种是 25 fps 的 MP4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'MAH00607.MP4':
  Metadata:
    major_brand     : MSNV
    minor_version   : 22675568
    compatible_brands: MSNVmp42isom
    creation_time   : 2017-06-14T20:20:24.000000Z
  Duration: 00:00:12.48, start: 0.000000, bitrate: 2795 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/iec61966-2-4), 1280x720 [SAR 1:1 DAR 16:9], 2664 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2017-06-14T20:20:24.000000Z
      handler_name    : Video Media Handler
      encoder         : AVC Coding
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      creation_time   : 2017-06-14T20:20:24.000000Z
      handler_name    : Sound Media Handler
Run Code Online (Sandbox Code Playgroud)

其次是 AVI 29.81 fps

[avi @ 0x561e6733c640] non-interleaved AVI
Input #0, avi, from 'V-0018.AVI':
  Duration: 00:00:11.04, start: 0.000000, bitrate: 4571 kb/s
    Stream #0:0: Video: mjpeg (MJPG / 0x47504A4D), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 4515 kb/s, 28.18 fps, 28.18 tbr, 28.18 tbn, 28.18 tbc
    Stream #0:1: Audio: pcm_u8 ([1][0][0][0] / 0x0001), 8000 Hz, 1 channels, u8, 64 kb/s
Run Code Online (Sandbox Code Playgroud)

在连接电影之前,我使用此脚本转换它们。我的结果是最终的连续电影时间不正确,并且在 AVI 电影(按顺序排列的第一个)完成后 - 电影冻结。我将尝试使用不同时基的 FFmpeg - Concat 视频和 Mulvya 建议重新编码 avi 文件但没有成功。

你能提出其他解决方案吗?

Har*_*rry 8

对于连接视频,有一些属性必须相等。因此,在执行 concat 之前,您最好“规范化”或“格式化”所有输入以共享这些属性:

  • 视频分辨率(例如 -vf scale=1280x720)
  • 视频帧率(帧率不需要匹配,但时间刻度。-video_track_timescale 60000)
  • 视频隔行(例如使用 -vf yadif 去隔行)
  • 视频像素格式(例如 -vf 格式=yuv420p)
  • 视频编解码器(例如 -c:v libx264)
  • 音频采样率(例如 -ar 48000)
  • 音频通道和轨道/布局(例如 -map 0:1 -ac 2)
  • 音频编解码器(例如 -c:a aac)

您应该能够通过在“规范化”ffmpeg 命令行上指定所有这些参数来做到这一点。如果您没有明确指定一个参数,ffmpeg 将尝试从输入流中复制该参数,这将再次为您提供不同的格式。

一个好的开始可能是这样的:

ffmpeg -i %SOURCEFILE% -map 0:0 -map 0:1 -ac 2 -c:a aac -ar 48000 -vf format=yuv420p,scale=1280x720,yadif  -video_track_timescale 60000 -c:v libx264 "%OUTPUT%.mp4"
Run Code Online (Sandbox Code Playgroud)

以上未经测试,但它让您大致了解 cmd 的外观。-codec copy 顺便说一句,鉴于您在输入时收到完全未知的文件,您根本无法使用它。

在您的所有输入似乎共享上述所有参数后,您应该能够继续使用 concat。

  • 但是,按照您的命令强制输出帧速率可​​能会导致丢帧/重复帧。最好跳过该步骤并为 MP4/MOV 输出插入“-video_track_timescale <一些较大的静态值>”。 (2认同)