在确定代码逻辑和流程没有问题过后返回这个问题,通过多方验证确定是avfilter_graph_parse_ptr第二个参数导致的,此处我的输入参数是
const char *strFilter="movie=/storage/emulated/0/logo.png[wm];[in][wm]overlay=0:0,scale=400:400[out]"
,通过android studio 后台日志打印出现
然后我一直以为这里是logo_text1.png图片的问题,然后确定了路径文件有效,然后确定当前目录有权限,当然文件无效的话会返回其它错误。后面卡了好久开始怀疑是库不支持png格式解析。
后面我突然想到直接用
const char* = "/storage/emulated/0/logo_text1.png";
int ret = avformat_open_input(&m_pFormatContext, pUrl, NULL,NULL);
if (0 != ret)
{
char errbuf[128];
av_strerror(ret, errbuf, sizeof(errbuf));
return 0;
}
去打开这个地址,用过ffmpeg开发的人都清楚这个接口不仅可以打开rtmp,rtsp,本地文件等音视频流也可以打开,png,gif,jpeg等格式的图片,果然用这个接口打开时发现也是返回的同样的错误-1094995529 "Invalid data found when processing input" 这进一步的确定了问题所在,应该是编译ffmpeg时缺少了 png相关格式的配置选项,所以我用ffmpeg在windows下打开一个png格式的图片可以看到相关信息为:
png_pipe 这个格式,然后去ffmpeg源码目录下在linux使用
./configure --list-demuxers
命令可以查看到
image_png_pip 这个编译选项然后去ffmpeg编译里面添加这个编译选项,编译成功过后的ffmpeg 库加入到工程里面重新运行,果然可以成功的运行了,并实现了添加水印的功能,当然如果是jpeg格式的同理加入 image_jpeg_pipe这个选项就OK了。这个是ffmpeg移植到android下为了节省空间去掉许多编译选项容易出现的问题,这个难点就需要我们精确的确定是代码问题还是库的问题,在此记录一下。