之前 Ijkplayer 已经编译好 了,也运行了 ijkplayer-example 这个 demo,心里有个底了,大概知道 Ijkplayer 编译完成后各个模块都是干什么的了,那么接下来就该聊一聊它的基本使用了。
打开 Ijkplayer 的目录,能够看到有几个比较重要的文件夹,分别为:android、config、doc、extra、ijkmedia、ijkprof、ios、tools。下面先看看这些文件夹都是干什么用的,也好在需要的时候尽快找到需要的东西。
文件夹 | 概述 |
---|---|
android | android 平台上的上层接口封装以及平台相关方法,里面有一个可以使用 Android Studio 编译运行的 demo |
config | 编译 ffmpeg 使用的配置文件 |
doc | 一个文档 |
extra | 存放编译 ijkplayer 所需的依赖源文件, 如 ffmpeg 等 |
ijkmedia | 核心代码,ijkplayer 与播放器数据下载及解码相关 ,ijksdl 与音视频数据渲染相关 |
ijkprof | ndk相关的c层代码 |
ios | iOS平台上的上层接口封装以及平台相关方法 |
tools | 初始化项目工程脚本 |
所以啊,应用层想要简单使用 Ijkplayer ,主要看 ijkplayer-android\android\ijkplayer 里的东西,这里是 Android 应用层相关的代码和接口。
那么问题来了,如果我现在要想将 ijkplayer 提供的接口应用到自己的项目中,应该怎么办呢?直接将 ijkplayer-java 中的代码拷贝到自己的项目中?我想大多数人不太想这么办吧,谁不想代码写的优雅、完成效率又高呢,反正我是懒得粘贴的。我是将这些作为 Library 来使用的。
下面记录一下将 ijkplayer-java 作为Library 使用的过程,省的以后忘了。
一 新建项目
打开 Android Studio,File -> New -> New Project... ->创建一个新的工程。
附上我的新工程的环境。
名称 | 版本 | 概述 |
---|---|---|
Android Studio | 3.2.1 | Android Studio 的 Help->About 中显示的就是 Android Studio 的版本 |
Gradle plugin | 3.2.1 | 位于项目根目录下的 build.gradle 文件中的 dependencies 节点下 |
Gradle wrapper | 4.6 | 在 gradle-wrapper.properties 文件中 |
compileSdkVersion | 28 | 位于主 Module 下的 build.gradle 文件中的 android 节点下 |
targetSdkVersion | 28 | 位于主 Module 下的 build.gradle 文件中的 defaultConfig 节点下 |
二 拷贝文件
① 拷贝 tools文件夹
将 ijkplayer-android-build\ijkplayer-android\android\ijkplayer 目录下的 tools 文件夹拷贝到我们的 Project 的根目录下。
② 拷贝 ext
将 ijkplayer-android-build\ijkplayer-android\android\ijkplayer 目录下的 bulid.gradle 文件中的 ext 节点拷贝到我们的 Project 的根目录下的 bulid.gradle 文件中,并修改 compileSdkVersion、buildToolsVersion 和 targetSdkVersion与我们的 Project的主 Module 的保持一致。versionCode 和 versionName 都是从 ijkplayer 项目中拷贝过来的就不用改了。
拷贝后的样式如下图所示。
image.png
三 导入Module
① 依次执行 File->New->Import Module->选择路径 /android/ijkplayer/ijkplayer-example。
执行完后就会看到下图所示页面。其实我们只导入了 ijkplayer-example 这个 Module,但是同时 ijkplayer-example 又引用了 ijkplayer-arm64、 ijkplayer-armv5、ijkplayer-armv7a、ijkplayer-exo、ijkplayer-java、ijkplayer-x86、ijkplayer-x86_64 这几个Module,ijkplayer-exo 引用了 ijkplayer-java 这个 Module,所以引入 ijkplayer-example 这个 Module 时会同时引入其他几个需要的 Module。
image.png
② 点击 Finish。
③ 解决错误。
同步以后发现编译不通过,看看编译都出现什么问题了。
第一个错误
The minSdk version should not be declared in the android manifest file. You can move the version from the manifest to the defaultConfig in the build.gradle file.
就是说 manifest 中不要设置最小sdk的版本,将最小sdk的版本放到 build.gradle 文件中。
解决办法:将 manifest 中的 minSdkVersion 删除或者直接点下图中蓝色的字:Remove minSdkVersion and sunc project 即可。
image.png
第二个错误
All flavors must now belong to a named flavor dimension.
解决办法:在 ijkplayer-example Module 的 build.gradle文件的 defaultConfig 节点中 添加 flavorDimensions “debug"即可,flavorDimensions 貌似可以随意起名。
修改后如下图所示。
image.png
三 删繁就简
明眼一看就知道 ijkplayer-arm64、 ijkplayer-armv5、ijkplayer-armv7a、ijkplayer-x86、ijkplayer-x86_64 这几个 Module 就是提供不同平台下的 so 库,所以我们直接把 so 库拿出来放到其他 Module 里就好了,把这几个 Module 删除了,省的占地方。
① 新建 jniLibs 文件夹
在 ijkplayer-java\src\main\ 目录下新建一个名为 jniLibs 的文件夹,将 ijkplayer-arm64、 ijkplayer-armv5、ijkplayer-armv7a、ijkplayer-x86、ijkplayer-x86_64 目录中的 \src\main\libs 目录下的文件夹拷贝到 jniLibs 文件夹中。移动完成以后如下图所示。
image.png
② 取消 ijkplayer-example 这个 Module 对 ijkplayer-arm64、 ijkplayer-armv5、ijkplayer-armv7a、ijkplayer-x86、ijkplayer-x86_64 的引用
依次执行:右键 ijkplayer-example 这个 Module -> Open Module Settings(选中 ijkplayer-example ) -> Dependencies ->选中要取消依赖的库->点击右侧减号。如下图所示。
image.png
③ 删除无用 Module
因为 Android Studuio 加入对 Library Module 的安全管理机制,所以直接右键项目找不到 Delete 选项。
那怎么办呢?
在项目列表直接右键你要删除的 Library Module(其他类型Module也可以这样操作),找到菜单 Open Module Settings,在弹出的 Project Structure 窗口(如下图所示)中找到要删除的 Library Module,点击左上角的 - 号图标,移除后点击 OK,Library Module 就失去依赖了。这时再右键项目中的 Library Module 就可以看到 Delete 菜单了,点击进行最后一步的删除即可。
image.png
④ 修改 ijkplayer-example 的 build.gradle 文件
首先,将 apply plugin: 'com.android.application' 改为 apply plugin: 'com.android.library'。
然后,删除 applicationId "tv.danmaku.ijk.media.example" 这行。
再然后,删除 productFlavors 节点。
再然后,修改 appcompat-v7、preference-v7 和 support-annotations 的版本为你需要的版本。
修改完成后如下图所示。
image.png
⑤ 增加一个gradle.properties文件
在ijkplayer-example根目录下增加一个gradle.properties文件,内容如下:
POM_NAME=ijkplayer-example POM_ARTIFACT_ID=ijkplayer-example POM_PACKAGING=aar
如下图所示。
image.png
⑥ 删除 ijkplayer-example 的 Menifest 文件中的 intent-fileter,防止桌面出现两个启动图标
image.png
⑦ 给 app 这个主 Module 添加依赖
File->Project Structure,在左边 Module 中选中自己的项目(app),点上方的Dependencies,然后点右边的“+”号选择 3 Module dependency 即可添加依赖的模块,添加完依赖后如下图所示。
image.png
四 基本使用
奉上代码,就两个文件,activity_main.xml 和 MainActivity.java。因为没有做任何优化,只是写了个demo,所以启动后,视频加载出来时间有点长。完整项目下载地址:https://github.com/iSuperRed/IjkplayerDemo。
①布局文件:activity_main.xml。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="6dp" android:orientation="vertical"> <tv.danmaku.ijk.media.example.widget.media.IjkVideoView android:id="@+id/videoView" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/toast_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:background="@color/ijk_transparent_dark" android:padding="16dp" android:textSize="16sp" android:visibility="gone" /> <TableLayout android:id="@+id/hud_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center" android:background="@color/ijk_transparent_dark" android:padding="8dp" /></LinearLayout>
② 代码:MainActivity .java。
public class MainActivity extends AppCompatActivity { private IjkVideoView mVideoView; private AndroidMediaController mMediaController; private TextView mTextView; private String mVideoPath; private TableLayout mHudView; private Settings mSettings; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startVideo(); } private void startVideo() { mSettings = new Settings(this); mVideoPath = "http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8"; mMediaController = new AndroidMediaController(this, false); IjkMediaPlayer.loadLibrariesOnce(null); IjkMediaPlayer.native_profileBegin("libijkplayer.so"); mVideoView = (IjkVideoView) findViewById(R.id.videoView); mHudView = (TableLayout) findViewById(R.id.hud_view); mVideoView.setMediaController(mMediaController); mVideoView.setHudView(mHudView); if (TextUtils.isEmpty(mVideoPath)) { Toast.makeText(this, "No Video Found! Press Back Button To Exit", Toast.LENGTH_LONG).show(); } else { mVideoView.setVideoURI(Uri.parse(mVideoPath)); mVideoView.start(); } } @Override public void onStop() { super.onStop(); mVideoView.stopPlayback(); mVideoView.release(true); mVideoView.stopBackgroundPlay(); IjkMediaPlayer.native_profileEnd(); } }
效果图
image.png
作者:iSuperRed
链接:https://www.jianshu.com/p/5d1d46aa721d
共同学习,写下你的评论
评论加载中...
作者其他优质文章