Примечание: я отправил тот же вопрос в 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 - нет.
Ответы:
Видя, что в тексте вашего вопроса вы начали обсуждать другие утилиты, я предполагаю, что вы заинтересованы не в том, чтобы придерживаться ffmpeg, а в том, чтобы выполнить работу.
По моему опыту работы с libav и MTS у меня не было проблем с частотой кадров, файлы прекрасно воспроизводились.
Я только что попробовал следующее с одним из моих файлов:
Полученный файл 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, это может свидетельствовать об этом.
источник
Согласно этой ошибке ffmpeg
Чересстрочные пакеты H.264 разбиваются, вызывая MP4 STTS
Представленное здесь несоответствие частоты кадров, по-видимому, является результатом мультиплексирования чересстрочных потоков MP4 в соответствии со спецификацией, согласно которому каждое поле разделяется на один пакет. И поэтому
Это не будет исправлено, поскольку объединение пар полей в один модуль доступа нарушает спецификацию MPEG-4, и, следовательно, то же самое делают любые кодеры, которые делают то же самое.
Обратите внимание , что мультиплексирование выход, такой как показано ниже, играет отлично для меня в PotPlayer и VLC.
источник
Вы можете попытаться применить исходную частоту кадров с помощью
-r 29.97
. FFmpeg, вероятно, пытается по какой-то причине настроить частоту кадров. В противном случае ваш синтаксис правильный и не должен вызывать эту ошибку.По поводу вашего третьего вопроса. Просто не возможно. Вы можете опустить кадры при использовании кодеков, которые кодируют кадры по отдельности, но это не относится к h264, но даже с таким кодеком вы все равно модифицируете видеопоток. То же самое касается увеличения частоты кадров, вы должны либо добавить рассчитанные кадры, либо дублировать некоторые кадры.
Изменить: Относительно дополнительной информации из комментария ниже. Если вам нужно изменить данные, записанные в заголовке формата, без записи совершенно нового файла, вы, вероятно, захотите сделать это в шестнадцатеричном редакторе. FFmpeg имеет только возможность изменять метаданные, которые не включают данные потока. Как и где вносить изменения в файл, зависит от формата контейнера.
Другой вариант - демультиплексировать контейнер и повторно смешать видео и аудио поток в новый контейнер с указанными вами параметрами. Сколько вы можете указать снова зависит от формата контейнера. Инструмент MP4Box может помочь в этом, в этом случае вы можете указать частоту кадров при мультиплексировании необработанных видеопотоков в новый mp4, используя следующий синтаксис:
источник
-t 60
переключения, это опция, чтобы указать не частоту кадров, а продолжительность обработки ($ ffmpeg -h|grep -- -t
->-t duration record or transcode "duration" seconds of audio/video
)"set framerate/timebase values"
означает просто перезапись значений, помещенных в заголовок контейнера / кодека-потока. Почему? Есть несколько случаев, которые необходимо решить: случай, когда какой-то кодер (например, транскодер h264 Apple Compressor) вводит неверное значение временной базы (tbc) в видеопоток, и случай, такой как этот вопрос, когда ffmpeg вводит неправильные значения частоты кадров / временной базы, которые являются отличается от оригинальных видеофайлов.Я знаю, что это старый вопрос, но он снова всплыл в ленте, так что он для меня новый. (-:
Одна вещь, которую я не вижу упомянутой, является полевым заказом. Это чересстрочный файл, так что это рассмотрение. ОП упоминает кадры, «дрожащие взад и вперед», что всегда является признаком неправильного порядка полей. Если с видео все в порядке, за исключением «дрожания», попробуйте добавить все, что нужно ffmpeg, чтобы вызвать «top field first», а затем наоборот, если это все еще не так. Я недостаточно знаком с деталями ffmpeg, чтобы дать точные флаги для этого.
источник
ffmpeg -h|egrep 'field|first'
но это ничего не показывает. Предыдущая версия (0.8.6) ffmpeg имела-top
опцию, которая может с ней справиться.