Вопрос или проблема
Я хотел бы использовать FFmpeg, чтобы взять видео Dolby Vision и в конце вывести Dolby Vision. Я вижу, что у x265 есть некоторые флаги, которые можно передать, поэтому я сделал несколько попыток с использованием этого. Пример:
ffmpeg -i input.mkv -maxrate 89000k -crf 19 -c:v libx265 -preset ultrafast -pix_fmt yuv420p10le -an -x265-params vbv-bufsize=89000:vbv-maxrate=89000:dolby-vision-profile=5:hdr-opt=1:colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc -f mpegts output.ts
Это вывод MediaInfo для оригинального файла:
Format : HEVC
Format/Info : High Efficiency Video Coding
Format profile : Main 10@L5@High
HDR format : Dolby Vision, Version 1.0, Profile 5, dvhe.05.06, BL+RPU
Codec ID : V_MPEGH/ISO/HEVC
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 10 bits
Хотя MediaInfo показывает, что он не сохранил информацию Dolby Vision в преобразованном файле:
Format : HEVC
Format/Info : High Efficiency Video Coding
Format profile : Main 10@L5@High
Codec ID : 36
Color space : YUV
Chroma subsampling : 4:2:0 (Type 0)
Bit depth : 10 bits
Writing library : x265 3.5+115-7fd02e716:[Windows][GCC 13.2.0][64 bit] 10bit
Encoding settings : cpuid=1111039 / frame-threads=3 / numa-pools=12 / wpp / no-pmode / no-pme / no-psnr / no-ssim / log-level=2 / input-csp=1 / input-res=3840x2160 / interlace=0 / total-frames=0 / level-idc=0 / high-tier=1 / uhd-bd=0 / ref=1 / no-allow-non-conformance / repeat-headers / annexb / aud / no-eob / no-eos / hrd / info / hash=0 / temporal-layers=0 / open-gop / min-keyint=23 / keyint=250 / gop-lookahead=0 / bframes=3 / b-adapt=0 / b-pyramid / bframe-bias=0 / rc-lookahead=5 / lookahead-slices=8 / scenecut=0 / no-hist-scenecut / radl=0 / no-splice / no-intra-refresh / ctu=32 / min-cu-size=16 / no-rect / no-amp / max-tu-size=32 / tu-inter-depth=1 / tu-intra-depth=1 / limit-tu=0 / rdoq-level=0 / dynamic-rd=0.00 / no-ssim-rd / no-signhide / no-tskip / nr-intra=0 / nr-inter=0 / no-constrained-intra / strong-intra-smoothing / max-merge=2 / limit-refs=0 / no-limit-modes / me=0 / subme=0 / merange=57 / temporal-mvp / no-frame-dup / no-hme / no-weightp / no-weightb / no-analyze-src-pics / deblock=0:0 / no-sao / no-sao-non-deblock / rd=2 / selective-sao=0 / early-skip / rskip / fast-intra / no-tskip-fast / no-cu-lossless / no-b-intra / no-splitrd-skip / rdpenalty=0 / psy-rd=2.00 / psy-rdoq=0.00 / no-rd-refine / no-lossless / cbqpoffs=0 / crqpoffs=3 / rc=crf / crf=19.0 / qcomp=0.60 / qpstep=4 / stats-write=0 / stats-read=0 / vbv-maxrate=89000 / vbv-bufsize=89000 / vbv-init=0.9 / min-vbv-fullness=50.0 / max-vbv-fullness=80.0 / crf-max=0.0 / crf-min=0.0 / ipratio=1.40 / pbratio=1.30 / aq-mode=1 / aq-strength=0.00 / cutree / zone-count=0 / no-strict-cbr / qg-size=32 / no-rc-grain / qpmax=69 / qpmin=0 / no-const-vbv / sar=1 / overscan=0 / videoformat=5 / range=1 / colorprim=2 / transfer=2 / colormatrix=2 / chromaloc=1 / chromaloc-top=0 / chromaloc-bottom=0 / display-window=0 / cll=0,0 / min-luma=0 / max-luma=1023 / log2-max-poc-lsb=8 / vui-timing-info / vui-hrd-info / slices=1 / no-opt-qp-pps / no-opt-ref-list-length-pps / no-multi-pass-opt-rps / scenecut-bias=0.05 / no-opt-cu-delta-qp / no-aq-motion / no-hdr10 / hdr10-opt / no-dhdr10-opt / no-idr-recovery-sei / analysis-reuse-level=0 / analysis-save-reuse-level=0 / analysis-load-reuse-level=0 / scale-factor=0 / refine-intra=0 / refine-inter=0 / refine-mv=1 / refine-ctu-distortion=0 / no-limit-sao / ctu-info=0 / no-lowpass-dct / refine-analysis-type=0 / copy-pic=1 / max-ausize-factor=1.0 / no-dynamic-refine / no-single-sei / no-hevc-aq / no-svt / no-field / qp-adaptation-range=1.00 / scenecut-aware-qp=0conformance-window-offsets / right=0 / bottom=0 / decoder-max-rate=0 / no-vbv-live-multi-pass / no-mcstf / no-sbrc
Color range : Full
Чтобы ответить на ваш вопрос, это сейчас невозможно. FFmpeg не поддерживает внедрение или извлечение метаданных DoVi RPU. В настоящее время единственное возможное внедрение метаданных осуществляется только с HDR10+ и только с использованием x265, что аналогично, но ограничивает яркость до 4000 нит, а не до 10000, доступных с DoVi. Реально лишь немногие дисплеи могут достичь 10000 нит — или даже 4000 — в практическом использовании. Лучший способ использовать:
https://github.com/quietvoid/hdr10plus_tool
чтобы извлечь метаданные HDR10+ из вашего файла Dolby Vision, а затем повторно внедрить их во время кодирования с параметрами, такими как:
master-display={grading_info}:hdr10=1:chromaloc=2:dhdr10-info={grading_info_hdr10_plus_metadata}:dhdr10-opt=1
вместе с -x265-params в FFmpeg.
На мой взгляд, Dolby Vision — это собственническая шелуха — в основном маркетинг и не действительно необходимая.
Заметки:
grading_info: Это статическая информация о градации HDR10, которую вы можете получить с помощью FFmpeg.
grading_info_hdr10_plus_metadata: JSON-файл, сгенерированный с помощью hdr10plus_tool, который используется кодировщиком x265 вместе со статическими метаданными HDR10.
Этот подход создает выходной файл, поддерживающий HDR10 и HDR10+, предлагая аналогичный опыт просмотра. Имейте в виду, что не все источники Dolby Vision (например, Blu-ray) включают метаданные HDR10+. Обычно эти метаданные присутствуют только если входной файл находится в Dolby Vision Profile 8.1.
В вашем случае профиль:
Dolby Vision, Version 1.0, Profile 5, dvhe.05.06, BL+RPU
Этот формат не может и никогда не сможет быть сконвертирован в SDR, ни в обычный HDR, ни в HDR10+. Профиль 5.0 является 100% собственническим и не совместим с любыми другими форматами!
Говоря в общем, профиль DoVi 5 является собственническим и не совместим пониженно никаким образом, в то время как профиль 8.1 с другой стороны совместим и также в большинстве случаев поставляется с статическими метаданными HDR10 и HDR10+. Вы также можете перекодировать эти видео DoVi 8.1 обратно в SDR, используя кривую перекодирования, такую как mobius, например:
x265_hdr_to_sdr_filter = f'tin=smpte2084:min=bt2020nc:pin=bt2020:rin=tv:t=smpte2084:m=bt2020nc:p=bt2020:r=tv,zscale=t=linear:npl=175,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=mobius,zscale=t=bt709:m=bt709:r=tv,eq=contrast=1.02:brightness=0.01:gamma=1.02,format=yuv420p -strict -1 '
Это вернет довольно точную версию SDR представления HDR/DoVi.
Ответ или решение
Как транскодировать видео в формате Dolby Vision с помощью FFmpeg
Транскодирование видео с поддержкой Dolby Vision может быть сложной задачей, особенно если ваша цель — сохранить все оригинальные метаданные и качество изображения. В этом руководстве мы обсудим, как использовать FFmpeg и кодировщик x265 для достижения желаемого результата.
Шаг 1: Понимание формата Dolby Vision
Формат Dolby Vision включает в себя различные профили, которые определяют, как HDR-метаданные должны обрабатываться. Ваша исходная видеофайл имеет следующее описание:
- Формат: HEVC
- Профиль: Dolby Vision, Version 1.0, Profile 5 (dvhe.05.06)
- Максимальная яркость: до 10,000 нит
Профиль 5 является закрытым и не совместимым с другими форматами, такими как HDR10 или HDR10+. Это означает, что простая транскодировка в более стандартные форматы, как правило, приводит к потере качества и метаданных.
Шаг 2: Использование FFmpeg и x265
Вы привели пример команды FFmpeg, которая не сохраняет информацию Dolby Vision. К сожалению, на данный момент FFmpeg не поддерживает встраивание или извлечение RPU (Representation Processing Unit) метаданных Dolby Vision. Поэтому для транскодирования видео в Dolby Vision с использованием FFmpeg вам нужно учитывать это ограничение.
Ваш пример команды:
ffmpeg -i input.mkv -maxrate 89000k -crf 19 -c:v libx265 -preset ultrafast -pix_fmt yuv420p10le -an -x265-params vbv-bufsize=89000:vbv-maxrate=89000:dolby-vision-profile=5:hdr-opt=1:colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc -f mpegts output.ts
Шаг 3: Альтернативный подход с HDR10+
Как вы уже упомянули, вы можете использовать инструмент hdr10plus_tool
для извлечения информации о метаданных HDR10+ из файла Dolby Vision и последующего её встраивания при кодировании с помощью x265. Это позволяет создать выходной файл с поддержкой HDR10 и HDR10+, обеспечивая схожее качество изображения.
Пример команды может выглядеть следующим образом:
ffmpeg -i input.mkv -maxrate 89000k -crf 19 -c:v libx265 -preset ultrafast -pix_fmt yuv420p10le -an -x265-params "vbv-bufsize=89000:vbv-maxrate=89000:master-display={grading_info}:hdr10=1:chromaloc=2:dhdr10-info={grading_info_hdr10_plus_metadata}:dhdr10-opt=1" -f mpegts output.ts
Шаг 4: Использование статического метаданных для HDR10+
Так как ваш видеофайл основан на профиле 5, процесс извлечения метаданных будет включать:
- Получение информации о градации из вашего видео с помощью FFmpeg.
- Создание JSON файла с метаданными HDR10+ с использованием
hdr10plus_tool
.
Пример команды FFmpeg для извлечения информации о градации:
ffmpeg -i input.mkv -vf "select='eq(n\,0)',showinfo" -f null -
Это поможет вам получить необходимые значения для:
- grading_info — статическая информация для HDR10.
- grading_info_hdr10_plus_metadata — метаданные HDR10+.
Вывод
На данный момент FFmpeg не поддерживает прямую работу с метаданными Dolby Vision (Profile 5), что делает вашу задачу значительно более сложной. Однако использование hdr10plus_tool
для извлечения и переинъекции метаданных предоставит способ сохранить высокое качество изображения. Обратите внимание, что при использовании профиля 5 вы не сможете перейти к SDR или другим форматам без значительных потерь.
Заключение о том, что Dolby Vision может показаться избыточным для некоторых пользователей, в то время как HDR10+ предоставляет больше возможностей для кросс-платформенной совместимости, также стоит учитывать при выборе формата для работы.