Android开发Android开发经验谈Android技术知识

Ijkplayer demo 基本使用

2019-01-06  本文已影响1人  iSuperRed

  之前 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 文件中,并修改 compileSdkVersionbuildToolsVersiontargetSdkVersion与我们的 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();
    }
}

五 结语

  如果有什么问题,欢迎批评指正!

六 参考

https://blog.csdn.net/hisonedumobile/article/details/53119134
https://blog.csdn.net/xiexuan2007/article/details/53080327

上一篇下一篇

猜你喜欢

热点阅读