FFmpeg-helloworld

作者: 未见哥哥 | 来源:发表于2018-11-08 23:57 被阅读3次

1. FFmpeg版本的 Hello World

在 AndroidStudio 控制台中打印 FFMpeg 支持的编解码库。

要完成这个功能主要有一下 4 步:

  • 1.1 创建 C++ 项目

创建一个支持 C++ 的 AndroidStudio 工程,具体如何创建请点击查看NDK 基本知识点&第一个JNI示例分析,在这里我们只关注与 FFMpeg 相关的东西。

  • 1.2 添加一个 module

创建一个子 library module 并将其添加为 app module 依赖。

image.png
  • 1.3 把 module 修改为 C++ 项目

    • 1.3.1 移动项目中 CmakeList.txt 到 library module 根目录下
    • 1.3.2 在 build.gradle 中修改 CMake 的配置
    android{
        defaultConfig {
        
            externalNativeBuild {
                cmake {
                    cppFlags "-frtti -fexceptions"
                    //指定支持的 cpu 架构
                    abiFilters 'armeabi'
                }
            } 
            
            sourceSets {
                main {
                    jniLibs.srcDirs = ['src/main/jniLibs']
                }
            }
                  
        }
        
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
    }
    
    • 1.3.3 移动项目中 cpp 文件夹到 library module 中
  • 1.4 配置 FFMpeg

    • 1.4.1 将编译后的 FFMpeg 的头文件和 so库拷贝到 library 工程中,具体看以下截图,在这里只拷贝 arm 架构的。
    image.png
    • 1.4.2 CmakeList 中配置 ffmpeg

      CMakeList 配置 ffmpeg 主要分为一下四步:

      • 导入库的头文件路径

      导入库文件,是在引用 so 库的头文件时可以使用相对路径。

      include_directories(src/main/cpp/include)
      
      • 添加动态库

      添加库名称为 avcodec-57 ,SHARED 表示动态库,IMPORTED 表示以导入的方式使用该库。

      add_library( avcodec-57 SHARED IMPORTED)
      
      • 设置动态库路径
    > 给名字为 `avcodec-57` 的动态设置对应 so 库的实际位置。
    
    ```
    set_target_properties( avcodec-57
                   PROPERTIES IMPORTED_LOCATION
                   ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavcodec-57.so)
    ```
    
    * 链接动态库

    > 链接 FFMpeg 的动态库。

    ```
    target_link_libraries( # Specifies the target library.
                   native-lib
                   # 链接动态库
                   avcodec-57
                   ...
                   log )
    ```
  • 1.5 使用该库

    • 1.5.1 加载动态库
    public class JniDemo {
        static {
            System.loadLibrary("native-lib");
            System.loadLibrary("swresample-2");
            System.loadLibrary("avcodec-57");
            System.loadLibrary("avformat-57");
            System.loadLibrary("swscale-4");
            System.loadLibrary("postproc-54");
            System.loadLibrary("avfilter-6");
            System.loadLibrary("avdevice-57");
        }
    
    
        public native void test();
    }
    
    
    • 1.5.2 调用本地代码打印 FFMpeg 支持的编解码库
    #include <jni.h>
    #include <string>
    
    //导入 log 库
    #include "android/log.h"
    
    extern "C" {
    #include <libavformat/avformat.h>
    }
    //定义 log 库别名
    #define LOGI(FORMAT, ...) __android_log_print(ANDROID_LOG_INFO,"liaowejian",FORMAT,##__VA_ARGS__);
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_example_lib_JniDemo_test(JNIEnv *env, jobject instance) {
    
        //注册所有的编解码器
        av_register_all();
        AVCodec *c_temp = av_codec_next(NULL);
        while (c_temp != NULL) {
            switch (c_temp->type) {
                case AVMEDIA_TYPE_VIDEO://视频
                    LOGI("[Video]:%s", c_temp->name);
                    break;
                case AVMEDIA_TYPE_AUDIO://音频
                    LOGI("[Audio]:%s", c_temp->name);
                    break;
                default://其他
                    LOGI("[Other]:%s", c_temp->name);
                    break;
            }
            c_temp = c_temp->next;
        }
    }
    
    • 1.5.3 执行调用程序

    关注控制台即可看到输出的打印信息了。

    new JniDemo().test();
    

以上流程就是第一个 FFMpeg 程序,最后的 c++ 代码写的就是输出 FFmpeg 的编解码器,具体怎么操作以后还会继续学习跟进。

记录于 2018年11月8日晚

相关文章

  • FFmpeg-helloworld

    1. FFmpeg版本的 Hello World 在 AndroidStudio 控制台中打印 FFMpeg 支持...

网友评论

    本文标题:FFmpeg-helloworld

    本文链接:https://www.haomeiwen.com/subject/jdwgxqtx.html