Как я могу преобразовать файл .MTS (AVCHD) в .mp4 с помощью ffmpeg без перекодирования видеопотока H264?

20

Примечание: я отправил тот же вопрос в 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. Вопрос

  1. Как я могу преобразовать файл .MTS (AVCHD) в .mp4 с помощью ffmpeg без правильного перекодирования видеопотока H264 ?
  2. Как я могу сохранить исходные значения частоты кадров / временной базы (fps / tbr / tbn / tbc), когда я конвертирую контейнер с ffmpegи его -vcodec copyпереключатель.
  3. Как я могу установить значения частоты кадров / временной базы (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 - нет.

kaorukobo
источник
Что вы подразумеваете под "правильно"? Может быть, удалить это из названия. Я хотел бы помочь, но я никогда не использовал ffmpeg. Я просто использую Adobe Enco Tools Media Encoder.
eLouai
@eLouai Хорошо, я исправил название.
Каорукобо

Ответы:

8

Видя, что в тексте вашего вопроса вы начали обсуждать другие утилиты, я предполагаю, что вы заинтересованы не в том, чтобы придерживаться ffmpeg, а в том, чтобы выполнить работу.

По моему опыту работы с libav и MTS у меня не было проблем с частотой кадров, файлы прекрасно воспроизводились.

Я только что попробовал следующее с одним из моих файлов:

avconv -i 00174.MTS -c:a copy -c:v copy 00174.mp4

Полученный файл MP4 правильно воспроизводится с VLC.

Мой файл - прогрессивная MTS, у меня нет чересстрочной развертки, но при необходимости я могу сделать больше проверки с этим.

Отчет о проверке файла

Создатель темы смог предоставить файл, который был перенесен из MTS в MP4 и не воспроизводился на компьютере этого человека с QuickTime Player (версия неизвестна). Однако он играл с VLC-плеером этого человека.

У меня нет компьютера Mac OS, но я попробовал его с Ubuntu. Я играл в Ubuntu на VLC (2.0.8) и GNOME Videos (раньше назывался Totem) (3.8.2); оба играют отлично.

Затем я попросил моего друга, который на Mac, поиграть в него. Он на Маверикс (10.9.4), и он отлично играл с QuickTime Player 10.3 (727.4).

В настоящее время это проблема определенного проигрывателя или проблема с настройками конфигурации на компьютере. И, вероятно, лучше всего попытаться обновить его до последней версии QTP, возможно, сначала удалив текущую версию и полностью стереть старую конфигурацию.

Другая возможность

Когда у меня была старая машина, у меня были некоторые файлы с высоким битрейтом, которые проигрывались некорректно в некоторых проигрывателях, и это зависело от контейнера. Например, VLC отказывается проигрывать файл MTS, он показывает кадр, а затем показывает следующий только через полторы секунды. Видео GNOME воспроизводилось нормально. Но когда он смешался с MKV, оба игрока играли его достаточно хорошо. Это может быть вопрос о чем-то похожем. Игрок может читать конкретный контейнер (в данном случае MP4) таким образом, который требует достаточно времени процессора, чтобы он сам начал задыхаться. Эффект рывка может затем быть приписан любому подпроцессу, занимающему завершение процессора, и игрок сбрасывает все кадры, которые очень сильно отстают, после чего снова запускается плохой подпроцесс, и цикл продолжается.

При такой возможности лучшим вариантом по-прежнему является попытка обновить программное обеспечение. С существующими многоядерными процессорами было бы трудно проверить необходимость обновления аппаратного обеспечения, фактически не получая его, но, возможно, можно посмотреть на загрузку ЦП во время использования QuickTime Player и сравнить ее с VLC. Если вы видите 100% для любого ядра с QTP, это может свидетельствовать об этом.

v010dya
источник
Маловероятно, что avconv сделает для него другую работу. avconv - это ветвь ffmpeg, а ffmpeg объединяет много коммитов из проекта avconv в ffmpeg, исправления основных ошибок, подобные этому, вероятно, присутствуют в ffmpeg.
PTS
@Professorsparkles Я думаю, что тот факт, что он работал здесь, является достаточным основанием, чтобы поверить в обратное. Я буду ждать, чтобы увидеть, что говорит Каорукобо.
v010дя
@Volodya Спасибо за вашу информацию. Я добавил отчет с попыткой avconv на мой вопрос.
Каорукобо
@kaorukobo Что именно вы имеете в виду, говоря, что «его тыл задвигается многократно назад?» Дрожит ли выход или он каким-то образом прыгает вперед и назад?
v010дя
@ Володя, я думаю, что ты прав. Пока не увижу, не поверю. Я загрузил получившийся файл Canon-00006.MTS.mp4 на filedropper.com/canon-00006mts. Если вы не возражаете, попробуйте воспроизвести этот файл с QuickTime Player (если у вас Mac ...), а не с VLC.
Каорукобо
5

Согласно этой ошибке ffmpeg

Чересстрочные пакеты H.264 разбиваются, вызывая MP4 STTS

при повторном смешивании mpeg-t, содержащего чересстрочный H.264, в mp4, оба поля каждого видеокадра делятся на отдельные пакеты. Программное обеспечение, такое как Mediainfo, использует STTS для определения частоты кадров. Он будет отображаться как 50fps вместо 25fps

Представленное здесь несоответствие частоты кадров, по-видимому, является результатом мультиплексирования чересстрочных потоков MP4 в соответствии со спецификацией, согласно которому каждое поле разделяется на один пакет. И поэтому

«Программное обеспечение, которое использует количество отсчетов в файле MP4 для определения частоты кадров, просто неправильно». Комментарий 7

Это не будет исправлено, поскольку объединение пар полей в один модуль доступа нарушает спецификацию MPEG-4, и, следовательно, то же самое делают любые кодеры, которые делают то же самое.

Обратите внимание , что мультиплексирование выход, такой как показано ниже, играет отлично для меня в PotPlayer и VLC.

    ffmpeg version N-76741-g8eadabf Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)

