下面简单介绍一下ijkplayer的使用
ijkplayer是b站基于FFmpeg开源的播放器,ijkplayer提供了个IjkMediaPlayer,功能和用法跟MediaPlayer类似,但是强大很多
一、ijkplayer使用
1、新建一个Android项目,并在app的gradle下的dependencies中添加下面代码,其中ijkplayer-java是核心代码必须添加,IjkMediaPlayer就在这里面。ijkplayer-armv7a是armeabi-v7a下的so库,ijkplayer-armv5是armeabi下的so库,ijkplayer-arm64是arm64-v8a下的so库,ijkplayer-x86是x86下的so库,ijkplayer-x86_64是x86_64下的so库,根据项目选择添加即可,一般一套armeabi-v7a就可以了。ijkplayer-exo是谷歌下的IjkExoMediaPlayer,如果需要使用的话可以添加。
# required, enough for most devices.
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
# Other ABIs: optional
compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'
# ExoPlayer as IMediaPlayer: optional, experimental
compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'
2、在AndroidManifest.xml中添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
3、使用SurfaceView播放视频
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="200dp" />
public class MainActivity extends AppCompatActivity {
private SurfaceView surfaceView;
private IjkMediaPlayer mPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = findViewById(R.id.surface_view);
surfaceView.getHolder().addCallback(callback);
}
private void createPlayer() {
if (mPlayer == null) {
mPlayer = new IjkMediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mPlayer.setDataSource("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4");
} catch (IOException e) {
e.printStackTrace();
}
mPlayer.prepareAsync();
}
}
private void release() {
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
}
IjkMediaPlayer.native_profileEnd();
}
private SurfaceHolder.Callback callback = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
createPlayer();
mPlayer.setDisplay(surfaceView.getHolder());
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (surfaceView != null) {
surfaceView.getHolder().removeCallback(callback);
surfaceView = null;
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
release();
}
}
4、使用TextureView播放视频
<TextureView
android:id="@+id/texture_view"
android:layout_width="match_parent"
android:layout_height="200dp" />
public class MainActivity extends AppCompatActivity {
private TextureView textureView;
private Surface mSurface;
private IjkMediaPlayer mPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textureView = findViewById(R.id.texture_view);
textureView.setSurfaceTextureListener(listener);
}
private void createPlayer() {
if (mPlayer == null) {
mPlayer = new IjkMediaPlayer();
mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mPlayer.setDataSource("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4");
} catch (IOException e) {
e.printStackTrace();
}
mPlayer.prepareAsync();
}
}
private void release() {
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
}
IjkMediaPlayer.native_profileEnd();
}
private TextureView.SurfaceTextureListener listener = new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
createPlayer();
mSurface = new Surface(surface);
mPlayer.setSurface(mSurface);
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
textureView.setSurfaceTextureListener(null);
textureView = null;
mSurface = null;
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
};
@Override
protected void onDestroy() {
super.onDestroy();
release();
}
}
二、其他设置
// 设置倍速,MediaPlayer是不支持的
mPlayer.setSpeed(1.0f);
// 设置不自动播放(ijkPlayer默认准备就自动播放)
mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
// 设置编码方式 1:硬编码 0:软编码
mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
...
// 一些监听
setOnPreparedListener
setOnCompletionListener
setOnErrorListener
上面为IjkMediaPlayer的基本设置,其他具体根据项目要求再设置,不过使用上面用法不支持https,可以把上面视频地址改为https的,上面地址支持https的,可以在浏览器中测试,在Demo里就播不了,报下面错误。因为上面Bilibili上面提供的用法不支持https,想要支持的话需要自己编译,下篇文章将介绍自己编译ijkplayer。
10-20 21:52:46.499 5927-6130/com.bill.ijkplayerproject W/IJKMEDIA: https protocol not found, recompile FFmpeg with openssl, gnutls or securetransport enabled.
10-20 21:52:46.499 5927-5927/com.bill.ijkplayerproject D/IJKMEDIA: ffpipeline_set_surface()
10-20 21:52:46.499 5927-5927/com.bill.ijkplayerproject D/IJKMEDIA: ijkmp_set_android_surface(surface=0xffe97ed0)=void
10-20 21:52:46.499 5927-6130/com.bill.ijkplayerproject E/IJKMEDIA: https://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4: Protocol not found
、