NDK开发FFmpeg之HelloWorld


YoungHong2022-01-05 15:32:35博主文章分类:开发笔记
文章标签NDKFFmpegAndroid音视频android文章分类开源阅读数238

一、新建Native C++ 工程
首先,不同的工具版本在开发过程中会存在一定的问题,以下为本篇文章的工具版本:


AndroidStudio版本:3.3
Gradle版本:gradle-4.10.1-all
NDK版本:android-ndk-r16b-windows-x86_64
FFmpeg库版本:4.0(可参考文章"​​Linux环境下用NDK编译FFmpeg"​​)

版本确定后,我们在AndroidStudio中,新建Native C++工程,项目名为​​FFmpegWorld​​​,包名为​​com.demo.ffmpegworld​​​,新建成功后,直接运行工程,如在首页出现​​Hello from C++​​字样,表示NDK开发的准备工作完成。如遇到无法运行等问题,可自行百度解决,这里不再赘述。

题外话:随着AS不断的更新,对NDK的支持越来越友好,并且伴随着CMake的编译方法,旧有的android.mk方法已经显得过于繁琐(可以参考:​​Android NDK开发之HelloWorld​​)。

二、导入FFmpeg库


将项目由​​Android​​视图转换为​​Project​​视图。

在​​libs​​目录下新建​​armeabi​​文件夹,将FFmpeg的​​arm\lib​​路径下带版本号的​​.so​​文件拷贝过来。

在​​libs​​目录下新建​​include​​文件夹,将FFmpeg的​​arm\include​​路径下的所有文件夹拷贝过来。
最终的拷贝结果如图:
NDK开发FFmpeg之HelloWorld_android

打开​​app/build.gradle​​文件,在​​android→defaultConfig​​结点下,新增​​sourceSets​​结点,并修改​​externalNativeBuild​​结点,具体内容为:

defaultConfig {
    //新增sourceSets 结点
    sourceSets {
        main {
            jniLibs.srcDirs = ["libs"]
        }
    }
    //修改externalNativeBuild 结点
    externalNativeBuild {
        cmake {
            cppFlags ""
            abiFilters "armeabi"
        }
    }
}
打开​​src/main/cpp/CMakeLists.txt​​文件,在第一个​​add_library​​结点后,增加FFmpeg的关联代码(建议直接复制,路径容易出错):

#------------------------FFmpeg----------------------------------
include_directories(../../../libs/include)
set(DIR ../../../../libs)
MESSAGE("打印")
MESSAGE("路径 " ${DIR})
MESSAGE("路径 " ${CMAKE_CURRENT_SOURCE_DIR})
add_library(avcodec-58
        SHARED
        IMPORTED)
set_target_properties(avcodec-58
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libavcodec-58.so)
add_library(avdevice-58
        SHARED
        IMPORTED)
set_target_properties(avdevice-58
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libavdevice-58.so)
add_library(avformat-58
        SHARED
        IMPORTED)
set_target_properties(avformat-58
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libavformat-58.so)
add_library(avutil-56
        SHARED
        IMPORTED)
set_target_properties(avutil-56
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libavutil-56.so)
add_library(swresample-3
        SHARED
        IMPORTED)
set_target_properties(swresample-3
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libswresample-3.so)
add_library(swscale-5
        SHARED
        IMPORTED)
set_target_properties(swscale-5
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libswscale-5.so)
add_library(avfilter-7
        SHARED
        IMPORTED)
set_target_properties(avfilter-7
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi/libavfilter-7.so)
#------------------------FFmpeg----------------------------------

三、编写Native代码

编写java类​​FFmpegUtil​​:
​​package com.demo.ffmpegworld; public class FFmpegUtil { static { System.loadLibrary("ffmpeg-util"); } /** * 获取FFmpeg的配置信息 * * @return 配置信息字符串 */ public static native String getAvcodecConfiguration(); }​​
在​​app/src/main/cpp​​文件夹下,创建​​ffmpeg-util.h​​文件:
​​#ifndef FFMPEG_NATIVE_LIB_H #define FFMPEG_NATIVE_LIB_H #include <jni.h> #include <string> #include <android/log.h> extern "C" { //编码 #include "libavcodec/avcodec.h" //封装格式处理 #include "libavformat/avformat.h" //像素处理 #include "libswscale/swscale.h" #include <android/native_window_jni.h> #include <unistd.h> JNIEXPORT jstring JNICALL Java_com_demo_ffmpegworld_FFmpegUtil_getAvcodecConfiguration(JNIEnv *env, jobject /* this */); } #define LOGI(FORMAT, ...) __android_log_print(ANDROID_LOG_INFO,"jason",FORMAT,##__VA_ARGS__); #define LOGE(FORMAT, ...) __android_log_print(ANDROID_LOG_ERROR,"jason",FORMAT,##__VA_ARGS__); #endif //FFMPEG_NATIVE_LIB_H​​
在​​app/src/main/cpp​​文件夹下,创建​​ffmpeg-util.cpp​​文件:
​​#include "ffmpeg-util.h" extern "C" JNIEXPORT jstring JNICALL Java_com_demo_ffmpegworld_FFmpegUtil_getAvcodecConfiguration(JNIEnv *env, jobject /* this */) { std::string hello = "Hello from C++"; char info[10000] = {0}; sprintf(info, "%s\n", avcodec_configuration()); return env->NewStringUTF(info); }​​

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值