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

时间:2017-11-01 07:23:29

标签: video ffmpeg

我从两个视频源获得了100部电影。一个是MP4,25 fps

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

其次是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

在结束电影之前,我使用this script转换它们。 我导致最终,连续电影有不正确的时间和AVI电影(这是第一顺序)完成 - 电影冻结。 我会尝试FFmpeg - Concat videos with different time base和Mulvya建议重新编码avi文件但没有成功。

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

PS:这两部电影都有不同的像素格式。这 - 在标准化之后 - 导致不同的h264配置文件。迫使yuvj422p(-profile:v high422 -pix_fmt yuvj422p)允许我干净地连续电影。

3 个答案:

答案 0 :(得分:3)

对于连续视频,有一些必须相同的属性。所以在执行concat之前,你最好"规范化"或"格式"您输入的所有内容都可以共享这些属性:

  • 视频分辨率
  • 视频帧率(实际帧率不需要匹配,但是时间刻度)
  • 视频隔行扫描
  • 视频色彩空间(例如YUV 4:2:0)
  • 视频编解码器
  • 音频采样率
  • 音频频道和曲目/布局
  • 音频编解码器

您应该可以通过在"规范化"上指定所有这些参数来实现此目的。 ffmpeg命令行。如果你没有明确地指定一个参数,ffmpeg将尝试从输入流中复制参数,这将再次以不同的格式结束。

一个良好的开端可能是这样的:

ffmpeg -i %SOURCEFILE% -map 0:0 -map 0:1 -c:a aac -ar 48000 -ac 2 -vf scale=1280x720 -c:v libx264 -profile:v baseline -video_track_timescale 60000 "%OUTPUT%.mp4"

上面没有经过测试,但它可以让您大致了解cmd的外观。 -codec copy就像你在输入时收到完全未知的文件一样根本无法使用的东西。

在您的所有输入显示共享所有上述参数后,您应该可以继续使用concat。

答案 1 :(得分:1)

问题是时基。 Ffmpeg在第二个流中添加了偏移量,但是即使应该也不会更改其时间戳。

我从来没有获得任何与时基相关的选项来执行任何操作。对我有用的是:复制到mkv,该视频源具有视频流的1/1000时基(ffmpeg将其报告为“ 1k tbn”)。这使所有时间戳保持一致。然后concat。

出于正常目的,webm和mkv本质上是同一件事,但是mkv接受H.264,而webm当前不接受。

请注意,由于舍入而产生的任何轻微抖动的时间戳,都可能导致丢帧或重复帧,而这些帧的fps更改滤波器设计不良。

我将这个答案粘贴到两个问题上,不知道是否允许这样做。

答案 2 :(得分:0)

首先,您有不同的视频帧率,两部电影都应转换为相等的帧速率,例如25fps。然后你就可以加入电影了。

当我为自己转换大量电影时,我使用了MediaCoder,这是一个基于GUI的工具,可用于转换多种格式。这个应用程序有一个简单的界面,所以你不应该遇到任何麻烦。

因此,您可以将其视为GUI和结果预览的良好解决方案。