注意:不久之前,当我还没有找到这个社区时,我向stackoverflow发布了相同的问题。我重新发布此问题,因为该问题更适合该社区。
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只是复制了视频流,但帧速率和时基已更改为value的两倍。
因此,当我使用QuickTime Player或VLC Player打开并播放输出文件时,音频没有问题,但是,视频流无法正确播放。播放视频时,其帧反复向前和向后颤抖。
3.问题
- 如何在不正确重新编码H264视频流的情况下通过ffmpeg将.MTS文件(AVCHD)转换为.mp4?
- 使用和转换容器时,如何保持原始帧速率/时基值(fps / tbr / tbn / tbc)。
ffmpeg
-vcodec copy
- 如何通过ffmpeg的命令行选项设置帧速率/时基值(fps / tbr / tbn / tbc),而无需重新编码视频流。
有任何想法吗?
4.添加-r 29.97
选项
斯帕克斯教授给我一个建议-r 29.97
。我尝试过:
ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
但是,输出文件的帧率/时基仍然错误:
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, 11988 tbn, 59.94 tbc (default)
5.使用MP4Box重混
根据Sparkles教授的建议,我使用MP4Box尝试了多路复用和remux。
brew install mp4box
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
-vcodec copy -an 140612_Canon-00000.MTS.h264
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
-vn -acodec libfaac -ab 128k 140612_Canon-00000.MTS.aac
mp4box -add 140612_Canon-00000.MTS.h264:fps=29.97 \
-add 140612_Canon-00000.MTS.aac \
-new 140612_Canon-00000.MTS.mp4
输出为:
$ ffprobe 140612_Canon-00000.MTS.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
(snip)
Duration: 00:02:00.22, start: 0.000000, bitrate: 2293 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661),
yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 2228 kb/s,
29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
creation_time : 2014-07-14 00:38:23
handler_name : 140612_Canon-00000.MTS.h264:fps=29.97
- Imported with GPAC 0.5.0-rev4065
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz,
stereo, fltp, 125 kb/s (default)
看起来有点向前。看一下帧率/时基的一部分:29.97 fps,29.97 tbr,30k tbn,59.94 tbc。那些与原始流匹配,除了tbn
(容器的时基值)。
但是,当我使用Quicktime Player或VLC播放输出文件时,视频以一半速度播放。
尽管原始文件的90k tbn
速度为每秒90000次滴答声,而MP4Box的新输出文件的速度30k tbn
仅为原始值的三分之一,但输出文件的播放速度为一半。
我不知道为什么。但我认为剩下的问题是如何调整tbn
价值。
5-b。MediaInfo关于输出文件的报告
我还在5. Remux使用MP4Box生成的输出文件上尝试了MediaInfo工具。输出在这里:https : //gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a
6.尝试avconv
Volodya报告说avconv
效果很好。我还准备了用同一台摄像机录制的短样本电影文件(Canon-00006.MTS)。好的,让我们尝试:
brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4
输出文件的ffprobe信息位于此处:https ://gist.github.com/kaorukobo/5b53244ade2632ff1211 及其帧速率/时基信息如下:59.94 fps,59.94 tbr,90k tbn,59.94 tbc
据Volodya报道,输出文件在VLC Player中播放良好。但是,使用Quicktime Player X打开该视频后,该视频以正常速度播放,但其帧反复向后颤抖。
7.为什么“免费将AVCHD转换为MOV”应用程序有效?
正如我在之前的评论中提到的,将免费AVCHD转换为MOV应用程序的“重新包装为MOV”功能效果很好,即使它不是MP4而是MOV。
该软件在内部调用了自己的ffmpeg(或avconv)程序,我看到了传递给它的选项。如下图所示:
/Applications/Free AVCHD to Mov.app/Contents/Resources/bin/com.geranium-soft.convert \
-i /path/to/140710_Canon-00003.MTS \
-map 0:0 -map 0:1 -c:a libfaac -vol 256 -b:a 128k -c:v copy \
-sn -movflags faststart -threads 0 -pix_fmt yuv420p -y \
/path/to/140710_Canon-00003.mov
我尝试传递相同的选项(完全相同。我将输出容器类型设置为MOV,甚至删除了-t 60
开关。)传递给ffmpeg程序并进行转换。但结果与迄今为止报道的相同。
无论如何,这个出色的应用程序解决了我的问题,“在不重新编码H264视频流的情况下如何将.MTS文件(AVCHD)转换为.mp4吗?”,除了“到.mp4”和“通过ffmpeg”之外。但是我仍然对为什么该应用程序运行良好但ffmpeg不能运行感兴趣。