前言
上一回说到啊,这千秋月没是佳人离别,时逢枯枝落旧城,却待新兰满长街,战场上还未至瑞雪,各位看官不好意思,今日帝都又雾霾,来听小老二说书的别忘了加个口罩。在利用FFmpeg玩转Android视频录制与压缩(二)中我们基本编写完了所有模块儿代码,但是没有整合在一起,也没有对接Java层,接下来就是干这事。
native代码对接
我们编写完成了视频编码类、音频编码类、合成视频类,但是他们都没联系到一起,也没有被我们先前定义的JNI接口调用,再次看一眼我们的简单流程图以后,就开搞。
1. 准备一个处理全局数据的Handler
它的职责是处理视频编码完成事件、音频编码完成事件、视频合成完成开始控制、视频合成结束回调Java层,老规矩先上菜。
jx_jni_handler.h:
/**
* Created by jianxi on 2017/5/26.
* https://github.com/mabeijianxi
* mabeijianxi@gmail.com
*/
#ifndef JIANXIFFMPEG_JX_JNI_HANDLER_H
#define JIANXIFFMPEG_JX_JNI_HANDLER_H
#include "jx_user_arguments.h"
class JXJNIHandler{
~JXJNIHandler(){
// delete(arguments);
}
public:
void setup_video_state(int video_state);
void setup_audio_state(int audio_state);
int try_encode_over(UserArguments* arguments);
void end_notify(UserArguments* arguments);
private:
int start_muxer(UserArguments* arguments);
private:
int video_state;
int audio_state;
};
#endif //JIANXIFFMPEG_JX_JNI_HANDLER_H
jx_jni_handler.cpp:
/**
* Created by jianxi on 2017/5/26.
* https://github.com/mabeijianxi
* mabeijianxi@gmail.com
*/
#include "jx_jni_handler.h"
#include "base_include.h"
#include "jx_media_muxer.h"
#include "jx_log.h"
/**
* 改变视频录制状态
* @param video_state
*/
void JXJNIHandler::setup_video_state(int video_state) {
JXJNIHandler::video_state = video_state;
}
/**
* 改变音频录制状态
* @param audio_state
*/
void JXJNIHandler::setup_audio_state(int audio_state) {
JXJNIHandler::audio_state = audio_state;
}
/**
* 检查是否视音是否都完成,如果完成就开始合成
* @param arguments
* @return
*/
int JXJNIHandler::try_encode_over(UserArguments *arguments) {
if (audio_state =&#