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

本文介绍在Android设备上采集视频并实时添加包含时间戳的水印的方法。具体步骤包括从Camera获取预览帧,使用ffmpeg进行水印处理,再进行H.264编码并最终保存到文件。特别关注了在Android平台编译ffmpeg及其依赖项freetype的细节。

在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比匹配产生。

【源码免费下载链接】:https://renmaiwang.cn/s/5zjez Android平台应用OpenGL技术实现视频水印嵌入过程及其算法实现方案。该过程主要针对视频录制时进行水印信息的集成,支持静态和动态两种类型。其中,静态水印通常指固定不变的信息载体,如企业标识或版权说明等;而动态水印则指可变形式的内容标记,例如时间戳、日期或其他实时更新的数据特征。 在Android平台上应用OpenGL技术实现视频水印主要有两类算法方案:基于传统OpenGL的渲染机制以及基于OpenGL ES 2.0的着色器程序开发方法。采用前者的技术基础是将视频图像通过OpenGL渲染至GLSurfaceView显示界面,并导入水印图片到纹理存储单元,随后运用OpenGL混合函数将二者叠加合成;而后者则需编写专门的VertexShader和FragmentShader文件,利用这些shader程序对视频图像及水印图案进行精细处理后,再通过OpenGL ES 2.0 API将其加载至GPU并完成渲染显示。 为实现上述功能开发的关键技术环节包括:基于Java语言构建WaterSignSProgram类,该类主要负责导入纹理存储、处理视频图像与水印图案的混合运算,并通过OpenGL ES 2.0 API将结果输出到GLSurfaceView展示界面。在该类中,自定义了VertexShader和FragmentShader两个 shader文件,其中VertexShader主要用于处理视频图像顶点信息,而FragmentShader则负责处理视频图像像素级别的细节渲染。 基于上述技术方案的WaterSignSProgram类可被广泛应用于实际开发场景中。例如,在开发一款具有时间水印标识的应用程序时,可以利用该算法实现视频内容的版权保护功能;类似地,在构建行车记录仪应用时,同样能够通过导入企业L
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值