一、下载NDK和FFmpeg

NDK和FFmpeg的版本需要对应起来,否则编译过程中可能失败。
这里采用的版本为android-ndk-r15c-linux-x86_64.zipffmpeg-4.0.tar.bz2

1、NDK下载:android-ndk-r15c-linux-x86_64.zip,解压路径为/usr/android-ndk-r15c
解压完成后把NDK路径加入环境变量:

vim ~/.bashrc
添加:
export NDKROOT=/usr/android-ndk-r15c
export PATH=$NDKROOT:$PATH
保存退出,更新环境变量:
source ~/.bashrc

2、FFmpeg下载:ffmpeg-4.0.tar.bz2,解压路径为/usr/android-ndk-r15c/sources/ffmpeg-4.0FFmpeg的路径必须在NDK的sources文件夹下。

二、修改FFmpeg的configure

打开/usr/android-ndk-r15c/sources/ffmpeg-4.0路径下的configure文件,找到动态库名称编译规则(3557行-3568行):

SLIBPREF="lib"
SLIBSUF=".so"
SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
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='libavcodec.so.58,因为主版本号在.so后面,不能被android系统识别,所以需要把主版本号放在.so前面,修改最后四行规则为:

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

三、编写脚本

/usr/android-ndk-r15c/sources/ffmpeg-4.0路径下新建脚本文件build_android.sh

#!/bin/bash
NDK=/usr/android-ndk-r15c
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--enable-protocol=concat \
--enable-protocol=file \
--enable-muxer=mp4 \
--enable-demuxer=mpegts \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean all
make -j3
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one

给文件权限:

chmod 777 build_android.sh

注意1:如果该文件是从windows传输到linux的,需要注意编码格式必须为UTF-8
注意2:第三行SYSROOT=$NDK/platforms/android-19/arch-arm/中的android-19为可用版本,其他版本不一定编译成功。

四、编译

运行脚本文件build_android.sh,等待几分钟后,如无错误,会在/usr/android-ndk-r15c/sources/ffmpeg-4.0/android路径下生成类库和头文件。
FFmpeg编译后生成的类库文件路径为/usr/android-ndk-r15c/sources/ffmpeg-4.0/android/arm/lib,包含以下.so文件:

libavcodec-58.so
libavdevice-58.so
libavfilter-7.so
libavformat-58.so
libavutil-56.so
libpostproc-55.so
libswresample-3.so
libswscale-5.so

头文件路径为/usr/android-ndk-r15c/sources/ffmpeg-4.0/android/arm/include,包含以上.so文件对应的头文件。

五、其他

本文参考了雷霄骅博士的博客:最简单的基于FFmpeg的移动端例子:Android HelloWorld。
积分多的可以直接下载编译好的文件(5积分是系统默认设置的,无法修改…):Android端FFmpeg类库和头文件。
后续我会基于以上编译好的文件,在AndroidStudio中进行FFmpeg的开发,并发布相应的教程。

