第19课 在Android环境中使用FFmpeg和openCV进行开发的一般步骤

在上节课,根据模板文件我们对在Android环境中使用FFmpeg和openCV进行开发有了一个初步的体验,这节课,我们来具体看一下其工作流程。

1.程序的入口

与VS2013程序开发类似,Android程序开发也有一个入口,在这个模板中,它的入口文件是MainActivity.java,具体路径是:E:\jPro\demo\src\com\example\demo\MainActivity.java。我们打开MainActivity.java,会看到项目的主类:public class MainActivity extends Activity {},这个就是程序的入口了,与VS2013开发类似,在这个类中我们可以定义各种变量,也可以定义各种方法。其中的onCreate()函数类似于MFC中的OnInitDialog()函数,会在界面初始化完成后执行。

java 复制代码
protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		 formatBtn=(Button)findViewById(R.id.formatBtn);	
		 codecBtn=(Button)findViewById(R.id.codecBtn);	
		 filterBtn=(Button)findViewById(R.id.filterBtn);	
		 configBtn=(Button)findViewById(R.id.configBtn);
		 msgTxt=(TextView)findViewById(R.id.msgTxt);
		 msgTxt.setMovementMethod(ScrollingMovementMethod.getInstance());		
		
	}

2.为了能使用FFmpeg和openCV的相关功能,我们需要先把.so动态链接库加载进来并定义四个与C++有关的native函数,这四个函数在demo.cpp中实现并被java调用。

java 复制代码
static {		
		System.loadLibrary("opencv_java3");
		System.loadLibrary("x264.161");
		System.loadLibrary("avcodec");
		System.loadLibrary("avdevice");
		System.loadLibrary("avfilter");
		System.loadLibrary("avformat");
		System.loadLibrary("avutil");
		System.loadLibrary("postproc");
		System.loadLibrary("swresample");
		System.loadLibrary("swscale");
		System.loadLibrary("demo");
	}
	
	
	public native String avformatinfo();   
	public native String avcodecinfo();    
	public native String avfilterinfo();    
	public native String configurationinfo();

3.通过按钮调用相关函数

双击打开布局文件,路径为:/demo/res/layout/activity_main.xml。

双击其中的config按钮会看到configBtn单击时会触发名为Config的java方法

XML 复制代码
<Button
        android:id="@+id/configBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/filterBtn"
        android:layout_alignBottom="@+id/filterBtn"
        android:layout_alignRight="@+id/formatBtn"
        android:onClick="config"
        android:text="Config" />
    
     />

而名为Config的java方法则位于MainActivity.java中,而且调用了一个名为configurationinfo()的C++ native函数。

java 复制代码
public void config(View view){ 
	msgTxt.setText(configurationinfo());
}
	

4.demo.cpp中的configurationinfo()函数则是通过下面这种方式被java调用执行的。

cpp 复制代码
JNIEXPORT jstring JNICALL Java_com_example_demo_MainActivity_configurationinfo(
		JNIEnv *env, jobject obj) {
	char info[10000] = { 0 };
	//av_register_all();
	sprintf(info, "%s\n", avcodec_configuration());
	//printf("%s", info);
	return env->NewStringUTF(info);
}
相关推荐
Hello World,17 分钟前
使用ffmpeg播放视频并添加当前时间水印
ffmpeg·音视频
zore_c19 分钟前
【C语言】文件操作详解2(文件的顺序读写操作)
android·c语言·开发语言·数据结构·笔记·算法·缓存
2501_9151063223 分钟前
iPhone 耗电异常全面诊断指南,构建多工具协同的电量分析与优化体系
android·ios·小程序·https·uni-app·iphone·webview
南极星100526 分钟前
OPENCV(python)--初学之路(十一)
人工智能·python·opencv
自然语27 分钟前
完整的 OpenCV 点云可视化版本
人工智能·opencv·计算机视觉
再__努力1点29 分钟前
【50】OpenCV背景减法技术解析与实现
开发语言·图像处理·人工智能·python·opencv·算法·计算机视觉
棒棒的皮皮32 分钟前
【OpenCV】Python图像处理之位平面分解
图像处理·python·opencv·计算机视觉
卿雪33 分钟前
MySQL【SQL及其分类】:DDL、DML、DQL、DCL
android·sql·mysql
劈星斩月33 分钟前
OpenCV 学习1 - 读取、显示和写入图像
opencv·读取图像·写入图像
友友马34 分钟前
『MySQL - 进阶』存储过程(上):核心概念、变量体系与流程控制
android·数据库·mysql