ffmpeg 使用小结
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;
最终解决了视频水印加不上的问题!
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号