当前位置: 首页 > news >正文

如何将ijkplayer引入AS工程中进行二次开发

前言

ijkplayer作为业界最有名的播放器开源项目,理论上说可能很多方面都已经做得很优秀了。我们直接拿来用不就完事了吗?为什么还要进行二次开发,这不是自己给自己挖坑吗?

本着只有更优没有最优的原则,ijkplayer也存在这很多需要优化的地方,比如我们在《音视频面试基础题》中提到的直播秒开优化方案,对于基于ffmpeg的函数avformat_find_stream_info函数的调用问题就需要我们对ijkplayer进行修改。

又比如我们在使用ijkplayer播放音视频的过程中遇到了问题就可能需要对ijkplayer进行调试,这时候也需要将ijkplayer导入AS工程中才能调试。甚至一些公司更加业务需求,可能需要对ijkplayer进行一些定制化的需求,这些都需要对ijkplayer进行二次开发。

笔者在对ijkplayer进行二次开发的时候也是踩了不少坑,查了不少资料才把坑给填了,今天把它分享出来,算作一个记录。

废话不多说,直接开杠

这里说一下笔者使用的Android Studio版本是3.51,使用的NDK版本是NDKr16  

首先我们按照《ijkplayer编译实践》中所说的下载好ijkplayer的源码并编译好之后,
android/ijkplayer目录导入到AS中,导入之后我们发现并不能编译通过。

按照官方的指引如果我们想要对ijkplayer进行调试则需要在ijkplayer的源码目录下面运行一下这句命令:

sh android/patch-debugging-with-lldb.sh armv7a

运行这条命令之后我们发现报错了:

patch apply ==> armv7a
git apply ==> patches/0001-gitignore-ignore-.externalNativeBuild.patch
git apply ==> patches/0002-gradle-upgrade-build-tool-to-2.2.0-beta2.patch
error: patch failed: android/ijkplayer/ijkplayer-example/build.gradle:44
error: android/ijkplayer/ijkplayer-example/build.gradle: patch does not apply
git apply ==> patches/0003-armv7a-enable-debugging-with-LLDB.patch
error: patch failed: ijkmedia/ijkplayer/Android.mk:59
error: ijkmedia/ijkplayer/Android.mk: patch does not apply
error: patch failed: ijkmedia/ijksdl/Android.mk:70
error: ijkmedia/ijksdl/Android.mk: patch does not apply
git apply ==> patches/0004-armv7a-link-prebuilt-staic-libraries-of-ffmepg.patch

这是因为这个脚本是用git一些修改patch进行代码还原,但是由于这个脚本已经太久没有更新了,而ijkplayer的一些代码结构又有调整导致脚本无法从patch文件附带的这些信息把代码正确还原回去。

我们通过分析android/patch-debugging-with-lldb.sh这个脚本文件之后发现,这个脚本主要是针对4个patch文件进行git代码还原。

而这四个patch文件就是:

android/patches/0001-gitignore-ignore-.externalNativeBuild.patch
android/patches/0002-gradle-upgrade-build-tool-to-2.2.0-beta2.patch
android/patches/0003-$PARAM_TARGET-enable-debugging-with-LLDB.patch
android/patches/0004-$PARAM_TARGET-link-prebuilt-staic-libraries-of-ffmepg.patch

我们任意打开一个pathc文件看看,比如android/patches/0002-gradle-upgrade-build-tool-to-2.2.0-beta2.patch这个文件:

From 5d70fa0496f9ebfbcfa3786d85c74c690d66781e Mon Sep 17 00:00:00 2001
From: ctiao <calmer91@gmail.com>
Date: Mon, 29 Aug 2016 14:50:34 +0800
Subject: [PATCH 2/2] gradle: upgrade build-tool to 2.2.0-rc1

---
 android/ijkplayer/build.gradle | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/android/ijkplayer/build.gradle b/android/ijkplayer/build.gradle
