您的位置:首页 > 移动开发 > Android开发

Android Studio中如何将ijkplayer 0.6.3导入自己的项目中并使用

2016-11-10 19:06 811 查看
Ijkplayer 0.6.3是较新的版本,其中的ijk-example增强了不少功能,但是里面的一些资源由于增加了依赖,使得要使用ijk-example中的资源,不像以前版本那样只须把我们需要的几个java文件简单拷贝到自己工程目录下,便可直接调用,本文作者因此也走了不少弯路,今天将作者实测的导入方法作个共享。

方法一:导入基本库及ijk-example使用

    这种方法重点在于将ijkplayer-example导入为Module并通过修改成library,才能在自己的项目中调用ijkplayer-example中的资源,如:IjkVideoView,具体步骤如下:

1.
在工程根目录下的build.gradle文件中增加

ext {
    compileSdkVersion =24
    buildToolsVersion ="24.0.1"

    targetSdkVersion =24

    versionCode =603000
    versionName ="0.6.3"
}
compileSdkVersion、buildToolsVersion和targetSdkVersion根据自己的设置修改,我的完整的文件如下:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath'com.android.tools.build:gradle:2.2.0'

        // NOTE: Do not place your application dependencies here; they
belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

ext {
    compileSdkVersion =24
    buildToolsVersion ="24.0.1"

    targetSdkVersion =24

    versionCode =603000
    versionName ="0.6.3"
}

task clean(type:
Delete) {
    deleterootProject.buildDir
}
 

2. File->New->Import Module

   然后选择编译好的ijkplayer的目录下的android/ijkplayer目录,从中选择ijk-example,这个库会依赖该文件夹下的所有其他库,故其他库会自动选择,并全部导入,然后将android/ijkplayer目录下的tools文件夹也拷贝到自己项目的根目录下。

3.
在ijkplayer-java\src\main\目录下新建一个名为jniLibs的文件夹,将各个ijkplayer-xxx目录中的\src\main\libs目录下的文件夹拷贝到jniLibs文件夹中,如:ijkplayer--armv7a的该目录下包含armeabi-v7a这个文件夹,其中包含了该平台对应的.so文件,如下图所示



如果希望包含所有平台的,就将所有ijkplayer-xxx下的全部拷过来,如果只希望某几个平台的,就只拷贝它们的。

4.
将ijkplayer-xxx的目录全部从项目中删除掉,只保留ijkplayer-example、ijkplayer-java、ijkplayer-exo以及tools文件夹,其中ijkplayer-example依赖于后面几个。

5.
将ijkplayer-example修改为Module的形式,因为ijkplayer-example本身是一个application工程,默认不生成aar文件,且0.6.3的版本比较新,里面的资源互相依赖,难以像旧版本通过复制所需的几个java文件到自己工程中的方式来使用,所以不如将整个ijkplayer-example转换为我们工程的一个Module。具体方法是:

先修改ijkplayer-example目录下的build.gradle文件,如下:

applyplugin:'com.android.library'

