基于IJK打造自己的播放器(一) 简单集成使用ijkPlayer播放hls视频
一 前言
ijk播放器的背景我就不多说了。随便一搜就有,我想说的是,这篇文章只是教大家适合使用ijkplayer。
这里适合新手。简单说一下我们常用的播放视频。一般来说,播放视频分成视频显示控件、视频播放(解码)这两块。
视频显示控件主要有:
1.SurfaceView surfaceview+原生mediaplayer 是比较通俗的播放视频组合。ijkplayer 提供的就是一个mediaplayer 。
2.TextureView
至于他们的子类,glsurfaceview之类就不多描述。他们之间的差异,有兴趣的可以百度下。
比较主流的播放器的有:
1.手机原生的mediaplayer.
2.谷歌出的EXOplayer。前文有使用描述,有兴趣可以去看
3.B站的IJKplayer.
4.各大公司自己写的。
二、集成步骤
样子如下:
不知道什么原因 我小米自带的播放器无法播放这个直播流,所以两个流不一样。你们可以改成一样的测试下。
我们这里不涉及自己编译 so。仅仅是集成能够测试播放视频。给大家做个演示
1、直接关联
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
简单使用,就是这么简单,这里B站已经帮编译好了。但是缺点也蛮多的。
1、不支持https流。
2、不支持rtsp/rtmp流。
还有其他的需要各位自己去测。
2.简单使用
1.布局文件
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<SurfaceView
android:layout_width="match_parent"
android:layout_height="300dp"
android:id="@+id/sv_view"
/>
<VideoView
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="300dp"
android:id="@+id/vv_view"
/>
</LinearLayout>
我们使用surfaceview来作为显示控件。下面是videoview来跟原生播放器作一个对比。
2.Java文件
package com.test.ijkdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.VideoView;
import java.io.IOException;
import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
/**
* play video with ijk&native
*/
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private VideoView vv_view;
private SurfaceView sv_view;
private IjkMediaPlayer ijkMediaPlayer;
private SurfaceHolder holder;
String testURl="https://video-dev.github.io/streams/x36xhzz/x36xhzz.m3u8";
String testURl1="http://weblive.hebtv.com/live/hbgg_bq/index.m3u8";
String testURl2="https://video-dev.github.io/streams/x36xhzz/x36xhzz.m3u8";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
ijkMediaPlayer = new IjkMediaPlayer();
holder = sv_view.getHolder();
holder.addCallback(this);
try {
ijkMediaPlayer.setDataSource(testURl1);
} catch (IOException e) {
e.printStackTrace();
}
ijkMediaPlayer.setOnPreparedListener(new OnprePareListener());
ijkMediaPlayer.prepareAsync();
//使用videoview+mediaplayer播放
vv_view.setVideoPath(testURl2);
vv_view.start();
}
private void initView() {
sv_view = findViewById(R.id.sv_view);
vv_view = findViewById(R.id.vv_view);
}
class OnprePareListener implements IMediaPlayer.OnPreparedListener {
@Override
public void onPrepared(IMediaPlayer iMediaPlayer) {
ijkMediaPlayer.start();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
this.holder=holder;
ijkMediaPlayer.setDisplay(holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
3.权限
<uses-permission android:name="android.permission.INTERNET"/>
基本使用就到这里了,希望对新手有用。