Android 中使用ffmpeg,个人学习记录

前言:要使用ffmpeg就是用它的各种库,这里用动态so库,使用centos7编译。
1.租一台云服务器,部署centos7
2.wget xxxxffmpeg安装包地址 //这里我使用3.3的
3.tar -xzf xxx安装包 //解压
4.mkdir ndkbuild 并进入此目录 /
5.wget 下载ndk包 //这里选择14b的
6.unzip 安装包
7.cd 退到根目录后:vim ~/.bashrc 进入后改为:

export NDKROOT=/root/ndkbuild/android-ndk-r14b//配置你的安装路径
export PATH=$NDKROOT:$PATH//配置路径

保存退出:wq!
8 :source ~/.bashrc //执行后修改环境变量
9.进入ffmpeg包目录,新建vim android_build.sh,并写入

#!/bin/bash

echo "进入FFmpeg编译脚本"

export NDK=/root/ndkbuild/android-ndk-r14b
export SYSROOT=$NDK/platforms/android-21/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 
PREFIX=android-build

COMMON_OPTIONS="\
    --prefix=android/ \
    --target-os=android \
    --enable-shared \
    --enable-runtime-cpudetect \
    --enable-small \
    --disable-static \
    --disable-debug \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-doc \
    --disable-symver \
    --disable-asm \
    --disable-stripping \
    --disable-armv5te \
    "

function build_android {

    echo "开始编译FFmpeg..."

    # armeabi
    echo "开始编译FFmpeg(armeabi)"
    ./configure \
    --libdir=${PREFIX}/libs/armeabi \
    --incdir=${PREFIX}/include/armeabi \
    --pkgconfigdir=${PREFIX}/pkgconfig/armeabi \
    --arch=arm \
    --cpu=armv6 \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --sysroot=$SYSROOT \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS}
    make clean
    make -j8 && make install
    echo "结束编译FFmpeg(armeabi)"

    # armeabi-v7a
    echo "开始编译FFmpeg(armeabi-v7a)"
    ./configure \
    --libdir=${PREFIX}/libs/armeabi-v7a \
    --incdir=${PREFIX}/include/armeabi-v7a \
    --pkgconfigdir=${PREFIX}/pkgconfig/armeabi-v7a \
    --arch=arm \
    --cpu=armv7-a \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --sysroot=$SYSROOT \
    --extra-cflags="-march=armv7-a -mfloat-abi=softfp -mfpu=neon" \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS}
    make clean
    make -j8 && make install
    echo "结束编译FFmpeg(armeabi-v7a)"

    # arm64-v8a
    echo "开始编译FFmpeg(arm64-v8a)"
    ./configure \
    --libdir=${PREFIX}/libs/arm64-v8a \
    --incdir=${PREFIX}/include/arm64-v8a \
    --pkgconfigdir=${PREFIX}/pkgconfig/arm64-v8a \
    --arch=aarch64 \
    --cpu=armv8-a \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --sysroot=$SYSROOT \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS} 
    make clean
    make -j8 && make install
    echo "结束编译FFmpeg(arm64-v8a)"

    # x86_64
    echo "开始编译FFmpeg(x86_64)"
    ./configure \
    --libdir=${PREFIX}/libs/x86_64 \
    --incdir=${PREFIX}/include/x86_64 \
    --pkgconfigdir=${PREFIX}/pkgconfig/x86_64 \
    --arch=x86_64 \
    --cpu=x86_64 \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --sysroot=$SYSROOT \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS}
    make clean
    make -j8 && make install
    echo "结束编译FFmpeg(x86_64)"

    echo "编译结束"

};
build_android

10.给android_build.sh修改权限,添加执行权限
chmod +x android_build.sh
11.修改ffmpeg包目录下的configure文件
将:

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

替换为:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

最后在ffmpeg包目录下执行sh文件

./android_build.sh

编译后ffmpeg包下会多一个android-build目录,里面就是include目录下得到各种架构的头文件和libs目录下的各种架构的so动态库

二:将ffmpeg动态库移植到安卓工程中
1.新建一个ndk项目
2.将CmakeLists.txt文件移动到和gradle文件同目录下(即app目录下)
3.将CmakeLists .txt文件修改为:


cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.
        native-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        src/main/cpp/native-lib.cpp
        )

find_library( log-lib
        log )


include_directories(libs/include)
set(DIR ../../../../libs)
add_library(avcodec
        SHARED
        IMPORTED)
set_target_properties(avcodec
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi-v7a/libavcodec.so)

add_library(avdevice
        SHARED
        IMPORTED)
set_target_properties(avdevice
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi-v7a/libavdevice.so)
add_library(avformat
        SHARED
        IMPORTED)
set_target_properties(avformat
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi-v7a/libavformat.so)
add_library(avutil
        SHARED
        IMPORTED)
set_target_properties(avutil
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi-v7a/libavutil.so)
add_library(swresample
        SHARED
        IMPORTED)
set_target_properties(swresample
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi-v7a/libswresample.so)
add_library(swscale
        SHARED
        IMPORTED)
set_target_properties(swscale
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi-v7a/libswscale.so)
add_library(avfilter
        SHARED
        IMPORTED)
set_target_properties(avfilter
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/armeabi-v7a/libavfilter.so)
target_link_libraries( native-lib
        avfilter
        avcodec
        avdevice
        avformat
        avutil
        swresample
        swscale
        ${log-lib}
        android
        )

4.修改gradle文件,:

  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
                jni.srcDirs = []
            }
        }
        externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters 'armeabi-v7a'
            }
        }
        ndk {
            abiFilters 'armeabi-v7a'
        }

5.在libs文件下新建armeabi-v7a目录,将编译后的armeabi-v7a目录下的so库复制到armeabi-v7a目录下
6.在libs文件下新建include目录,将编译后include\armeabi-v7a目录的文件全部复制到include目录下
整体项目结构如图:
在这里插入图片描述
到此就可以了,后面就是写代码实现视频播放了,发现播放好慢,后面看看别人写的模仿学习吧,毕竟刚学,哈哈。
参考1
参考2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android使用C++调用FFmpeg库的例子可以分为以下几个步骤: 1. 在Android Studio创建一个新的NDK项目。 2. 将FFmpeg库导入到项目,并在CMakeLists.txt文件添加FFmpeg库的路径和链接库。 3. 在JNI接口调用FFmpeg库的函数,例如av_version_info()。 4. 在Java代码调用JNI接口。 下面是一个简单的例子,演示如何在Android使用C++调用FFmpeg库: 1. 在Android Studio创建一个新的NDK项目。 2. 将FFmpeg库导入到项目,并在CMakeLists.txt文件添加FFmpeg库的路径和链接库。 ``` // CMakeLists.txt cmake_minimum_required(VERSION 3.4.1) add_library(ffmpeg SHARED IMPORTED) set_target_properties(ffmpeg PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libffmpeg.so) add_library(native-lib SHARED native-lib.cpp) find_library(log-lib log) target_link_libraries(native-lib ffmpeg ${log-lib}) ``` 3. 在JNI接口调用FFmpeg库的函数,例如av_version_info()。 ``` // native-lib.cpp #include <jni.h> #include <string> #include <android/log.h> #include "libavutil/avutil.h" extern "C" JNIEXPORT jstring JNICALL Java_com_example_ffmpegdemo_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "FFmpeg version: "; hello += av_version_info(); return env->NewStringUTF(hello.c_str()); } ``` 4. 在Java代码调用JNI接口。 ``` // MainActivity.java public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = findViewById(R.id.sample_text); tv.setText(stringFromJNI()); } public native String stringFromJNI(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值