1、提供的能力
codec组件基于FFmpeg做的封装,通过命令行+jni调用FFmpeg库源码的方式提供编解码、封装/解封装、滤镜、重采样等能力,具体包括:
1、编码
原始音频(pcm)、视频(yuv)数据编码(aac、ac3、mp3、h264、h265、mpeg4、mjpeg)
2、解码
编码的音频、视频数据解码成原始数据(pcm、yuv)
3、转码
基于1-2实现转码,如RV40转换为MPEG4格式。有的封装格式标准规定,只支持几种固定的音频、视频编码格式,比如FLV视频支持H263、H264、Screen Video、On2 VP6,音频支持MP3、pcm、AAC、speex,在封装FLV时音频、视频不符合标准的话,会封装失败,比如想把AC3封装进FLV,此时需要转码。
4、封装
音频流、视频流封装成媒体文件
5、解封装
音视频数据(mp4、avi、flv)解封装音频流、视频流
6、转封装
基于3、4、5实现媒体文件格式转换,如mp4 ↔flv。可选定编码格式,也可以直接copy只转换媒体文件格式。
7、滤镜
视频裁剪、编辑、合成、水印等滤镜功能。
2、接口设计
接口分为jni接口、结果回调接口、调用接口。jni接口调用FFmpeg源码实现音视频处理,jni接口分为两部分,一是命令行接口,也就是通过FFmpeg命令行调用FFmpeg动态库,并返回命令执行进度以及执行结果;二是普通的jni接口,有些功能没有必要通过命令行实现,通过调用FFmpeg中源码更容易实现,比如获取FFmpeg版本、媒体文件信息。
2.1、jni接口
static {
System.loadLibrary("keffmpeg");
}
/**
* @return 版本号
*/
public static native String getVersion();
/**
* 获取媒体文件(输入/输出)信息,封装信息+视频流信息+音频流信息
*
* @param filePath 文件路径
* @return
*/
public static native String getFileInfo(String filePath);
/**
* 通过命令行调用FFmpeg中的main方法
*
* @param argc 参数个数
* @param argv FFmpeg命令行参数
*/
public static native void exec(int argc, String[] argv);
/**
* 终止执行
*/
public static native void exit();
/**
* FFmpeg执行结束后的结果回调,由C代码中调用
*/
public static void onResult(int ret) {
LogUtil.d(TAG, "onResult ret:" + ret);
CmdExecutor.getInstance().getExecListener().onResult(ret);
}
/**
* FFmpeg执行进度回调,由C代码调用
*/
public static void onProgress(float progress) {
LogUtil.d(TAG, "onProcess:" + progress);
CmdExecutor.getInstance().getExecListener().onProgress(progress);
}
2.2、回调接口
FFmpeg的执行进度、执行结果需要告知调用方,通过Java中的反射机制获取jclass中的回调方法,JNIEnv调用Java中的回调方法并将C程序的执行结果传递给Java层。
/**
* 回