Основанный на времени вместо основанных на кадре зон (с различными CRF) для кодирования ffmpeg + x264 / x265?

455
Peter Cordes

В x264 / 5 есть zonesпараметр для поддержки различных настроек кодирования для части видео, но он принимает только номера кадров, а не временные метки.

Это незначительное неудобство с видео с постоянной частотой кадров, но основное неудобство при использовании фильтра ffmpeg, например, mpdecimateпри отбрасывании (почти) точных дублированных кадров. Или с VFR видео в целом. (И если он не работает ffmpeg, только с опцией для автономного интерфейса командной строки, это также будет большим неудобством.)


libx265 (и libx264) имеют API, который позволяет вызывающей стороне изменять конфигурацию некоторых параметров кодировщика на лету, поэтому оболочки кодировщиков libx264 и libx265 ffmpeg теоретически могут настраивать параметры CRF или других кодировщиков в определенном диапазоне временных отметок, отдельно от собственных x264 " зоны "особенность.

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

Но AFAIK, это в настоящее время не реализовано. ffmpeg -h encoder=libx265не показывает ничего актуального; -x265-paramsанализируется для настройки энкодера один раз при запуске, и поддерживается только пара других опций. ( libx264имеет много других опций ffmpeg, но не какие-либо зоны, которые я вижу.)


Есть ли какой-нибудь альтернативный способ кодирования с -vf mpdecimate(или произвольным источником VFR) и иметь CRF30 для большей части видео, но CRF = 24 от 00:30:00до 00:30:30, например?

В моем случае есть один визуально интересный клип, на который стоит потратить лишние биты по качеству, и я бы предпочел не разрезать видео и использовать упорядоченные главы MKV просто для того, чтобы это произошло. Хотя, если для этого есть какой-то простой ffmpegсинтаксис (особенно за один проход), это было бы неплохо. То, что может вписаться в оболочку bash «один вкладыш», - это то, к чему я стремлюсь.

Чтобы сделать это с зонами, я думаю, что мне нужно было бы просмотреть видео mpdecimateи узнать номера кадров начала / конца этого временного региона. И я думаю, что мне нужно было бы запустить видео через автономный x265интерфейс командной строки, потому что я думаю, что зоны - это функция интерфейса командной строки, а не сама библиотека. (И поэтому не поддерживается через -x265-paramsпередачу пар ключ / значение в libx265).

Я проверил, поддерживает ли Handbrake какие-либо зоны, и не вижу его в графическом интерфейсе. (И пакет Archbra's Handbrake 1.0.7 по-прежнему использует x265 2.1, поэтому он даже не имеет обновленных таблиц Lambda с x265 2.4, выпущенного более 9 месяцев назад. Handbrake хорош, за исключением того, что вместо него имеются устаревшие частные копии кодеков сборки против версии системы, которая определенно все еще имеет значение для x265.)

1
x265-params ** установит зоны **. Gyan 6 лет назад 0
@Mulvya: хорошо, спасибо, так что заботится о содержании CFR с помощью ffmpeg. Но вопрос содержания VFR все еще стоит; время -> номер кадра в этом случае сложен. Peter Cordes 6 лет назад 0
Вам понадобится два прохода. Применить mpdecimate, а затем showinfo. Обратите внимание на `n` для начала / конца pts_times. Затем закодируйте во втором проходе. Gyan 6 лет назад 1

0 ответов на вопрос

Похожие вопросы