Input #0, mpegts, from '00007.MTS':
  Duration: 00:00:07.01, start: 1.033367, bitrate: 15935 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1920x1080 [SAR 1:1 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, 5.1(side), fltp, 448 kb/s
    Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090), 1920x1080
[mp4 @ 054cf020] Codec for stream 0 does not use global headers but container format requires global headers
Output #0, mp4, to '00007.MTS.mp4':
  Metadata:
    encoder         : Lavf57.16.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 90k tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, 5.1(side), fltp, 128 kb/s
    Metadata:
      encoder         : Lavc57.15.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (ac3 (native) -> aac (native))
Press [q] to stop, [?] for help
[mp4 @ 054cf020] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[mp4 @ 054cf020] pts has no value
    Last message repeated 209 times
frame=  420 fps=0.0 q=-1.0 Lsize=   12478kB time=00:00:07.01 bitrate=14564.2kbits/s    
video:12458kB audio:6kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.111239%
[aac @ 052fd480] Qavg: 64863.176
Gyan
источник
4

Вы можете попытаться применить исходную частоту кадров с помощью -r 29.97. FFmpeg, вероятно, пытается по какой-то причине настроить частоту кадров. В противном случае ваш синтаксис правильный и не должен вызывать эту ошибку.

По поводу вашего третьего вопроса. Просто не возможно. Вы можете опустить кадры при использовании кодеков, которые кодируют кадры по отдельности, но это не относится к h264, но даже с таким кодеком вы все равно модифицируете видеопоток. То же самое касается увеличения частоты кадров, вы должны либо добавить рассчитанные кадры, либо дублировать некоторые кадры.

Изменить: Относительно дополнительной информации из комментария ниже. Если вам нужно изменить данные, записанные в заголовке формата, без записи совершенно нового файла, вы, вероятно, захотите сделать это в шестнадцатеричном редакторе. FFmpeg имеет только возможность изменять метаданные, которые не включают данные потока. Как и где вносить изменения в файл, зависит от формата контейнера.

Другой вариант - демультиплексировать контейнер и повторно смешать видео и аудио поток в новый контейнер с указанными вами параметрами. Сколько вы можете указать снова зависит от формата контейнера. Инструмент MP4Box может помочь в этом, в этом случае вы можете указать частоту кадров при мультиплексировании необработанных видеопотоков в новый mp4, используя следующий синтаксис:

MP4Box -add input.h264:fps=29.97 -new output.mp4
ПТС
источник
Благодарю. Что касается -t 60переключения, это опция, чтобы указать не частоту кадров, а продолжительность обработки ( $ ffmpeg -h|grep -- -t-> -t duration record or transcode "duration" seconds of audio/video)
Каорукобо
Ах да, это был другой кодер, извините за эту ошибку.
PTS
Смотрите мое редактирование к ответу.
PTS
Еще раз спасибо. Я отредактировал свой вопрос, чтобы добавить результат, попробовав ваш совет. К сожалению, проблема все еще была ..
Каорукобо
Что касается вашего ответа на мой третий вопрос, то все в порядке, если бы я хотел изменить частоту кадров видеопотока, а не просто «значение». Однако, в моем случае, это "set framerate/timebase values"означает просто перезапись значений, помещенных в заголовок контейнера / кодека-потока. Почему? Есть несколько случаев, которые необходимо решить: случай, когда какой-то кодер (например, транскодер h264 Apple Compressor) вводит неверное значение временной базы (tbc) в видеопоток, и случай, такой как этот вопрос, когда ffmpeg вводит неправильные значения частоты кадров / временной базы, которые являются отличается от оригинальных видеофайлов.
Каорукобо
2

Я знаю, что это старый вопрос, но он снова всплыл в ленте, так что он для меня новый. (-:

Одна вещь, которую я не вижу упомянутой, является полевым заказом. Это чересстрочный файл, так что это рассмотрение. ОП упоминает кадры, «дрожащие взад и вперед», что всегда является признаком неправильного порядка полей. Если с видео все в порядке, за исключением «дрожания», попробуйте добавить все, что нужно ffmpeg, чтобы вызвать «top field first», а затем наоборот, если это все еще не так. Я недостаточно знаком с деталями ffmpeg, чтобы дать точные флаги для этого.

Джим Мак
источник
Я хочу попробовать выполнить несколько команд ffmepg для вашего ответа. Однако моя версия ffmpeg 2.2.1, похоже, не имеет опций, которые обрабатывают порядок полей. Я пытался, ffmpeg -h|egrep 'field|first'но это ничего не показывает. Предыдущая версия (0.8.6) ffmpeg имела -topопцию, которая может с ней справиться.
Каорукобо
@kaorukobo Интернет предлагает следующее: -vf "fieldorder = bff" или = tff, где t и b относятся к верхней и нижней части соответственно. Опция top = 1/0, по-видимому, используется для изменения порядка чтения, а не записи полей. Опять же, я использую ffmpeg / avconv только случайно, поэтому никаких гарантий.
Джим Мак