您应该了解像rgb和yuv这样的像素格式。视频几乎总是使用yuv格式,如yuv420p。然后研究AVFrame结构,这里有一些信息:
AVFormat.format :当前帧的像素格式,即 AV_PIX_FMT_YUV420P AVFormat.width :当前帧的水平长度(因此宽度)单位:像素 AVFormat.height :当前帧的垂直长度(因此高度)单位:像素
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)作为字节数。
AVFormat.data[n]
AVFormat.linesize[n]
data[0]
data[1]
data[2]
linesize[0]
AVFrame.height
我不知道UIImage结构(或者它是什么),如果它是一个像RGB这样的特定格式,你需要使用你的AVFrame转换为该格式 swscale 。 这里有一些例子: https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/scaling_video.c
swscale
在libav(ffmpeg)中,缩放(调整大小)和像素格式转换是通过相同的功能完成的。
希望这些有帮助。