Як я можу конвертувати .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 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. Як я можу перетворити файл .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. Ремокс за допомогою 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 fps, 29,97 tbr, 30k tbn, 59,94 tbc . Вони відповідають початковому потоку, за винятком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 fps, 59,94 tbr, 90k tbn, 59,94 tbc

Як повідомляв Володя, вихідний файл відтворювався на VLC Player . Однак, відкриваючи його за допомогою програми Quicktime Player X, відео відтворювалося із звичайною швидкістю, але з тим, що кадр назад тривожно повторювався.


7. Чому працює програма "Безкоштовний AVCHD для MOV"?

Як я вже говорив в моєму попередньому коментарі , Free AVCHD на 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" та "by ffmpeg". Але мене все ще цікавить, чому це додаток добре, але ffmpeg - ні.


Що ви маєте на увазі під «правильно»? Можливо, видаліть це з назви. Я хотів би допомогти, але ніколи не використовував ffmpeg. Я просто використовую засоби кодування інструментів Adobe.
eLouai

@eLouai Добре, я зафіксував заголовок.
kaorukobo

Відповіді:


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, щоб його відтворити. Він на Mavericks (10.9.4), і це чудово зіграло із програмою QuickTime Player 10.3 (727.4).

На даний момент це може бути проблема з певним програвачем або проблема з налаштуваннями конфігурації на комп'ютері. І, мабуть, найкраще спробувати оновити до новітньої версії QTP, можливо, спочатку видаливши поточну версію та повністю витерши стару конфігурацію.

Інша можливість

Коли у мене була стара машина, у мене були неправильні відтворення файлів з високим бітрейтом у деяких програвачах, і це було специфічно для контейнера. Наприклад, VLC відмовиться відтворювати файл MTS, він покаже кадр, а потім покаже наступний лише через секунду та половину. Відео GNOME відтворили це чудово. Але коли перетворювали його на MKV, обидва гравці грали його досить добре. Це, можливо, питання чогось подібного. Гравець, можливо, читає певний контейнер (MP4 в даному випадку) таким чином, що вимагає достатньо часу процесора, щоб він почав задихатися. Ефект ривка може бути віднесений до того, що підпроцес займає завершення процесора, і гравець скидає всі кадри, які дуже швидко відстають, після цього знову починається поганий підпроцес, і цикл продовжується.

У цій можливості найкращим варіантом все ж є спробувати оновити програмне забезпечення. З поточними багатоядерними процесорами було б важко перевірити необхідність оновлення апаратного забезпечення, фактично не отримуючи його, але, можливо, можна переглянути завантаження процесора під час використання QuickTime Player та порівняти його з VLC. Якщо ви бачите 100% для будь-якого одного ядра з QTP, це, можливо, свідчить про це.


Навряд чи avconv зробить для нього іншу роботу. avconv - це fork ffmpeg, і ffmpeg об'єднує багато файлів з проекту avconv у ffmpeg, основні виправлення помилок, подібні, можливо, будуть присутні у ffmpeg.
PTS

@ProfessorSparkles Я думаю, що той факт, що він працював тут, є достатнім ґрунтом, щоб повірити в інше. Я зачекаю, щоб побачити, що каорукобо каже.
v010dya

@Volodya Дякуємо за вашу інформацію. Я додав звіт із спробою avconv до свого запитання.
kaorukobo

@kaorukobo Що саме ви маєте на увазі під "тим, що кадр назад тривожно повторюється"? Чи тремтить вихід чи це якимось чином стрибає вперед і назад?
v010dya

@Volodya Я думаю, що ваш вираз правильний. Бачити - вірити. Я завантажив отриманий Canon-00006.MTS.mp4 на fileropper.com/canon-00006mts Якщо ви не заперечуєте, будь ласка, спробуйте відтворити цей файл із програмою QuickTime Player (якщо у вас Mac ...), а не VLC.
kaorukobo

5

Відповідно до цієї помилки ffmpeg

Переплетені пакети H.264 розділені, викликаючи MP4 STTS

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

Повідомляється тут невідповідність частоти кадрів, як видається, є результатом ffmpeg муксингу переплетених потоків 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

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)
kaorukobo

О так, це був інший кодер, вибачте за цю помилку.
PTS

Дивіться мою редакцію відповіді.
PTS

Знову дякую. Я редагував своє запитання, щоб додати результат, спробувавши вашу пораду. На жаль, проблема все-таки була ..
kaorukobo

Що стосується вашої відповіді на моє третє запитання, то це все нормально для випадку, коли я хотів би змінити частоту кадрів відеопотоку, а не лише "значення". Однак у моєму випадку "set framerate/timebase values"означає просто переписати значення, розміщені на заголовку контейнера / кодека-потоку. Чому? Існує кілька випадків, які мають бути вирішені: випадок, коли який-небудь кодер (наприклад, транскодер h264 Apple Compressor) вводить у відеопотік неправильне значення часової бази (tbc), і такий випадок, як цей питання, що ffmpeg вводить неправильні значення кадрів / часової бази, які є відрізняється від оригінальних відеофайлів.
kaorukobo

2

Я знаю, що це давнє питання, але воно просто з’явилося знову у стрічці, тому воно для мене нове. (-:

Одне, що я не бачу згаданого, - це порядок на місцях. Це переплетений файл, тож це врахування. ОП згадує рамки "тремтіння вперед-назад", які завжди є прапором для неправильного порядку впорядкування. Якщо з іншим відео це нормально, окрім "тремтіння", спробуйте додати все, що потрібно ffmpeg, щоб змусити "перше верхнє поле", то навпаки, якщо це все-таки неправильно. Я недостатньо знайомий з деталями ffmpeg, щоб дати точні прапори для цього.


Я хочу спробувати виконати кілька команд ffmepg на вашу відповідь. Однак, у моїй версії 2.2.1 ffmpeg, здається, немає параметрів, які б обробляли порядок роботи в полі. Я спробував, ffmpeg -h|egrep 'field|first'але це нічого не показує. У попередній версії (0.8.6) ffmpeg була -topопція, яка може її обробляти.
kaorukobo

@kaorukobo Інтернет пропонує це: -vf "fieldorder = bff" або = tff, де t і b посилаються на верхню і нижню відповідно. Опція top = 1/0, очевидно, використовується для зміни порядку, в якому поля читаються, а не записуються. Знову я використовую ffmpeg / avconv лише випадково, тому жодних гарантій.
Джим Мак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.