1.第一种 m_pFrameVideoOut = av_frame_alloc(); m_pFrameVideoOut->format = AV_PIX_FMT_BGR24; m_pFrameVideoOut->width = m_VideoCodecCtx->width; m_pFrameVideoOut->height = m_VideoCodecCtx->height; if (av_image_alloc(m_pFrameVideoOut->data, m_pFrameVideoOut->linesize, m_pFrameVideoOut->width, m_pFrameVideoOut->height, AV_PIX_FMT_BGR24, 16) < 0) { return ; } 2.第二种 m_pFrameVideoOut = av_frame_alloc(); m_pFrameVideoOut->format = AV_PIX_FMT_BGR24; m_pFrameVideoOut->width = m_VideoCodecCtx->width; m_pFrameVideoOut->height = m_VideoCodecCtx->height; av_frame_get_buffer(m_pFrameVideoOut, 16); 3.第三种 int bufferSize = av_image_get_buffer_size(AV_PIX_FMT_YUV420P, nWidth, nHeight, 1);; m_InputFrame = av_frame_alloc(); m_InputFrame->width = nWidth; m_InputFrame->height = nHeight; m_InputFrame->format = AV_PIX_FMT_YUV420P; m_Buffer = (unsigned char *)av_malloc(bufferSize); av_image_fill_arrays(m_InputFrame->data, m_InputFrame->linesize, m_Buffer, AV_PIX_FMT_YUV420P, nWidth, nHeight, 1); ———————————————— 版权声明:本文为CSDN博主「小小的熊OnlyOne」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/xionglifei2014/article/details/90693048
以上是avframe的申请方式,在项目中用的是第三种,而且收到的数据是有内存的,就不用av_malloc空间了。fill_array就是直接把指针指一下而已;
现在遇到的问题:
收到流后解封装-解码-进滤镜模块-...卡在给视频加一个水印,水印模块分为三个text-picture & qrcode,这三个用的相同的init-filter和destroy函数。
现象是text水印可以添加上。但是picture和qrcode 添加不上,其实添加不上的就是图片。qrcode就是给一个串,生成一个图片,然后显示。
大方向认为是init函数有问题,可能是init的时候movie参数啥的需要特殊处理?不晓得原因,且正在排查中。
望早日排查出来,写结尾。
----------------------------------------------------------------------------
现在来补充结尾,经过N次检查、测试和debug,猜想是av_image_fill_arrays函数的问题。
然后用个从flv文件拿出来frame加图片水印的例子来修改,修改过程如下:
从文件中取出来frame后,用av_image_copy_to_buffer函数把数据拷贝到buf中,
然后再把buf中的数据通过av_image_fill_arrays函数填充tmp_frame;
给tmp_frame加水印。
结果是没有给tmp_frame加上水印。证明这样得到的frame是没法加上水印的。
接下来用函数 av_frame_ref(AVFrame *dst, AVFrame *src);填充dst,然后发现这样是可以加上水印的。
然后就是gdb对比dst和tmp_frame的区别。发现了有十几个结构体参数不一样。
没办法,一个个试。
Finally,发现了frame->pts对图片水印能不能加上起到了决定性作用!
static int pts=0;
frame->pts=++pts;
最终解决了视频水印加不上的问题!