index 0de03ec..6132c1d 100644
--- a/android/ijkplayer/build.gradle
+++ b/android/ijkplayer/build.gradle
@@ -5,7 +5,7 @@ buildscript {
         jcenter()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:2.1.3'
+        classpath 'com.android.tools.build:gradle:2.2.0-rc1'

         classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
         classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7'
-- 
2.7.4 (Apple Git-66)

有过git使用经验的童鞋都知道行前的+-的意思,简单来说+代表增加了这些内容,-删除了这行内容。

按照这个规则,我们通过分析这4个patch文件进行手动还原代码大概就能使工程运行起来,但是可能会因为gradle的版本太老可能会导致失败。

下面说下笔者的主要修改:

1、 将其他的非armv7a的cpu架构的库删掉或者注释

修改文件ijkplayer/setting.gradle:

//include ':ijkplayer-armv5' ':ijkplayer-x86_64'
include ':ijkplayer-armv7a'
//include ':ijkplayer-arm64'
//include ':ijkplayer-x86'

include ':ijkplayer-java'
//include ':ijkplayer-exo'

include ':ijkplayer-example'

2、 升级工程的gradle版本

对于怎么获取最新的gradle版本,笔者在这说一个技巧,首先我们使用Android Studio新建一个新的可运行项目。

然后将项目根目录下的build.gradle下的classpath这行拷贝到ijkpalyer根项目的build.gradle的相应位置,笔者这里使用的是classpath 'com.android.tools.build:gradle:3.5.1';

第二步将新建的项目的gradle/wrapper/gradle-wrapper.properties文件拷贝到ijkplayer项目的对应目录完成替换即可。

3、 修改ijkplayer-armv7a工程关联Android.mk编译脚本

修改文件:ijkplayer/ijkplayer-armv7a/build.gradle:

不要指定jni的lib库文件夹位置:

android {
    //删除以下内容
    //sourceSets.main {
    //  jniLibs.srcDirs 'src/main/libs'
    //  jni.srcDirs = [] // This prevents the auto generation of Android.mk
    //}
}

添加native代码主编译脚本Android.mk的文件路径:

android {
    //添加以下内容
    externalNativeBuild {
        ndkBuild {
            path "src/main/jni/Android.mk"
        }
    }
}

设置编译脚本的参数:

android {
    defaultConfig {
        //添加以下内容
        externalNativeBuild {
            ndkBuild {
                arguments "NDK_APPLICATION:=src/main/jni/Application.mk"
                abiFilters "armeabi-v7a"
            }
        }
    }
}

开启工程的debug模式:

android {
    buildTypes {
        //添加以下内容
        debug {
            debuggable true
            jniDebuggable true
            ndk {
                debuggable true
            }
        }
    }
}

4、 修改ijkplayer-examplebuild.gradle

修改文件:ijkplayer/ijkplayer-example/build.gradle:

删除渠道配置:

// 注释掉这个,因为在某些gradle版本上会报Flavors纬度不一致的错误

//    productFlavors {
//        all32 { minSdkVersion 9 }
//        all64 { minSdkVersion 21 }
//        // armv5 {}
//        // armv7a {}
//        // arm64 { minSdkVersion 21 }
//        // x86 {}
//    }

修改依赖关系:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:preference-v7:23.0.1'
    compile 'com.android.support:support-annotations:23.0.1'

    compile 'com.squareup:otto:1.3.8'

    compile project(':ijkplayer-java')
//    compile project(':ijkplayer-exo')

//    all32Compile project(':ijkplayer-armv5')
    compile project(':ijkplayer-armv7a')
//    all32Compile project(':ijkplayer-x86')

//    all64Compile project(':ijkplayer-armv5')
//    all64Compile project(':ijkplayer-armv7a')
//    all64Compile project(':ijkplayer-arm64')
//    all64Compile project(':ijkplayer-x86')
//    all64Compile project(':ijkplayer-x86_64')

    // compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
    // compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'

    // all32Compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
    // all32Compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
    // all32Compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'

    // all64Compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
    // all64Compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
    // all64Compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
    // all64Compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
    // all64Compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'

    // armv5Compile project(':player-armv5')
    // armv7aCompile project(':player-armv7a')
    // arm64Compile project(':player-arm64')
    // x86Compile project(':player-x86')
    // x86_64Compile project(':player-x86_64')
}

5、 配置好你的NDK环境

点击Android Studio的菜单栏File > Project Structure > SDK Location 选择你的NDK路径,笔者这里使用的是NDKr16。

一般NDK的版本有差异,不建议使用最新的NDK版本。

至此修改就完成了,点击Android Studio的Sync Project with Gradle Files图标按钮等待编译完成即可愉快地运行ijkplayer-example项目啦,
同时也可以愉快地使用AS查看ijkpalyer的源代码啦。

对于音视频开发感兴趣的童鞋请扫码关注公众号共同学习进步


技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。

扫码关注公众号【音视频开发进阶】,一起学习多媒体音视频开发~~~

喜欢就点个「在看」吧 ▽

相关文章:

  • Android 性能优化必知必会
  • 音视频面试基础题
  • 2020年中国音频产业生态发展分析
  • 疫情下的网络视频行业观察 | 从疫情看网络视频领域竞争方向
  • 为什么小姐姐能摇一晚上不倒?
  • Android 热修复 AndFix 原理,看这篇就够了
  • 推荐几个堪称教科书级别的 Android 音视频入门项目
  • ffmpeg音视频同步的几种策略
  • 【Jetpack更新之Fragment】1.3.0-alpha04 来袭,Fragment 间通信的新姿势
  • Android使用OpenGL渲染ffmpeg解码的YUV数据
  • 详解Handler机制中消息队列的出队逻辑
  • 详解Handler中消息队列的入队逻辑
  • 视频无缝续播的一些解决方案
  • 移动端技术交流喊你入群啦~~~
  • 视频图像处理中的错帧同步是怎么实现的?
  • 【Leetcode】101. 对称二叉树
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 2019.2.20 c++ 知识梳理
  • conda常用的命令
  • extjs4学习之配置
  • interface和setter,getter
  • Java-详解HashMap
  • k8s 面向应用开发者的基础命令
  • node和express搭建代理服务器(源码)
  • tweak 支持第三方库
  • vue数据传递--我有特殊的实现技巧
  • 从0实现一个tiny react(三)生命周期
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​secrets --- 生成管理密码的安全随机数​
  • #WEB前端(HTML属性)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (离散数学)逻辑连接词
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .form文件_SSM框架文件上传篇
  • .Net Redis的秒杀Dome和异步执行
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @staticmethod和@classmethod的作用与区别
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [Android]How to use FFmpeg to decode Android f...
  • [Android]竖直滑动选择器WheelView的实现
  • [APIO2012] 派遣 dispatching
  • [BZOJ3223]文艺平衡树
  • [COI2007] Sabor
  • [C进阶] 数据在内存中的存储——浮点型篇
  • [Java基础] Java中List.remove报错UnsupportedOperationException
  • [LeetCode] Contains Duplicate