android {
    // http://tools.android.com/tech-docs/new-build-system/tips     //noinspection GroovyAssignabilityCheck
    compileSdkVersionrootProject.ext.compileSdkVersion
    //noinspection GroovyAssignabilityCheck
    buildToolsVersionrootProject.ext.buildToolsVersion

    lintOptions {
        abortOnErrorfalse
    }
    defaultConfig {
        //applicationId "tv.danmaku.ijk.media.example"
        minSdkVersion9
        targetSdkVersionrootProject.ext.targetSdkVersion
        versionCode rootProject.ext.versionCode
        versionName rootProject.ext.versionName
    }
    buildTypes {
        release {
            minifyEnabledfalse
            proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
        }
    }
    /*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:24.1.1'
    compile'com.android.support:preference-v7:24.1.1'
    compile'com.android.support:support-annotations:24.1.1'

    compile'com.squareup:otto:1.3.8'

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

    /*all32Compile project(':ijkplayer-armv5')
    all32Compile 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.6.3'
    // compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.6.3'

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

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

    // armv5Compile project(':player-armv5')
    // armv7aCompile project(':player-armv7a')
    // arm64Compile project(':player-arm64')
    // x86Compile project(':player-x86')
    // x86_64Compile project(':player-x86_64')
}
注意:(1)apply plugin: 'com.android.application'要改为apply
plugin: 'com.android.library'

(2)applicationId "tv.danmaku.ijk.media.example"这句要去掉

(3)productFlavors {

        all32 { minSdkVersion 9 }

        all64 { minSdkVersion 21 }

        // armv5 {}

        // armv7a {}

        // arm64 { minSdkVersion 21 }

        // x86 {}

    }

这部分也要去掉。

(4)all32Compile project(':ijkplayer-armv5')

    all32Compile 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')

这些也都去掉。

(5)compile 'com.android.support:appcompat-v7:24.1.1'

compile 'com.android.support:preference-v7:24.1.1'

compile 'com.android.support:support-annotations:24.1.1'

compile 'com.squareup:otto:1.3.8'

这几个修改为自己安装的版本。

6.
在ijkplayer-example根目录下增加一个gradle.properties文件,内容如下:

POM_NAME=ijkplayer-example
POM_ARTIFACT_ID=ijkplayer-example
POM_PACKAGING=aar
   这里就能生成可供我们自己工程中调用的aar文件。

 

7.
在自己项目中添加依赖

File->Project Structure,在左边Module中选中自己的项目(app),点上方的Dependencies,然后点左边的“+”号选择3
Module dependency即可添加依赖的模块,如图所示:

   

      
 
8.ijkplayer的基本使用

这里调用ijkplayer-example中的IjkVideoView控件实现一个视频播放器,首先是播放器的xml文件,我的工程在Activity中包含了一个fragment,以下是fragment的xml文件:

<?xml version="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:layout_margin="6dp">

    <tv.danmaku.ijk.media.example.widget.media.IjkVideoView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/videoView">
    </tv.danmaku.ijk.media.example.widget.media.IjkVideoView>

    <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>
以下在fragment的java代码:

packagenet.app.videotest;

importandroid.net.Uri;
importandroid.os.Bundle;
importandroid.support.v4.app.Fragment;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.TableLayout;
importandroid.widget.TextView;
importandroid.widget.Toast;

importtv.danmaku.ijk.media.example.application.Settings;
importtv.danmaku.ijk.media.example.widget.media.AndroidMediaController;
importtv.danmaku.ijk.media.example.widget.media.IjkVideoView;
importtv.danmaku.ijk.media.player.IjkMediaPlayer;

/**
 * Created by knight on 2016/10/6.
 */

public classVideoFragmentextendsFragment
{

    privateIjkVideoViewmVideoView;
    privateAndroidMediaControllermMediaController;
    privateTextViewmTextView;
    privateStringmVideoPath;
    privateTextViewmToastTextView;
    privateTableLayoutmHudView;

    privateSettingsmSettings;

    public staticVideoFragmentnewInstance()
{
        return newVideoFragment();
    }

    @Override
    public voidonCreate(Bundle
savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    publicViewonCreateView(LayoutInflater
inflater,ViewGroup container,Bundle
savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_video,container,
false);
        mSettings=newSettings(getActivity());

        mVideoPath=
(String) getActivity().getIntent().getSerializableExtra(VideoActivity.EXTRA_VIDEO_PATH);

        // init UI
        mMediaController=newAndroidMediaController(getActivity(),
false);

        // init player
        IjkMediaPlayer.loadLibrariesOnce(null);
        IjkMediaPlayer.native_profileBegin("libijkplayer.so");

        mVideoView=
(IjkVideoView) v.findViewById(R.id.videoView);
        mToastTextView=
(TextView) v.findViewById(R.id.toast_text_view);
        mHudView=
(TableLayout) v.findViewById(R.id.hud_view);
        mTextView=
(TextView) v.findViewById(R.id.textView);
        mVideoView.setMediaController(mMediaController);
        mVideoView.setHudView(mHudView);

        if(mVideoPath=="")
{
            Toast.makeText(
                    getActivity(),
                    "No Video Found! Press Back Button To Exit",
                    Toast.LENGTH_LONG).show();
        }
        else{
            mVideoView.setVideoURI(Uri.parse(mVideoPath));
            mVideoView.start();
        }

        returnv;
    }

    @Override
    public voidonStop()
{
        super.onStop();
        IjkMediaPlayer.native_profileEnd();
    }
}
    如果你的播放器是直接在Activity中实现的话,可以将上述xml文件作为你的播放器的Activity的xml,而上述java代码中在onCreateView中的实现放在Activity的onCreate中既可,别忘了View要用setContentView获取,mVideoPath则是你自己的视频源地址。

 

方法二:导入基本库并裁剪ijk-example使用

如果你想把自带的ijk-example中的代码中不需要的资源去掉,同时保留必须的,则先可以按照上述步骤操作,然后通过看源代码确定,哪些java源文件是依赖别的文件,而又不被别的文件依赖的,则将其删除掉,也可以一边删除一边尝试编译,出错的话,就再拷贝回来。

作者也是Android视频开发的初学者,文中内容还望各位高人批评指正。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