【问题标题】:How can I convert .MTS file (AVCHD) to .mp4 by ffmpeg without re-encoding H264 video stream correctly?如何在不正确重新编码 H264 视频流的情况下通过 ffmpeg 将 .MTS 文件 (AVCHD) 转换为 .mp4?
【发布时间】:2014-09-03 09:32:09
【问题描述】:

我在后来发现的另一个社区视频制作上发布了同样的问题,这似乎是这个问题的更好地方:

请参阅:https://video.stackexchange.com/questions/12156/how-can-i-convert-mts-file-avchd-to-mp4-by-ffmpeg-without-re-encoding-h264-v/


1。我尝试了什么

我有一些 .MTS(AVCHD 格式)文件用我的 AVCHD 相机录制。其规格如下图:

$ ffprobe 140612_Canon-00000.MTS 
ffprobe version 2.2.1 Copyright (c) 2007-2014 the FFmpeg developers
(snip)
Input #0, mpegts, from '140612_Canon-00000.MTS':
  Duration: 00:48:58.40, start: 0.800300, bitrate: 5563 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), 
      yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 
      29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 
      stereo, fltp, 256 kb/s

注意帧率/时基部分:29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc

现在我想将此文件转换为 .mp4 文件,而不重新编码 H264 视频流,另一方面,将其音频流转码为 AAC。 所以我尝试了以下命令:

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4

2。结果

输出文件的规格如下:

$ ffprobe 140612_Canon-00000.MTS.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.33.100

  Duration: 00:01:00.04, start: 0.021333, bitrate: 4590 kb/s

    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
        1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s, 
        59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler

    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 
        48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

看帧率/时基部分:59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc。 虽然 ffmpeg 只是复制了视频流,但帧率和时基已更改为两倍值

所以,当我使用 QuickTime Player 或 VLC Player 打开和播放输出文件时, 音频没有问题,但是视频流播放不正确。 播放视频时,其帧反复颤抖地向前和向后。

3。问题

  1. 如何在不正确重新编码 H264 视频流的情况下通过 ffmpeg 将 .MTS 文件 (AVCHD) 转换为 .mp4
  2. 当我使用ffmpeg 及其-vcodec copy 开关转换容器时,如何保持原始帧速率/时基值 (fps/tbr/tbn/tbc)
  3. 如何在不重新编码视频流的情况下通过 ffmpeg 的命令行选项设置帧速率/时基值 (fps/tbr/tbn/tbc)

有什么想法吗?

【问题讨论】:

    标签: ffmpeg h.264 mpeg2-ts


    【解决方案1】:

    这里是:

    ffmpeg -i input.m2ts -c:v copy -c:a aac -strict experimental -b:a 128k output.mp4
    

    这只会复制视频流而不重新编码并将音轨编码为 AAC VBR 立体声,它需要最新的 FFmpeg 版本。

    【讨论】:

    • 为什么当我省略-c:v copy 时输出大小会显着减小?质量(据我所知)是一样的。
    • 这是因为它正在被编码,“-c”标志定义了要使用的编解码器,“-c:v”定义了视频编解码器,你可以在这里找到更多关于编码的信息:@987654321 @
    • 仅供参考:您可能还想补充一点,MTS 通常使用 ac3 编码。要直接提取 ac3 音频,请使用 ffmpeg -i ${INPUT}.MTS -vn -acodec copy ${OUTPUT}.ac3
    • 确实,BTW ac3to 是一个很好的解复用工具,这是我几年前写的完整指南github.com/rodrigopolo/brripguide/blob/master/guide_en.md
    • 我给了这个命令 {ffmpeg -i input.m2ts -c:v copy -c:a aac -strict experimental -b:a 128k output.mp4} 但输出文件的大小仍然是和输入文件一样大。任何建议如何减少输出文件的大小?
    【解决方案2】:

    由于我们总是需要合并多个文件,因此我发现以下命令有助于执行此操作。 $ ffmpeg -i "concat:$(echo *.MTS | tr ' ' '|')" out.mp4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-23
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多