基于FFmpeg的编解码器设计实现方案

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层。

/**
 * 回
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值