下面简单介绍一下ijkplayer的使用
ijkplayer是b站基于FFmpeg开源的播放器,ijkplayer提供了个IjkMediaPlayer,功能和用法跟MediaPlayer类似,但是强大很多
官网Github
一、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: optionalcompile '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, experimentalcompile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'
2、在AndroidManifest.xml中添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
3、使用SurfaceView播放视频
<SurfaceViewandroid:id="@+id/surface_view"android:layout_width="match_parent"android:layout_height="200dp" />
public class MainActivity extends AppCompatActivity {private SurfaceView surfaceView;private IjkMediaPlayer mPlayer;@Overrideprotected 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() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {createPlayer();mPlayer.setDisplay(surfaceView.getHolder());}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if (surfaceView != null) {surfaceView.getHolder().removeCallback(callback);surfaceView = null;}}};@Overrideprotected void onDestroy() {super.onDestroy();release();}}
4、使用TextureView播放视频
<TextureViewandroid: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;@Overrideprotected 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() {@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {createPlayer();mSurface = new Surface(surface);mPlayer.setSurface(mSurface);}@Overridepublic void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {textureView.setSurfaceTextureListener(null);textureView = null;mSurface = null;return true;}@Overridepublic void onSurfaceTextureUpdated(SurfaceTexture surface) {}};@Overrideprotected 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
、
【版权与免责声明】如发现内容存在版权问题,烦请提供相关信息发邮件至 lnkj@3173.top ,我们将及时沟通与处理。 本站内容除了3117站长服务平台( www.3117.cn )原创外,其它均为网友转载内容,涉及言论、版权与本站无关。