Проблемы с динамическим разрешением видео: как избежать некорректной настройки после перекодирования

Как правильно перекодировать видео с несколькими разрешениями с помощью FFmpeg

Перекодирование видеофайлов — это распространенная задача, особенно когда необходимо оптимизировать файлы для работы с различными разрешениями. В данной статье мы рассмотрим, как правильно перекодировать видеоматериалы с использованием FFmpeg, чтобы избежать распространенных ошибок и сохранить качество.

Проблема с разрешением

При работе с видеофайлами у пользователей часто возникает проблема, когда FFmpeg считывает разрешение первого кадра и масштабирует все оставшиеся кадры до этого разрешения. Например, в одиночном режиме разрешение может составлять 720×1280, но при переключении на ПК оно изменяется на 900×720. При перекодировании это может привести к тому, что видео будет неправильно отображаться.

Решение проблемы с масштабированием

Для решения этой проблемы необходимо масштабировать и дополнить все видео до одного разрешения, например, 900×720. Для этого можно использовать следующую команду:

ffmpeg -y -i original.flv -vf "scale=if(lt(iw/ih,900/720),-2,900):if(lt(iw/ih,900/720),720,-2),pad=900:720:(ow-iw)/2:(oh-ih)/2,setsar=1" -c:v libx264 re-encode.mp4

Эта команда выполняет следующие действия:

  • Устанавливает ширину 900, если видео слишком широкое, иначе — сохраняетAspect Ratio.
  • Устанавливает высоту 720, если видео слишком высокое.
  • Добавляет черные поля для фиксации разрешения 900×720.

Перекодирование видео с несколькими разрешениями

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

  1. Разделите видео на сегменты:
    Используйте следующий код для разделения исходного файла:

    ffmpeg -i original.flv -c copy -f segment -segment_time 0 -segment_list list.txt -segment_list_type ffconcat %05d.flv
  2. Закодируйте каждый сегмент:
    Перекодируйте каждый сегмент с помощью кодека AV1:

    ffmpeg -y -i 00000.flv -c:v libaom-av1 -crf 32 00000.mp4
    ffmpeg -y -i 00001.flv -c:v libaom-av1 -crf 32 00001.mp4
    ffmpeg -y -i 00002.flv -c:v libaom-av1 -crf 32 00002.mp4
    ffmpeg -y -i 00003.flv -c:v libaom-av1 -crf 32 00003.mp4
  3. Редактируйте созданный list.txt:
    Замените расширение .flv на .mp4 в файле list.txt.

  4. Объедините файлы сегментов:
    Для объединения файлов воспользуйтесь следующим кодом:

    ffmpeg -y -f concat -safe 0 -i list.txt -c copy output.mp4

Проверка результатов

После выполнения всех этапов стоит убедиться, что файл output.mp4 содержит несколько разрешений. Для этого вы можете использовать FFprobe:

ffprobe -i output.mp4 -show_frames -select_streams v -show_entries frame=pkt_pts_time,width,height -of csv

В результате выполнения вы должны увидеть вывод, который подтвердит наличие различных разрешений в вашем видео.

Заключение

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

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *