如何使用ffmpeg将.MTS文件(AVCHD)转换为.mp4,而无需正确重新编码H264视频流?

35

我之前在另一个社区 视频制作 上发过同样的问题,后来发现那里可能更适合这个问题:

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


1. 我尝试过的方法

我有一些用我的 AVCHD 相机录制的.MTS(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),而不重新编码视频流?

有什么想法吗?

2个回答

51

就在这里:

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

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


1
当我省略-c:v copy时,为什么输出大小会显著减小?质量(据我观察)是相同的。 - Emadpres
这是因为正在进行编码,"-c"标志定义要使用的编解码器,"-c:v"定义视频编解码器,您可以在此处找到更多有关编码的信息: https://trac.ffmpeg.org/wiki/Encode/H.264 - Rodrigo Polo
顺便提一下,MTS通常使用AC3编码。要直接提取AC3音频,请使用ffmpeg -i ${INPUT}.MTS -vn -acodec copy ${OUTPUT}.ac3 - Brian
确实,顺便说一句,ac3to是一个很棒的解复用工具,这里是我几年前写的完整指南 https://github.com/rodrigopolo/brripguide/blob/master/guide_en.md - Rodrigo Polo
1
我输入了以下命令 {ffmpeg -i input.m2ts -c:v copy -c:a aac -strict experimental -b:a 128k output.mp4},但输出文件的大小与输入文件一样大。您有什么建议可以减小输出文件的大小吗? - vincent
此答案是“无需重新编码”,用于编码目的:https://trac.ffmpeg.org/wiki/Encode/H.264 - Rodrigo Polo

4

由于我们经常需要合并多个文件,我发现以下命令可以帮助完成此任务。

$ ffmpeg -i "concat:$(echo *.MTS | tr ' ' '|')" out.mp4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接