FFmpeg автоматически поворачивает видео при копировании только потока - PullRequest
0 голосов
/ 26 февраля 2019

Я сталкиваюсь с этой проблемой при преобразовании файла mp4 (портрет) в mkv.Используемая мной команда

ffmpeg -y -i test.mp4 -vcodec copy -acodec copy test.mkv

Выходное видео вращается на 90 градусов против часовой стрелки.Это потому, что я думаю, что боковые данные удаляются.

Side data: displaymatrix: rotation of -90.00 degrees

Входной файл test.mp4 info

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2019-02-23T11:18:50.000000Z
    com.android.version: 8.0.0
  Duration: 00:00:25.86, start: 0.000000, bitrate: 12270 kb/s
    Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 12005 kb/s, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 90
      creation_time   : 2019-02-23T11:18:50.000000Z
      handler_name    : VideoHandle
    Side data:
      displaymatrix: rotation of -90.00 degrees
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 256 kb/s (default)
    Metadata:
      creation_time   : 2019-02-23T11:18:50.000000Z
      handler_name    : SoundHandle

Повернутый выходной файл test.mkv info

Input #0, matroska,webm, from 'test.mkv':
  Metadata:
    MAJOR_BRAND     : mp42
    MINOR_VERSION   : 0
    COMPATIBLE_BRANDS: isommp42
    COM.ANDROID.VERSION: 8.0.0
    ENCODER         : Lavf58.12.100
  Duration: 00:00:25.87, start: 0.000000, bitrate: 12265 kb/s
    Stream #0:0(eng): Video: h264, yuv420p(tv, bt709, progressive), 1280x720, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 2k tbc (default)
    Metadata:
      ROTATE          : 90
      HANDLER_NAME    : VideoHandle
      DURATION        : 00:00:25.866000000
    Stream #0:1(eng): Audio: aac, 48000 Hz, stereo, fltp (default)
    Metadata:
      HANDLER_NAME    : SoundHandle
      DURATION        : 00:00:25.813000000

Преобразование повернутого mkv в mp4 снова работает нормально, и я получаю файл портрета.Сторонние данные displaymatrix снова появляются в информации о файле.

Также отлично работает преобразование того же файла mp4 в m4v путем копирования потока.

В этой записи они решили этодля с ++.Я работаю на Android и использую ffmpeg android wrapper для использования библиотеки ffmpeg.Есть ли какой-либо флаг ffmpeg для решения этой ситуации?

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Я сталкиваюсь с этой проблемой при преобразовании файла mp4 (портрет) в mkv.Используемая мной команда

ffmpeg -y -i test.mp4 -vcodec copy -acodec copy test.mkv

Выходное видео вращается на 90 градусов против часовой стрелки.Это потому, что я думаю, что боковые данные удаляются.

Когда у меня был MP4 с той же настройкой вращения (a 90 в Rotation против -90 в DisplayMatrix).Я решил эту проблему неправильное вращение с помощью опции -noautorotate до , предоставив input filename.

Solution :(без перекодирования)

ffmpeg -y -noautorotate -i test.mp4 -vcodec copy -acodec copy test.mkv

Выходной MKV выглядит точно так же, как вход MP4, без изменений.

Это решение работает в командной строке Windows, но, надеюсь, должно работать так же в вашем Android-на основе обертки FFmpeg.Удачи и дайте мне знать, если это решит вашу проблему.

PS:
Также быстрый совет, так как вы копируете оба кодека A / V, работает ли эта команда -codec copy?

ffmpeg -y -noautorotate -i test.mp4 -codec copy test.mkv
0 голосов
/ 04 марта 2019

Причина, по которой это работает в MP4 / MOV, заключается в том, что для этого формата матрицы отображения хранятся в атомах заголовка фильма (mvhd) и заголовка дорожки (tkhd).

Пример макета для mvhd, показывающий структуру матрицы:

enter image description here

Источник: Спецификация формата файла Apple QuickTime

Когда поток мультиплексируется в MKV, матрицы теряются, и мультиплексор возвращается к добавлению записи метаданных ROTATE.Вы можете увидеть это в вашем ffprobe выводе.Если поток затем мультиплексируется обратно в MP4, то метаданные используются для создания матрицы (если вы передаете -map_metadata -1 при создании MKV, информация теряется и преобразование больше не работает).

На стороне игрока нет гарантии, что он будет искать и применять вращение, указанное в теге ROTATE.Если вы хотите использовать MKV с правильной ориентацией, вам придется перекодировать, в противном случае придерживайтесь MP4.

...