Linux环境下用NDK编译FFmpeg相关推荐

  1. Windows下用ndk编译ffmpeg

    Windows下用ndk编译ffmpeg   第一步:创建一个android工程,然后将ffmpeg整体放到jni下,并创建Android.mk和Application.mk Android.mk: ...

  2. 服务器远程连接控制以及在Linux环境下安装go编译环境

    本文主要内容 一.xshell远程控制服务器 二.VS code远程控制服务器 三.在Linux环境下安装go编译环境 初学者在没有人的指导下自己摸索学习真的是太难了,回想一下从大二创新实践开始到现在 ...

  3. linux编译fdk aac,Ubuntu下利用NDK编译ffmpeg+x264+fdk-aac

    由于FFmpeg.x264.Fdk-aac的版本问题,所以编译的时候有很多坑 编译顺序: 首先利用脚本分别编译x264和fdk-aac库,生成头文件(.h)与静态库文件(.a/.la). 将FFmpe ...

  4. linux环境下将nginx编译安装至指定目录步骤详解

    1.下载nginx(linux版本) 下载地址见:http://nginx.org/download/ 2.安装nginx编译环境 # yum -y install gcc-c++ # yum -y ...

  5. 编写第一个Linux环境下程序的编译,下载记录

    跟着韦东山学习Linux: 今天系统系统性的学了代码的编译下载,条记录一下: 一,代码:001_led_on.S,就把下面代码编译后Bin文件下载进2440处理器. /* * 点亮LED1: gpf4 ...

  6. Linux环境下源码编译方式安装MySQL5.1(1)

    1.源码安装MySQL 5.1 GA 创建组和用户: [root@mysqldb2 ~]# groupadd mysql [root@mysqldb2 ~]# useradd -g mysql mys ...

  7. linux下怎么编译贪吃蛇,Linux 环境下C语言编译实现贪吃蛇游戏(转载)

    本文转载 http://www.linuxidc.com/Linux/2011-08/41375.htm本文可以改进的就是它的链表实现的方式,可以考虑内核的链表实现 #include #include ...

  8. NDK实践(一)在linux环境下编译ffmpe

    系列文章目录: NDK实践(一)在linux环境下编译ffmpe NDK实践(二)将编译的ffmpeg静态库集成到Android工程 最近开始接触学习ndk开发,本着边学习边实践的原则,计划完成视频编 ...

  9. ffmpeg编译gb28181_RTSP/GB28181协议/海康SDK/Ehome协议视频上云网关EasyCVR视频平台在linux环境下ffmpeg源码单步调试环境搭建...

    目前TSINGSEE青犀视频研发的视频上云服务平台EasyCVR已经可集成海康EHome私有协议,并且在前文中我也跟大家讲过EHome协议的配置和调用流程,有兴趣的可以阅读一下:配置及协议介绍.Eho ...

最新文章

  1. 新的MOVE结构,和在项目中实际的感受
  2. 【深度学习】如何从结构出发更好的改进一个神经网络(二)
  3. 【HDU 1735】字数统计(贪心,有缺陷的一道题)
  4. jq 方法函数(淡入淡出,查找元素,过滤)遍历
  5. 2016030206 - mysql常用命令
  6. 130个你需要了解的VIM命令
  7. Crowdin 使用指南
  8. Mybatis非mapper代理配置
  9. vm.$nextTick( [callback] )用法
  10. DPDK QOS 3 -- rte meter令牌桶的实现
  11. python 水位_python opencv之分水岭算法示例
  12. 聚焦设计交易与商业落地 DANG·DHUB设计师平台上线【图】_品牌资讯_服饰_太平洋时尚网...
  13. SHA1算法 c语言(参考其他修改)
  14. 尚学堂马士兵struts2 课堂笔记(一)
  15. 安全继电器原理及接法
  16. java多文件文件压缩加密下载
  17. ro.secure与ro.debuggable
  18. 2021最新 阿里云ECS搭建我的世界服务器
  19. Elasticsearch面试题(大数据面试)
  20. 微信商户平台转账到零钱功能接入实战

热门文章

  1. c51单片机烧录时显示正在检测目标单片机怎么处理?
  2. html 数组为空 报错,php 判断数组是否为空的几种方法
  3. 懒人精灵(一款类似按键精灵的工具)如何制作和导出lua加密插件
  4. 【Git】.gitconfig文件的具体位置怎么找
  5. android 高德地图按照经纬度导航出现路线偏差 原因:坐标系不一致
  6. Android列表收缩与展开仿QQ好友列表(非常详细,附源码)
  7. Wps的ppt里 让图片按顺序出现 就是点击一下 出现一张照片
  8. 【python】绘制内切圆
  9. oracle ebs实施伙伴,Oracle EBS 实施方法论扫盲: 什么是CRP(Confrence Room Pilot)
  10. 响应式精美列表商城卡密自动发卡网站源码