Linux环境下用NDK编译FFmpeg
一、下载NDK和FFmpeg
NDK和FFmpeg的版本需要对应起来,否则编译过程中可能失败。
这里采用的版本为android-ndk-r15c-linux-x86_64.zip
和ffmpeg-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.0
。FFmpeg的路径必须在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相关推荐
- Windows下用ndk编译ffmpeg
Windows下用ndk编译ffmpeg 第一步:创建一个android工程,然后将ffmpeg整体放到jni下,并创建Android.mk和Application.mk Android.mk: ...
- 服务器远程连接控制以及在Linux环境下安装go编译环境
本文主要内容 一.xshell远程控制服务器 二.VS code远程控制服务器 三.在Linux环境下安装go编译环境 初学者在没有人的指导下自己摸索学习真的是太难了,回想一下从大二创新实践开始到现在 ...
- linux编译fdk aac,Ubuntu下利用NDK编译ffmpeg+x264+fdk-aac
由于FFmpeg.x264.Fdk-aac的版本问题,所以编译的时候有很多坑 编译顺序: 首先利用脚本分别编译x264和fdk-aac库,生成头文件(.h)与静态库文件(.a/.la). 将FFmpe ...
- linux环境下将nginx编译安装至指定目录步骤详解
1.下载nginx(linux版本) 下载地址见:http://nginx.org/download/ 2.安装nginx编译环境 # yum -y install gcc-c++ # yum -y ...
- 编写第一个Linux环境下程序的编译,下载记录
跟着韦东山学习Linux: 今天系统系统性的学了代码的编译下载,条记录一下: 一,代码:001_led_on.S,就把下面代码编译后Bin文件下载进2440处理器. /* * 点亮LED1: gpf4 ...
- Linux环境下源码编译方式安装MySQL5.1(1)
1.源码安装MySQL 5.1 GA 创建组和用户: [root@mysqldb2 ~]# groupadd mysql [root@mysqldb2 ~]# useradd -g mysql mys ...
- linux下怎么编译贪吃蛇,Linux 环境下C语言编译实现贪吃蛇游戏(转载)
本文转载 http://www.linuxidc.com/Linux/2011-08/41375.htm本文可以改进的就是它的链表实现的方式,可以考虑内核的链表实现 #include #include ...
- NDK实践(一)在linux环境下编译ffmpe
系列文章目录: NDK实践(一)在linux环境下编译ffmpe NDK实践(二)将编译的ffmpeg静态库集成到Android工程 最近开始接触学习ndk开发,本着边学习边实践的原则,计划完成视频编 ...
- ffmpeg编译gb28181_RTSP/GB28181协议/海康SDK/Ehome协议视频上云网关EasyCVR视频平台在linux环境下ffmpeg源码单步调试环境搭建...
目前TSINGSEE青犀视频研发的视频上云服务平台EasyCVR已经可集成海康EHome私有协议,并且在前文中我也跟大家讲过EHome协议的配置和调用流程,有兴趣的可以阅读一下:配置及协议介绍.Eho ...
最新文章
- 新的MOVE结构,和在项目中实际的感受
- 【深度学习】如何从结构出发更好的改进一个神经网络(二)
- 【HDU 1735】字数统计(贪心,有缺陷的一道题)
- jq 方法函数(淡入淡出,查找元素,过滤)遍历
- 2016030206 - mysql常用命令
- 130个你需要了解的VIM命令
- Crowdin 使用指南
- Mybatis非mapper代理配置
- vm.$nextTick( [callback] )用法
- DPDK QOS 3 -- rte meter令牌桶的实现
- python 水位_python opencv之分水岭算法示例
- 聚焦设计交易与商业落地 DANG·DHUB设计师平台上线【图】_品牌资讯_服饰_太平洋时尚网...
- SHA1算法 c语言(参考其他修改)
- 尚学堂马士兵struts2 课堂笔记(一)
- 安全继电器原理及接法
- java多文件文件压缩加密下载
- ro.secure与ro.debuggable
- 2021最新 阿里云ECS搭建我的世界服务器
- Elasticsearch面试题(大数据面试)
- 微信商户平台转账到零钱功能接入实战
热门文章
- c51单片机烧录时显示正在检测目标单片机怎么处理?
- html 数组为空 报错,php 判断数组是否为空的几种方法
- 懒人精灵(一款类似按键精灵的工具)如何制作和导出lua加密插件
- 【Git】.gitconfig文件的具体位置怎么找
- android 高德地图按照经纬度导航出现路线偏差 原因:坐标系不一致
- Android列表收缩与展开仿QQ好友列表(非常详细,附源码)
- Wps的ppt里 让图片按顺序出现 就是点击一下 出现一张照片
- 【python】绘制内切圆
- oracle ebs实施伙伴,Oracle EBS 实施方法论扫盲: 什么是CRP(Confrence Room Pilot)
- 响应式精美列表商城卡密自动发卡网站源码