ijkplayer秘籍安卓开发相关Android Tips

Android集成IjkPlayer

2017-04-07  本文已影响7603人  和平北路

0x0000 背景


0x0001 致谢


0x0002 源码链接

Github:Bilibili/ijkplayer


0x0003 编译

export ANDROID_SDK=/your/sdk/path
export ANDROID_NDK=/your/ndk/path
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
cd ijkplayer-android
git checkout -B latest k0.7.8.1
./init-android.sh
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
cd ..
./compile-ijk.sh all

到此为止,完成了对源码的编译,ijkplayer-android的目录结构如图


工程结构

0x0004 配置

ext {
    compileSdkVersion = 25
    buildToolsVersion = "25.0.2"
    targetSdkVersion = 25
    versionCode = 700801
    versionName = "0.7.8.1"
}

前三条和你的app module的build.gradle保持一致
后两条和IjkPlayer源码工程中的build.gradle保持一致


0x0005 开发

IjkVideoView本身继承自FrameLayout,可以和普通的View一样在layout的xml文件中直接加入
对大多数人来说,平时怎么使用VideoView,现在就怎么使用IjkVideoView即可


0x0006 问题

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (this.getWidth() != 0) {
        setMeasuredDimension(this.getWidth(), this.getHeight());
        return;
    }
    int width = getDefaultSize(0, widthMeasureSpec);
    int height = getDefaultSize(0, heightMeasureSpec);
    setMeasuredDimension(width, height);
}
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

在AndroidManifest.xml中设置Activity的theme属性

<activity
    android:name=".MainActivity"
    android:theme="@style/Theme.AppCompat.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
public void setRender(int render) {
    switch (render) {
        case RENDER_NONE:
            setRenderView(null);
            break;
        case RENDER_SURFACE_VIEW:
        case RENDER_TEXTURE_VIEW: {
            TextureRenderView renderView = new TextureRenderView(getContext());
            if (mMediaPlayer != null) {
                renderView.getSurfaceHolder().bindToMediaPlayer(mMediaPlayer);
                renderView.setVideoSize(mMediaPlayer.getVideoWidth(), mMediaPlayer.getVideoHeight());
                renderView.setVideoSampleAspectRatio(mMediaPlayer.getVideoSarNum(), mMediaPlayer.getVideoSarDen());
                renderView.setAspectRatio(mCurrentAspectRatio);
            }
            setRenderView(renderView);
            break;
        }
        default:
            Log.e(TAG, String.format(Locale.getDefault(), "invalid render %d\n", render));
            break;
    }
}

增加一个public方法

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
public Bitmap getShortcut() {
    if (mRenderView instanceof TextureRenderView) {
        return ((TextureRenderView) mRenderView).getBitmap();
    }
    return null;
}

0x0007 后记

Android播放器的坑太多,慢慢踩,与君共勉

上一篇 下一篇

猜你喜欢

热点阅读