【问题标题】:AVFrame buf size calculationAVFrame buf 大小计算
【发布时间】:2021-02-19 08:00:08
【问题描述】:
我在将原始视频数据写入 AVFrame 时遇到段错误和/或超出范围的内存写入,因此无法使用 ffmpeg 库对视频进行编码。因此,我只想问一下我的假设是否正确。
我是否正确假设AVFrame.data[i] 的大小总是等于AVFrame.linesize[i]*AVFrame.Height?或者是否存在情况并非如此的情况,如果是这样,我如何可靠地计算AVFrame.data[i] 的大小?
【问题讨论】:
标签:
c++
ffmpeg
libav
libavcodec
【解决方案1】:
这取决于像素格式。例如 YUV 4:4:4,是的,每个平面都是 linesizeheight。但是对于 4:2:2,Y 平面为 linesizeheight,而 U 和 V 平面为 linesize*height/2。
【解决方案2】:
它适用于大多数情况,但我不会针对所有不同的格式进行中继:-
AVFrame.linesize[i] = AVFrame.Width * PixelSize(其中 PixelSize 例如 RGBA = 4bytes)
BufferSize = AVFrame.linesize[i] * AVFrame.Height
最好的办法,应该是使用FFmpeg的官方av_image_get_buffer_size
int buffer_size = av_image_get_buffer_size(AVPixelFormat.AV_PIX_FMT_RGBA, codecCtx->width, codecCtx->height, 1);