Android编译FFmpeg

本文详细介绍了如何在Linux环境下编译FFmpeg至适合Android的版本,并通过JNI将其集成到Android项目中,实现音视频处理功能。从环境配置到脚本编写,再到项目配置与CMakeLists.txt的设置,提供了完整的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、环境配置

  • 1.系统:Linux虚拟机
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.2 LTS
Release:	18.04
Codename:	bionic

2、脚本命令

根据自己需求添加编写脚本,这里只是简单的使用

#!/bin/bash
echo "进入编译ffmpeg脚本"
NDK=/home/hou/NDK/android-ndk-r14b
PLATFORM=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=armv7-a
#输出路径
PREFIX=./android/$CPU
function build
{
	echo "start ffmpeg"
	./configure \
    --prefix=$PREFIX \
    --target-os=android \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --arch=arm \
    --cpu=armv7-a  \
    --sysroot=$PLATFORM \
    --extra-cflags="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp " \
    --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
    --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
    --enable-shared \
    --enable-runtime-cpudetect \
    --enable-gpl \
    --enable-small \
    --enable-cross-compile \
    --enable-asm \
    --enable-neon \
    --enable-jni \
    --enable-mediacodec \
    --enable-decoder=h264_mediacodec \
    --enable-hwaccel=h264_mediacodec \
    --disable-debug \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-postproc \
    --disable-avdevice \
    --disable-symver \
    --disable-stripping 
    make -j16
    make install
	echo "end!"
}

build

注意: 给脚本添加权限,我直接给了777

chmod 777 bulid_android.sh
./bulid_android.sh   //运行脚本

编译出结果有对应的 so 和 include 文件夹

3、创建JNI 项目

3.1 项目配置

3.1.1 将2中生成的文件拷贝到项目中

1. 将include复制到项目中
2..so复制到libs

3.1.2 配置项目的build

android {
    compileSdkVersion 28
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
            }
            ndk{
                abiFilters("armeabi-v7a")
            }
        }
        sourceSets{
            main{
                jniLibs.srcDirs=['libs']
            }
        }
    }
  ...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

3.1.3 配置项目的CMakeLists.txt

# 添加头文件路径
include_directories(include)
#设置ffmpeg库所在路径的变量
set(FFMPEG ${CMAKE_CURRENT_SOURCE_DIR}/libs/${ANDROID_ABI})
#设置ffmpeg 导入库
add_library(avcodec SHARED IMPORTED)
#导入库那个库
set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${FFMPEG}/libavcodec.so)


target_link_libraries( # Specifies the target library.
                       native-lib
                       android
                       avcodec
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

3.2 引用avcodec.h

#include <jni.h>
#include <string>
#include <android/log.h>
extern "C"{
    #include <libavcodec/avcodec.h>
}

extern "C" JNIEXPORT jstring JNICALL
Java_com_billshuai_testplayer_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    hello += avcodec_configuration();
    return env->NewStringUTF(hello.c_str());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记住我的名字啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值