Ubuntu编译ijkplayer so库并播放本地raw/assets文件
博主的上一篇文章《ffmpeg的介绍,编译与使用》
一,前期基础知识储备
1. ijkplayer 官方项目地址:https://github.com/Bilibili/ijkplayer
ijkplayer 是一个基于 ffmpeg 的轻量级 Android/iOS 视频播放器。实现了跨平台功能,API易于集成;编译配置可裁剪,方便控制安装包大小;支持硬件加速解码,更加省电。可以通过编译来实现更多格式的支持,可以说只要是 ffmpeg 支持的格式 ijkplayer 就支持。
2. Ubuntu 下载地址:https://cn.ubuntu.com/
官方中文名“友帮拓”,也有班图、乌班图、乌斑兔、乌帮图、笨兔等非官方译名。
Ubuntu是一个以桌面应用为主的Linux操作系统,是世界上最流行的Linux系统之一。
1)虚拟机下体验:
运行虚拟机,在虚拟机中获得更完整的体验。下载安装虚拟机。成功安装后运行虚拟机,选择菜单栏中的“管理”→“导入虚拟电脑”选项,将所下载体验镜像导入虚拟机,最后运行Ubuntu虚拟机,这样就可以获得比较真实的体验。在虚拟机中几乎可以完成所有操作,没有限制。
小白菜Windows10系统安装Linux(ubuntu)虚拟机超详细教程
本文,选择这一种方式在Windows10系统中安装Ubutntu。
2)制作Live USB
还有一-种获得真实体验的途径,即制作LiveUSB,它比虚拟机更进一步,直接跑在真实的硬件环境中,更快且更加节省资源。
Ubuntu18.04/20.04完整新手安装教程
二,上手编译
具体步骤如下:
1. 配置环境 (windows)
1)安装 VMware 虚拟机并安装 Ubuntu 系统;
2)下载NDK SDK,上传至Ubuntu;
3) 配置好NDK SDK环境变量;
4) 安装git、yasm 和 make;
2. 正式编译 - 参考 ijkplayer 中编译 Android的步骤 Build Android
3. 项目中使用编译好的so库
1. 配置环境
1)安装 VMware 虚拟机并安装 Ubuntu 系统
小白菜Windows10系统安装Linux(ubuntu)虚拟机超详细教程
2)下载NDK SDK,上传至Ubuntu
下载好 Linux 版本的的 Android SDK 和 NDK,这里选择的分别是 android-sdk_r24.4.1-linux.tgz 和 android-ndk-r10e-linux-x86_64.zip,下载后可以使用如下命令解压文件:
tar -xvf android-sdk_r24.4.1-linux.tar
unzip android-ndk-r10e-linux-x86_64.zip
切记不要将 NDK 目录放在虚拟机的共享目录下,为保证编译顺利进行应将 NDK 目录放在 Ubuntu 的系统目录,也就是 /home/用户名 下面的目录。
3) 配置好NDK SDK环境变量
在 Ubuntu 下的 /home/用户名/ ,按 Ctrl+h 查看 .bashrc 文件并配置 SDK 和 NDK 环境变量,参考如下:
NDK=/home/chinstyle/android/android-ndk-r10e
export NDK
ADB=/home/chinstyle/android/android-sdk-linux/platform-tools
export ADB
# ANDROID_NDK和ANDROID_SDK路径
ANDROID_NDK=/home/chinstyle/android/android-ndk-r10e
export ANDROID_NDK
ANDROID_SDK=/home/chinstyle/android/android-sdk-linux
export ANDROID_SDK
# 加入到PATH路径
PATH=${PATH}:${NDK}:${ADB}:${ANDROID_NDK}:${ANDROID_SDK}
配置完成后保存并关闭 .bashrc,打开 Terminal 输入 ndk-build -v 查看 ndk 是否配置成功,运行日志如下则配置成功:
Ctrl + Alt + T - 打开终端。
若是提示 ndk -build 权限不够,则需要给权限,建议给整个ndk文件夹权限。
chmod -R 777 文件夹
参数-R是递归的意思
777表示开放所有权限
4) 安装git、yasm 和 make
sudo apt-get update
sudo apt install git
sudo apt install yasm
sudo apt install make
使用 git --version 和 make -v 查看 git 和 make 工具是否安装成功,成功则显示对应版本号,参考如下:
chinstyle@chinstyle-virtual-machine:~$ git --version
git version 2.25.1
chinstyle@chinstyle-virtual-machine:~$ make -v
GNU Make 4.2.1
为 x86_64-pc-linux-gnu 编译
Copyright (C) 1988-2016 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本<http://gnu.org/licenses/gpl.html>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。
2. 正式编译
参考 ijkplayer 中编译 Android的步骤 Build Android
//clone ijkplayer源码
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer
cd ijkplayer
git checkout -B latest k0.8.8
//使用更轻量的module-lite.sh
cd ijkplayer/config
rm module.sh
ln -s module-lite module.sh
//下载ffmpeg源码 - 耗时较长
cd ijkplayer
./init-android.sh
//编译arm64 ffmpeg
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh arm64 // 若是使用all 则编译所有架构的so
//编译ijkplayer,生成arm64 so文件
cd ijkplayer/android
./compile-ijk.sh arm64 // 若是使用all 则编译所有架构的so
提几点注意事项:
1)git checkout -B latest k0.8.8 - 要切换到此分支,要不然后续使用C++方法会缺失;
2)ln -s module-lite module.sh - ijkplayer 提供了3个版本的编译脚本配置
module-default.sh:默认,如果你喜欢更多类型可以用这个;
module-lite-hevc.sh:如果您更喜欢较小的二进制大小的编解码器/格式(包括hevc功能)
module-lite.sh:如果您更喜欢较小的二进制大小的编解码器/格式(默认情况下)
区别:lite.sh相当于在default.sh的基础上,关闭了所有的解码器等全体操作,然后按照需求,比如开启对应的解码器。具体可以打开编译脚本查看。你可以打开module.sh自行进行修改。
3)compile-ffmpeg.sh arm64 & compile-ijk.sh arm64 :这里只编译arm64位的so库,这样编译时间短点。若是需要编译所有架构的so,则把arm64换成all就行了。
编译时间较长,需要耐心等待。
4)编译结果 - 生成对应的so库
编译的ijkplayer 项目整体如下:
3. 使用编译好的so库
1)添加ijkplayer依赖
//ijkplayer playerimplementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'//ijkplayer so文件implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
这是直接使用ijkplayer提供的依赖,可以直接使用。
我们这里选择使用自己刚刚编译好的so。把“ijkplayer-java” 和 “ijkplayer-arm64” 2个项目全部拷贝至我们的项目中,以项目依赖的方式直接使用。
setting.gradle
include ':app', 'ijkplayer-arm64','ijkplayer-java'build.gradle
// implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
// implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'api project(path: ':ijkplayer-arm64')api project(path: ':ijkplayer-java')
2)播放raw/assets下的音乐文件
// 播放raw下的音乐public void onIjkPlayRaw(View view) {//实例化播放内核tv.danmaku.ijk.media.player.IjkMediaPlayer ijkPlayer = new tv.danmaku.ijk.media.player.IjkMediaPlayer();//获得播放源访问入口AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.ynew); // 注意这里的区别//构建IjkPlayer能识别的IMediaDataSource,下面的RawDataSourceProvider实现了IMediaDataSource接口RawDataSourceProvider sourceProvider = new RawDataSourceProvider(afd);//给IjkPlayer设置播放源ijkPlayer.setDataSource(sourceProvider);//设置准备就绪状态监听ijkPlayer .setOnPreparedListener((IMediaPlayer.OnPreparedListener) mp -> {// 开始播放ijkPlayer.start();});//准备播放ijkPlayer.prepareAsync();}// 播放assets下的音乐public void onIjkPlayAsset(View view) {tv.danmaku.ijk.media.player.IjkMediaPlayer ijkPlayer = new tv.danmaku.ijk.media.player.IjkMediaPlayer();AssetManager am = getAssets();try {AssetFileDescriptor afd = am.openFd("intput.aac");RawDataSourceProvider sourceProvider = new RawDataSourceProvider(afd);ijkPlayer.setDataSource(sourceProvider);} catch (IOException e) {e.printStackTrace();}ijkPlayer .setOnPreparedListener((IMediaPlayer.OnPreparedListener) mp -> {ijkPlayer.start();});ijkPlayer.prepareAsync();}
// ijkplayer播放本地文件的入口
public class RawDataSourceProvider implements IMediaDataSource {private AssetFileDescriptor mDescriptor;private byte[] mMediaBytes;public RawDataSourceProvider(AssetFileDescriptor descriptor) {this.mDescriptor = descriptor;}@Overridepublic int readAt(long position, byte[] buffer, int offset, int size) throws IOException {if(position + 1 >= mMediaBytes.length){return -1;}int length;if(position + size < mMediaBytes.length){length = size;}else{length = (int) (mMediaBytes.length - position);if(length > buffer.length)length = buffer.length ;length--;}System.arraycopy(mMediaBytes, (int) position, buffer, offset, length);return length;}@Overridepublic long getSize() throws IOException {long length = mDescriptor.getLength();if(mMediaBytes == null){InputStream inputStream = mDescriptor.createInputStream();mMediaBytes = readBytes(inputStream);}return length;}@Overridepublic void close() throws IOException {if(mDescriptor != null)mDescriptor.close();mDescriptor = null;mMediaBytes = null;}private byte[] readBytes(InputStream inputStream) throws IOException {ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();int bufferSize = 1024;byte[] buffer = new byte[bufferSize];int len = 0;while ((len = inputStream.read(buffer)) != -1) {byteBuffer.write(buffer, 0, len);}return byteBuffer.toByteArray();}public static RawDataSourceProvider create(Context context, Uri uri){try {AssetFileDescriptor fileDescriptor = context.getContentResolver().openAssetFileDescriptor(uri, "r");return new RawDataSourceProvider(fileDescriptor);} catch (FileNotFoundException e) {e.printStackTrace();}return null;}
}
至此,我们编译ijkplayer就完成了。
参考文章
《如何正确编译ijkplayer》
《ijkplayer编译so库真没那么难》
《一步步带你编译哔哩哔哩ijkPlayer》
《播放Raw/Assets音视频方法总结》
Ubuntu编译ijkplayer so库并播放本地raw/assets文件相关推荐
- Android 使用MediaPlayer播放本地raw资源超简单实现点击播放效果
废话不多说直接上代码 MediaPlayer mPlayer: if (mPlayer!=null){ //判断当mPlayer不为空的时候mPlayer.stop(); //先结束上一个播放内容 } ...
- php内嵌百度播放器,网页中内嵌的百度影音插件如何从网页中播放本地上的文件_html/css_WEB-ITnose...
求大神帮助.. 红色部分 怎么弄才行. 回复讨论(解决方案) 这样应该不行吧. 用相对路径试试 相对路径怎么弄. 这样应该不行吧. 用相对路径试试 这样应该不行吧. 用相对路径试试 放在同一目录也不行 ...
- php内嵌百度播放器,网页中内嵌的百度影音插件 如何从网页中播放本地上的文件_html/css_WEB-ITnose...
求大神帮助.. 红色部分 怎么弄才行. 回复讨论(解决方案) 这样应该不行吧. 用相对路径试试 相对路径怎么弄. 这样应该不行吧. 用相对路径试试 这样应该不行吧. 用相对路径试试 放在同一目录也不行 ...
- Ubuntu编译安装sqlite3库
1.环境 Ubuntu 20.04.4 LTS 2.sqlite3数据库的优势 sqlite3属于轻量级的数据库,特别适用于嵌入式设备,部署方便.操作简单. 3.sqlite代码获取 https:// ...
- Ubuntu 编译ijkplayer 支持几乎所有格式(MP4,mov,mkv,avi,wmv,m4v,mpg,webm,ogv,3g2.flv,f4v,swf)和https
以下都是经过自己测试过的,并集成,已测试MP4,mov,mkv,avi,wmv,m4v,mpg,webm,ogv,3g2.flv,f4v,swf格式可正常播放并有声音 整个编译过程和集成是按下面说的博 ...
- Ubuntu 编译jdk源码
Ubuntu 编译jdk源码 一 下载需要的依赖文件 sudo apt-get install libfreetype6-dev sudo apt-get install libcups2-dev s ...
- 用VideoView实现播放本地的m3u8
代码地址: https://git.oschina.net/2021/LPlayer Android 4.0及以上本身就支持播放m3u8格式,可以使用VideoView进行实现. 但是有一点很奇怪,播 ...
- [Android多媒体技术] 播放Raw/Assets音视频方法总结
转自:https://juejin.im/post/5bec0958e51d454c7d0f9a32 关于ijkplayer这块已验证可以播放音视频,Seek正常. 标红: 文章里RawDataSou ...
- Ubuntu 编译 哔哩哔哩 IJKPlayer so库,并支持RTSP
1. 环境与配置 1.1 系统版本 系统我这里使用的Ubuntu 18.04.4 LTS 1.2 更新软件源列表 sudo apt update 1.3 安装git sudo apt install ...
最新文章
- 剑指offer:面试题30. 包含min函数的栈
- 空间直角坐标系与球面坐标互转
- 瑞士军刀——Pandoc
- GetMessage和PeekMessage的区别
- vi测试仪维修成功率高吗?_电工电路板检测维修无图电路板的技巧
- 图网络中的社群及社群发现算法
- ipvs,ipvsadm的安装及使用
- Oracle11g报bde,表现 – BDE与ADO在德尔福
- NSURLSessionDownloadTask实现大文件下载
- Python稳基修炼之计算机等级考试易错概念题3(含答案与解析)
- 页面间参数传递---基于Vue的uniapp手机端_前端UI_uview工作笔记005
- erp系统是什么版本
- wordpress 更新以及下载插件:wordpress 安装失败:无法创建目录
- 百度地图坐标系统应用
- 2018最新--Win10屏幕亮度无法调节问题的解决方法
- 如何解决“Appstore无法下载软件”的问题
- 实例:用C#.NET手把手教你做微信公众号开发(系列文章索引目录)
- 在下载 chromium 源码时错误汇总
- mipi的dsi全称_MIPI DSI 协议介绍
- openwrt修改logo
热门文章
- Snaker如何配置期望完成时间、提醒时间、重复提醒间隔
- 组合数学拉丁方是什么
- python群发邮件_python smtp 群发邮件
- 每次开机启动都会创建图标和修改锁定任务栏浏览器的主页
- 手把手教你 SSM 整合(非常非常非常非常非常详细)
- C# 中获取时间戳的方法
- 什么设备升级android9,三星设备安卓9.0升级路线图更新:共30款
- mac 系统偏好设置的“安全与隐私”中默认已经去除了允许“任何来源”App的选项
- 禁忌殿堂:大脑植入电极的是非功过
- 安卓 仿联系人索引列表 A到Z排序查询