android yuv加水印_在Android采集视频过程中增加水印功能实现

本文介绍了在Android设备上利用ffmpeg在视频采集过程中添加动态时间戳水印的实现方法。主要挑战在于在Android上编译带水印功能的ffmpeg库,包括处理freetype库的依赖问题。文章详细展示了ffmpeg的编译配置,并提供了在编码前添加水印的代码示例,以及如何处理水印可能导致的水波纹现象。此外,还讨论了X264编码参数优化,以减少解码时的花屏问题,包括调整CRF值、设置编码速度和NALU单元大小等。
摘要由CSDN通过智能技术生成

CSDN旧文搬迁!

在Android采集视频过程中增加水印,并且水印包含一个变化的时间戳,这里考虑方案实现的时候,就想到了ffmpeg,ffmpeg包含很多filter能实现水印添加的功能。

基本实现方案是,Camera预览 -> 得到预览帧的bitmap -> 给bitmap通过ffmpeg 添加水印  -> ffmpeg把bitmap使用h264编码 -> 写文件。

其实ffmpeg添加水印功能在网上例子很多,也都大同小异,但在Android端,比较难搞的地方其实是ffmpeg编译出能带水印添加功能的so库文件,其中:ffmpeg的drawtext filter依赖freetype的so,需要先编一个android平台下freetype的so,而在android平台的编译ffmpeg时,难搞的pkg-cfg总是检查依赖的freetype失败,迫不得已修改了ffmpeg的configure,不在对freetype库做检查,但编译配置的时候需要手动指定freetype so的搜索路径。

我使用的配置如下:/usr/local/lib/pkgconfig $FFMPEG_ROOT/configure --target-os=linux \

--prefix=$PREFIX \

--disable-encoders \

--disable-decoders \

--disable-muxers \

--disable-demuxers \

--disable-parsers \

--disable-bsfs \

--disable-protocols \

--disable-devices \

--disable-avdevice \

--disable-zlib \

--disable-bzlib  \

--enable-cross-compile \

--enable-runtime-cpudetect \

--pkg-config-flags="--static" \

--disable-asm \

--arch=arm \

--enable-armv5te \

--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \

--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \

--disable-stripping \

--nm=$PREBUILT/bin/arm-linux-androideabi-nm \

--sysroot=$PLATFORM \

--enable-nonfree \

--enable-version3 \

--enable-gpl \

--disable-doc \

--disable-ffplay \

--disable-ffserver \

--disable-ffprobe \

--enable-avcodec \

--enable-avformat \

--enable-avutil \

--enable-avfilter \

--enable-avresample \

--enable-swresample \

--enable-swscale \

--enable-postproc \

--enable-libx264 \

--enable-encoder=libx264 \

--enable-decoder=h264 \

--enable-hwaccels \

--enable-memalign-hack \

--disable-debug \

--enable-pthreads \

--disable-filters \

--enable-libfreetype \

--enable-filter=drawbox \

--enable-filter=drawtext \

--enable-avisynth \

--enable-iconv \

--extra-cflags="-Os -s -I$X264_ROOT -I$NDK/sysroot/include -I$PREFIX/include/freetype -I$PREFIX/include/ -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a  -mvectorize-with-neon-quad" \

--extra-ldflags="-L$ELIB -L$NDK/sysroot/lib -L$NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a -L$PREFIX/lib" \

--extra-libs="-lfreetype2-static -lstdc++ -lgnustl_static -fexceptions -lsupc++ -llog "

然后添加水印过程中出现水波纹的现象,主要原因是给定的width和height和实际的bitmap比匹配产生。

如下为doubango下编码前添加水印的部分代码:#   include 

#   include 

#   include 

#   include 

#   include 

#   include 

#   include 

static AVFilterContext* buffersink_ctx = NULL;

static AVFilterContext* buffersrc_ctx = NULL;

static AVFilterGraph* filter_graph = NULL;

static AVFrame* frame_in = NULL;

static AVFrame* frame_out = NULL;

static int isInited;

static int origin_in_width = 480;

static int origin_in_height = 320;

static char last_wartmark_str[125] = "\0";

static char filters_descr[256] = "\0";

static int init_filters(tmedia_codec_t* self)

{

tdav_codec_h264_t* h264 = (tdav_codec_h264_t*)self;

if (!tmedia_defaults_get_use_water_mark_func_flg()){

return 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值