坑记:FFmpeg用movie+overlay做图片水印

来源:互联网 发布:国产纪录片 知乎 编辑:程序博客网 时间:2024/06/06 18:53

今天,想在代码中用下ffmpeg中的movie+overlay滤镜弄下图片水印,Filter描述字符串为“movie=xxx.png[over];[in][over]overlay[out]”,按照正常的创建输入buffersrc,输出buffersink,创建filter graph,然后从YUV文件中读取一帧放入所创建好的filter graph中,读取帧的过程如下:

AVFrame* frame = av_frame_alloc(); frame->width = width; frame->height = height; frame->format = AV_PIX_FMT_YUV420P; // frame->pts = 0; // 必要设置 int size = avpicture_get_size(AV_PIX_FMT_YUV420P, frame->width, frame->height); uint8_t* buffer = (uint8_t*)av_malloc(size); avpicture_fill((AVPicture*)frame, buffer, AV_PIX_FMT_YUV420P, frame->width, frame->height); while(1) {    // 读取YUV数据     if(fread(buffer, 1, width*height*3/2, fYuv) <= 0) {         break;     } else if(feof(fYuv)){         break;     }     frame->data[0] = buffer;     frame->data[1] = buffer + width * height;     frame->data[2] = buffer + width * height * 5 / 4;    // 使用水印....}

结果没有看到想要的结果。
查了好久,才发现图片水印需要放入的AVFrame的pts不为负数,最后在初始化frame的时候手动将pts初始化(上面代码注释处),才顺利通过。

0 0