Примечание: я отправил тот же вопрос в stackoverflow незадолго до этого, когда я еще не нашел это сообщество. Я перепостил это, так как вопрос больше подходит для этого сообщества.
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 кадров в секунду, 29,97 тбр, 90 тыс. Тбн, 59,94 тбк
Теперь я хотел бы преобразовать этот файл в файл .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 кадров в секунду, 59,94 тбр, 90 тыс. Тбн, 59,94 тбк . Хотя ffmpeg только что скопировал видеопоток, частота кадров и временная база были изменены в двойное значение .
Поэтому, когда я открываю и воспроизводю выходной файл с помощью QuickTime Player или VLC Player, с аудио проблем нет, однако видеопоток воспроизводится неправильно. Видео воспроизводится так, что его кадр колеблется несколько раз вперед и назад.
3. Вопрос
- Как я могу преобразовать файл .MTS (AVCHD) в .mp4 с помощью ffmpeg без правильного перекодирования видеопотока H264 ?
- Как я могу сохранить исходные значения частоты кадров / временной базы (fps / tbr / tbn / tbc), когда я конвертирую контейнер с
ffmpeg
и его-vcodec copy
переключатель. - Как я могу установить значения частоты кадров / временной базы (fps / tbr / tbn / tbc) с помощью параметров командной строки ffmpeg без перекодирования видеопотока.
Есть идеи?
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. Remux используя MP4Box
Я попробовал demux и remux, используя MP4Box, по совету профессора Спарклса.
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 кадров в секунду, 29,97 кадров в секунду, 30 тысяч тонн в секунду, 59,94 тонн в секунду . Они совпадают с исходным потоком, за исключениемtbn
(значение временной базы из контейнера).
Однако при воспроизведении выходного файла с помощью Quicktime Player или VLC видео воспроизводится с половинной скоростью .
Хотя исходный файл имеет 90k tbn
(90000 тиков в секунду), а новый выходной файл из MP4Box имеет 30k tbn
значение, равное одной трети первоначального, выходной файл воспроизводится с половинной скоростью.
Я не знаю причину почему. Но я думаю, что остальная проблема заключается в том, как я могу настроить tbn
значение.
5-б. Отчет MediaInfo о выходном файле
Я также попробовал инструмент MediaInfo для выходного файла, сгенерированного 5. Remux, используя MP4Box . Выходные данные здесь: https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a
6. Попытка avconv
Володя сообщил, что 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 кадров в секунду, 59,94 тбр, 90 тыс. Тбн, 59,94 тбн
Выходной файл хорошо воспроизводился с VLC Player, как сообщил Володя. Тем не менее, открыв его с помощью Quicktime Player X, видео воспроизводилось с нормальной скоростью, но его кадр несколько раз задвигался назад.
7. Почему работает приложение «Бесплатный AVCHD to MOV»?
Как я уже упоминал в моем предыдущем комментарии , функция «rewrap to MOV» в бесплатном приложении AVCHD to 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 и конвертирования. Но результат был таким же, как сообщалось до сих пор .
Как бы то ни было, это замечательное приложение решило мою проблему «Как я могу преобразовать файл .MTS (AVCHD) в .mp4 без перекодирования видеопотока H264?», За исключением «to .mp4» и «с помощью ffmpeg». Но мне все еще интересно, почему это приложение хорошо работает, а ffmpeg - нет.