步骤
1.Android端写surfaceView,设置视频格式ARGB,callback,holder,不多说
2.解码视频数据,得到一帧一帧的YUV数据(了解视频解码流程)
3.通过surfaceView获取nativewindow
4.lock Window
5.第三方的libyuv to RGBA
6.set buffer
7.unlock Window
实现代码
#include <jni.h>
#include <android/log.h>
#include <stdlib.h>
#include <stdio.h>
//编解码相关
#include "libavcodec/avcodec.h"
//封装格式处理
#include "libavformat/avformat.h"
//像素处理
#include "include/libswscale/swscale.h"
// 自定义头文件
#include "com_example_ffmpeg_FfmpegUtil.h"
#define LOGI(FORMAT,...) __android_log_print(ANDROID_LOG_INFO,"render",FORMAT,##__VA_ARGS__);
#define LOGE(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR,"render",FORMAT,##__VA_ARGS__);
JNIEXPORT void JNICALL Java_com_example_rendor_SurfaceUtil_render(JNIEnv *env,
jclass jclzz, jstring input_jstr, jobject surface) {
const char *input_cstr = (*env)->GetStringUTFChars(env, input_jstr, NULL);
// 注册所有的组件
av_register_all();
// 拿到封装格式上下文
AVFormatContext * aVFormatContext = avformat_alloc_context();
// 打开视频文件
int isOpen = avformat_open_input(&aVFormatContext, input_cstr, NULL, NULL);
if (isOpen < 0) {
LOGE("%s", "打开视频文件失败");
return;
}
LOGE("%s", "avformat_open_input");
int stream_info = avformat_find_stream_info(aVFormatContext, NULL);
if (stream_info < 0) {
LOGE("%s", "stream_info失败");
return;
}
LOGE(