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视频开发的初学者,文中内容还望各位高人批评指正。