android 边录制视频边添加OSD

来源:互联网 发布:庞氏骗局 知乎 编辑:程序博客网 时间:2024/05/22 15:36
实现方案:android camera + ffmpeg(filter) + mediacodec

本文记录下自己实现过程中遇到的问题:


1.编译库
1) filter的drawtext函数需要freetype 库的支持。
在编译freetype库时,我本来想把freetype编译成静态库,但是中间遇到了很多问题,浪费了n多时间,
最后还是编成了动态库,so库编译比较顺利,在Android.mk文件添加src file时可以参考freetype/docs/INSTALL.ANY中的说明。

2)最后,在编译ffmpeg时,需要打开下面2个选项:
    --enable-libfreetype \
    --enable-avfilter  \

ndk-build时,提示ft2build.h找不到,把freetype/include下的头文件拷贝到libavfilter, 解决此问题

2.代码编写
  我参考了ffmpeg/doc/examples/filtering_video.c的实现,在此基础上进行修改,遇到的问题及解决办法:
  1) avfilter_graph_parse_ptr(filter_graph, filters_descr,&inputs, &outputs, NULL)); 中的filters_descr 一定要合法,可参考网上其它或ffmpeg-filters.html;
  2) av_opt_set_int_list(buffersink_ctx, "pix_fmts", pix_fmts,AV_PIX_FMT_YUV420P, AV_OPT_SEARCH_CHILDREN);
  
     pix_fmts 和 参数 AV_PIX_FMT_YUV420P 这2个输入参数一定要与android端视频帧格式一致,我camera的previewformat 设置的是ImageFormat.YV12,
与此对应的就是AV_PIX_FMT_YUV420P。
  3) 从av_buffersink_get_frame(buffersink_ctx, filt_frame); 获取到输出filt_frame之后,如何保存到char数组中? 在此函数之前通过 avpicture_fill将filt_frame 中data指向char数组行不通
     (猜想是在处理过程中 frame中的data指向了新的地址)。最后只能通过直接把frame->data 直接赋值到char 数组解决了
原创粉丝点击