Вы должны знать о пиксельных форматах, таких как rgb и yuv.Видео почти всегда использует форматы yuv, такие как yuv420p.Затем изучите структуру AVFrame, вот некоторая информация:
AVFormat.format
: пиксельный формат текущего кадра, т.е. AV_PIX_FMT_YUV420P
AVFormat.width
: горизонтальная длина текущего кадра (отсюда и ширина): пиксели
AVFormat.height
: вертикальная длина текущего кадра (следовательно, высота): пиксели
Теперь, где вы можете спросить фактический буфер кадра, он в AVFormat.data[n]
n может быть 0-3.В зависимости от формата, только первый может содержать целый кадр или все 4 из них.Т.е. yuv420p использует 0, 1 и 2. Их линейные размеры (также известные как шаги) можно получить, читая соответствующее значение AVFormat.linesize[n]
.Что касается yuv420p:
data[0]
это плоскость Y
data[1]
это плоскость U
data[2]
это плоскость V
Если вы умножите linesize[0]
на AVFrame.height
, вы получите размерэтой плоскости (Y) как число байтов.
Я не знаю о структуре UIImage (или чем-то еще), если он требует определенного формата, такого как RGB, вам нужно преобразовать свой AVFrame в этот форматиспользуя swscale
.Вот несколько примеров: https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/scaling_video.c
В libav (ffmpeg) масштабирование (изменение размера) и преобразование формата пикселей выполняются с помощью одной и той же функции.
Надеюсь, это поможет.