28.FFmpeg+OpenGLES+OpenSLES播放器实现(二.Ubunto系统环境配置)
项目源码
FFmpeg开发文档
编译过程中涉及到很多ndk中的so库和头文件以及交叉编译的工具,在命令执行的时候会在ndk相应的目录下去查找,所以我们可以使用export命令事先将这些路径设置到环境变量,使用的时候可以很方便的找到
//NDK加入环境变量,以我的ndk存放路径为例 export NDK=/root/renzhenming/ffmpeg/android-ndk-r14b //ndk的platforms文件夹中存放的是各个版本架构下的so库和头文件 export PLATFORM=$NDK/platforms/android-21/arch-arm //指定交叉编译工具的路径 export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 //指定输出类型,以armv7-a为例 export CPU=armv7-a //指定so文件编译后的输出路径 export PREFIX=./android/$CPU
相关命令解析
脚本中定义了一个方法build_ffmpeg,最终它被调用两次生成支持neon和硬解码的so库和不支持neon和硬解码的so库
configure :是ffmpeg中已有的一个配置文件,我们的脚本其实也就是去执行这个文件,所有生成so的工作都在这里进行
prefix : 指定最终生成的so的安装目录
target-os : 指定目标系统,早期很多脚本在2.x上把这个指定为linux,可以,但是ffmpeg更新之后,在3.x的版本之上会导致问题,头文件找不到之类的,这是一点差异
cross-prefix:指定交叉编译的前缀,在交叉编译的情况下,比如交叉编译使用的gcc,那么会在gcc前加上这个前缀,就是一个完整的gcc工具的路径,可以通过这个路径找到这个工具(/home/renzhenming/ffmpeg/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc)
sysroot:指定这套系统依赖的库和头文件位置,就是我们配置的PLATFORMS,交叉编译在本系统中是找不到这些库的,可以把这些库看作是交叉编译的环境
extra-cflags:给gcc提供的一系列参数,这个可配可不配。 -fPIC编译动态链接库的参数, -mfpu指定协处理器,-mfloat-abi=softfp软浮点
nm:符号查看工具
enable-shared:编译成动态库,大概在3.4之前的ffmpeg版本,我们编译的时候需要修改configure文件中的一些参数,因为默认生成的so库文件名有问题,无法直接调用,3.4不再需要手动修改
enable-runtime-cpudetect :开启运行期cpu检测,不支持的指令可以自动被替换
enable-gpl:ffmpeg要求商用中如果开启这个gpl,那么你的代码要开源,否则不准开启,不开启有些库无法使用
enable-small:打出来的so更小
enable-asm:允许汇编,指令优化
支持硬解码,打开后jni可以调用java的源码
--enable-jni
--enable-mediacodec
解码器
--enable-decoder=h264_mediacodec
硬件加速
--enable-hwaccel=h264_mediacodec \
完整的编译脚本
#!/bin/bash echo "开始编译ffmpeg" #配置ndk的路径 NDK=/home/renzhenming/ffmpeg/android-ndk-r14b #指定Android版本指定架构的so库和头文件 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_ffmpeg { echo "开始编译ffmpeg" ./configure \ --prefix=$PREFIX \ --target-os=android \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --arch=arm \ --cpu=$CPU \ --sysroot=$PLATFORM \ --extra-cflags="$CFLAG" \ --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 \ --disable-debug \ --disable-static \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-postproc \ --disable-avdevice \ --disable-symver \ --disable-stripping \ $ADD make -j16 make install echo "编译结束!" } ########################################################### echo "编译支持neon和硬解码" CPU=armv7-a PREFIX=./android/armv7-a-neon-hard CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp " ADD="--enable-asm \ --enable-neon \ --enable-jni \ --enable-mediacodec \ --enable-decoder=h264_mediacodec \ --enable-hwaccel=h264_mediacodec " build_ffmpeg ########################################################### echo "编译不支持neon和硬解码" CPU=armv7-a PREFIX=./android/$CPU CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp " ADD= build_ffmpeg
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android多进程之Binder解绑监听的问题
Android多进程系列 Android 多进程通信之几个基本问题 Android多进程之Binder的使用 Android多进程之手动编写Binder类 接上一篇文章《Android多进程之手动编写Binder类》中向服务端注册监听事件的问题,在扩展了Binder类后,我们还需要改造对应的服务端和客户端 客户端和服务端的改造 服务端改造 增加注册监听接口的功能 private CopyOnWriteArrayList<IOnNewBookArrivedListener> mListenerList = new CopyOnWriteArrayList<IOnNewBookArrivedListener>(); private Binder mBinder = new BookManagerImpl(){ @Override public List<Book> getBookList() throws RemoteException { Log.e(TAG, "getBookList-->"+ System.currentTimeMillis(...
- 下一篇
Android Studio 点击两次返回键,退出APP
该功能的实现没有特别复杂,主要在onKeyDown()事件中实现,直接上代码,如下: 1 //第一次点击事件发生的时间 2 private long mExitTime; 3 4 /** 5 * 点击两次返回退出app 6 */ 7 @Override 8 public boolean onKeyDown(int keyCode, KeyEvent event) { 9 if (keyCode == KeyEvent.KEYCODE_BACK) { 10 if ((System.currentTimeMillis() - mExitTime) > 2000) { 11 Object mHelperUtils; 12 Toast.makeText(this, "再按一次退出APP", Toast.LENGTH_SHORT).show(); 13 //System.currentTimeMillis()系统当前时间 14 mExitTime = System.currentTimeMillis(); 15 } else { 16 finish(); 17 } 18 return t...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果