您现在的位置是:主页 > Web前端技术 > Web前端技术
Android NDK开发之如何实现FFmpeg视频添加水印开发技术
IDCBT2021-12-29【服务器技术】人已围观
简介这篇文章主要介绍AndroidNDK开发之如何实现FFmpeg视频添加水印,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 前言 Android也是利用FFmpeg命令行的形式(混编
这篇文章主要介绍Android NDK开发之如何实现FFmpeg视频添加水印,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
前言Android也是利用FFmpeg命令行的形式(混编),进行视频转码压缩。
1.FFmpeg添加水印命令1.1.水印命令ffmpeg -iWildlife.wmv-vf "movie=panda.png[watermark];[in][watermark] overlay=10:10[out]"Marked.wmv
原始视频文件路径:Wildlife.wmv
水印图片路径:panda.png
水印位置:(x,y)=(10,10)<=(left,top)距离左侧、顶部各10像素;
输出文件路径:Marked.wmv
注意事项
问题:FFmpeg 3.0之前-vf “movie=绝对路径存在问题
从3.0开始就支持了
解决的方案:过滤器
ffmpeg -i /Users/yangshaohong/Desktop/Test.mov -i /Desktop/watermark.png -filter_complex overlay=480:10 /Desktop/Test_out.mp41.2.命令补充说明
水印位置参数的第一个数值是水印图片的左上角的x轴像素值,第二个数值是水印图片的左上角的y轴像素值。
水印位置参数除了使用数值外,还可以使用以下几个参数:
对应地可以将overlay参数设置成如下值来改变水印图片的位置:
2.Android 核心代码2.1.jni Java声明//添加水印 public native void addWatermark(int argc,String[] argv);2.2.核心代码ffmpeg.c
#include "jni.h" #include "ffmpeg.h" //视频转码压缩主函数入口 //SDL(main) //ffmpeg_mod.c有一个FFmpeg视频转码主函数入口 //标记(声明有一个这样的函数提供给我调用) //参数含义分析 //首先分析:String str = "ffmpeg -i input.mov -b:v 640k output.mp4" // argc = str.split(" ").length() // argv = str.split(" ") 字符串数组 //参数一:命令行字符串命令个数 //参数二:命令行字符串数组 int ffmpegmain(int argc, char **argv); JNIEXPORT void JNICALL Java_com_haocai_ffmpegtest_util_VideoPlayer_transcodingCompress (JNIEnv *env, jobject jobj,jint jlen,jobjectArray jobjArray){ //转码 //将java的字符串数组转成C字符串 int argc = jlen; //开辟内存空间 char **argv = (char**)malloc(sizeof(char*) * argc); //填充内容 for (int i = 0; i < argc; ++i) { jstring str = (*env)->GetObjectArrayElement(env,jobjArray,i); const char* tem = (*env)->GetStringUTFChars(env,str,0); argv[i] = (char*)malloc(sizeof(char)*1024); strcpy(argv[i],tem); } //开始转码(底层实现就是只需命令) ffmpegmain(argc,argv); //释放内存空间 for (int i = 0; i < argc; ++i) { free(argv[i]); } //释放数组 free(argv); }标签:很赞哦! ()