AndroidStudio3.6 用ffmpeg开发音视频01 带领初学者一步一步在ubuntu上开始编译ffmpeg

本文详细介绍如何在Ubuntu环境下利用NDK编译FFmpeg库,包括配置环境变量、下载源码、使用shell脚本自动配置并编译FFmpeg,最终将静态库与头文件整合至Android Studio中,为Android音视频开发提供核心函数。

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

链接:https://pan.baidu.com/s/1zB9r5WwuTMIPNMlYl5HlvA 
提取码:5ndl

没有Ubuntu的朋友,可以看我下篇博客进行搭建

VMware 搭建 Ubuntu 教程

为什么需要编译ffmpeg?

ffmpeg是用C语言写的,我们想要使用在JNI中引用ffmpeg提供的函数,那么首先就需要将ffmpeg的源代码编译成静态库或者是动态库,这样在JNI中,我们就可以以静态库或动态库的方式去加载ffmpeg中的函数。

为什么需要NDK?

ffmpeg虽然是C语言写的,但不是用什么编译器编译都行,比如你想在windows上使用ffmpeg,那么就要求你用针对于Windos的C编译器。你想在Linux上使用ffmpeg,就要求你用针对于Linux的C编译器,同理,你在Android上使用ffmpeg,就要求你使用针对于Android上的C编译器。而NDK,这里面恰好提供了针对Android的C编译器,所以我们需要在Linux上安装NDK。

ubuntu上安装NDK

这里我的系统是ubuntu,如果你是初学者,那么建议你的环境,以及使用的工具都有我一样,避免出了问题,你无法解决。

这里我使用如下的NDK版本,推荐大家使用。

android-nkd-r17-linux-x86_64.zip后,在linux上,按如下命令解压

unzip android-ndk-r17-linux-x86_64.zip 

解压之后,如下

然后将NDK的根目录设置到NDK_ROOT变量里,注意NDK_ROOT是我自己定义的一个变量,到时要配合一个shell脚本使用,所以大家名字别搞错了。

开始设置NDK_ROOT变量

切换到android-ndk-r17里,输入pwd,可以获取当前目录的全路径,如下

设置环境变量NDK_ROOT

用export 设置NDK_ROOT

用echo 输出一下,如果有显示,就说明确实配置成功了.

下载ffmpeg源码

官网http://ffmpeg.org/download.html

我用的是下面这个版本,你们可以跟我一样

下载好后,在ubuntu中,用如下方式解压

解压好之后,进入ffmpeg-4.2.2

在ffmpeg-4.2.2里面有个configure

这个configure是做什么的呢?

它是一个可执行文件,它的作用是生成makefile文件。

makefile文件是做什么的呢?

maefile是告诉c编译器,应该先编译哪些代码,后编译哪些代码。至于哪些先编译,哪些后编译,对我们而言不需要关心,我们只要运行这个configure,让它帮助我们自动生成makefile就行了。

configure 在执行时,需要配置很多参数,我们自己输入太麻烦了。于是,我做了一个shell脚本,在shell脚本里配置了configure需要用到的参数,到时我们运行这个shell脚本就好了。shell脚本内容如下,文件名是myconfigure.sh

在网盘里提供了该文件

#!/bin/bash

CPU=arm-linux-androideabi
TOOLCHAIN=$NDK_ROOT/toolchains/$CPU-4.9/prebuilt/linux-x86_64
#从as的 externalNativeBuild/xxx/build.ninja
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -O0 -fPIC"
INCLUDES=" -isystem $NDK_ROOT/sources/android/support/include"

PREFIX=./ndkInstall

./configure \
--prefix=$PREFIX \
#优化编译大小
--enable-small \
#不生成可执行程序
--disable-programs \
#不支持Android 摄像头的开发,因此禁用掉
--disable-avdevice \
#音视频编码功能,可以先屏蔽掉
--disable-encoders \
#禁用所有的混合器
--disable-muxers \
#禁用所有的过滤器
--disable-filters \
#开启交叉编译
--enable-cross-compile \
#指定交叉编译器的路径
--cross-prefix=$TOOLCHAIN/bin/$CPU- \
#禁用动态库生成
--disable-shared \
#作为开发,推荐生成静态库,目的是避免apk太大。
--enable-static \
#指定要导入的标准头文件,以及实现函数的路径
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS $INCLUDES" \
--extra-cflags="-isysroot $NDK_ROOT/sysroot/" \
#针对于arm CPU架构
--arch=arm \
#用于Android系统
--target-os=android 

# 清理一下 
make clean
#执行makefile
make install

里面是写什么内容,如果看不懂,那就算了,直接先用我这个脚本,先把ffmpeg玩熟练了,再回过头来看。

这个脚本的运行需要我上面配置的NDK_ROOT环境变量,如果没有配置的朋友,一定要先配置了,才能运行我这个脚本。

将myconfigure.sh拷贝到configure所在的目录

可以发现它现在是白色的,说明它缺少执行权限,执行chmod +x myconfigure.sh 可以给该文件添加执行权限。

变为绿色,就说明有执行权限了,那么就通过下面代码来执行它

./myconfigure.sh

首次执行,就不顺利,遇到下面的错误,大概是说缺少一个nasm或者yasm的汇编编译器。

既然它说没有,我们就使用下面的命令安装一个yasm吧

sudo apt-get install yasm

安装好了之后,接下来就继续执行./myconfigure,这一次执行很顺利,就是等待时间有点长。

在编译完成以后,在myconfigure的同级目录中有一个ndkInstall目录,编译好的静态库和对应的头文件,都在这里面

由于我命名没注意,应该是ffmpeg的库目录,被我写成了ndkInstall目录,请大家忽略这点吧

我们在Android中开发音视频,目的就是使用ffmpeg提供的函数,因此,我们只需要将include 和 lib 中的内容拷贝到AndroidStudio中就可以进行开发工作了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值