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的搜索路径。
我使用的配置如下:
代码语言:javascript复制/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下编码前添加水印的部分代码:
代码语言:javascript复制# include <libavfilter/avfiltergraph.h>
# include <libavfilter/avfilter.h>
# include <libavfilter/avcodec.h>
# include <libavfilter/buffersink.h>
# include <libavfilter/buffersrc.h>
# include <libavutil/avutil.h>
# include <libavutil/imgutils.h>
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] = "