#video #ffmpeg #video-processing #vp9
#Видео #ffmpeg #обработка видео #vp9
Вопрос:
Просто пытаюсь закрепить свое понимание видеокодеков и, похоже, не могу найти никакой информации об этом.
https://www.mediafire.com/file/cbx8sciq5mie94m/arrow.webm/file содержит крошечный веб-интерфейс vp9. Это было создано мной ffmpeg
с помощью простого преобразования gif -> webm.
Исходный gif-файл имел 13x11
разрешение. Каким-то образом выходное видео также имеет 13x11
разрешение. Я пытаюсь понять, как это возможно.
Насколько я понимаю:
- Формат пикселей YUV420 сделал бы это невозможным из-за коэффициента субдискретизации цветности, равного 2, что требует требования делимости на два.
- Сам VP9 имеет минимальный размер блока 16×16 (?), Поэтому необходимо закодировать как минимум столько данных (?)
Следовательно, я предполагаю, что здесь закодирован видеопоток размером ~ 14×12 или ~ 16×16, который каким-то образом масштабируется или обрезается до 13×11.
Проблема в том, что я не могу найти никаких объяснений относительно того, как это работает.
Вот вывод ffprobe для потока:
[STREAM]
index=0
codec_name=vp9
codec_long_name=Google VP9
profile=Profile 0
codec_type=video
codec_time_base=1/60
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
width=13
height=11
coded_width=13
coded_height=11
closed_captions=0
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=13:11
pix_fmt=yuv420p
level=-99
color_range=tv
color_space=unknown
color_transfer=unknown
color_primaries=unknown
chroma_location=unspecified
field_order=unknown
timecode=N/A
refs=1
id=N/A
r_frame_rate=60/1
avg_frame_rate=60/1
time_base=1/1000
start_pts=0
start_time=0.000000
duration_ts=N/A
duration=N/A
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:alpha_mode=1
TAG:ENCODER=Lavc58.91.100 libvpx-vp9
TAG:DURATION=00:00:00.600000000
[/STREAM]
и для последнего кадра:
[FRAME]
media_type=video
stream_index=0
key_frame=0
pkt_pts=583
pkt_pts_time=0.583000
pkt_dts=583
pkt_dts_time=0.583000
best_effort_timestamp=583
best_effort_timestamp_time=0.583000
pkt_duration=16
pkt_duration_time=0.016000
pkt_pos=3639
pkt_size=15
width=13
height=11
pix_fmt=yuv420p
sample_aspect_ratio=1:1
pict_type=P
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
color_range=tv
color_space=unknown
color_primaries=unknown
color_transfer=unknown
chroma_location=unspecified
[/FRAME]
отклонение от значений coded_width
и coded_height
(предполагается, что они представляют «истинную» ширину / высоту перед любым масштабированием (?)) плюс sar
значение 1, насколько я могу судить, это действительно видеопоток 13×11, но это должно быть невозможно, нет?
Мой вопрос в том, почему это допустимый видеофайл?
Если я попытаюсь, например zscale
, что-то с неравномерным разрешением в YUV420
формате пикселей, я получу ожидаемые ошибки подвыборки цветности.
Комментарии:
1. Вы правы в том, что цветность (УФ-плоскости) требует четного количества пикселей. Для подобных ситуаций кодек, вероятно, добавит отступы по краям, заполненным нулями (или любым другим подходящим), чтобы правильно это закодировать. Проигрыватель отключает это заполнение, потому что у него есть информация о ширине / высоте.
2. @user3124812 но разве я не ожидал
coded_width
, что /coded_height
будет отражать истинную ширину / высоту видеопотока, если он будет дополнен? Могу ли я просто кодировать видео с любым количеством отступов, которое я хочу, и каким-то образом переопределять метаданные ширины / высоты?3. Я не имел дела с VP9, но я бы не ожидал, что этот кодек даст вам то, что он делает под капотом. Вы можете переопределить ширину / высоту необработанного видео, добавив отступы, но после этого вам нужно будет снова много кодировать. Что-то о «изменении размера видео» должно дать идею.
4. Есть ли какая-нибудь команда, которую я могу запустить, например, добавить видео с черными пикселями, а затем «скрыть» эти пиксели заполнения, солгав о ширине / высоте видео? Я не могу найти ничего подобного, что поддерживается в
ffmpeg
? Я пытаюсь понять, что происходит, чтобы сделать это действительным видео, воссоздав его, но, похоже, нет способа закодировать это 😂, если я заменю на, на самомscale=13:11
zscale=13:11
деле он жалуется на проблему с цветностью. Soscale
делает «что-то», чтобы заставить это работать. Я просто не знаю, что.