Android音视频深入十九使用ijkplayer做个视频播放器(附源码下载)

  

项目地址https://github.com/979451341/Myijkplayer

  

前段时候我觉得FFmpeg做个视频播放器好难,虽然播放上没问题,但暂停还有通过拖动进度条来设置播放进度,这些都即便做得到,可以那个延缓.....

  

现在学习一下目前移动端最知名的视频播放器的框架ijkplayer,这个框架他是基于FFmpeg, SDL,还有安卓原生API MediaCodec之类的。他是没有播放界面的,这个需要我们去做,所以这个里我就做个基于ijkplayer的视频播放器,随便浅显的说一下ijkplayer的源码,关于ijkplayer的源码以后会专门出一篇博客说一下。

  

1。首先了解一下ijkplayer咋用

  

我这里引入ijkplayer是通过添加依赖

  
 <代码>实现“tv.danmaku.ijk.media: ijkplayer-java: 0.8.8”
  实现“tv.danmaku.ijk.media: ijkplayer-armv7a: 0.8.8”
  
  实现“tv.danmaku.ijk.media: ijkplayer-armv5:0.8.8”
  实现“tv.danmaku.ijk.media: ijkplayer-arm64:0.8.8”
  实现“tv.danmaku.ijk.media: ijkplayer-x86:0.8.8”
  实现“tv.danmaku.ijk.media: ijkplayer-x86_64:0.8.8”
  
  实现“tv.danmaku.ijk.media: ijkplayer-exo: 0.8.8” 
  

然后说说ijkplayer是如何播放视频的

  

ijkplayer每一次播放视频都是通过创建媒体播放器,然后赋值到一个接口类上,这里他创建的时候能够挑选解码的类型,是因为基于安卓原生API MediaCodec的话是硬解,速度快,兼容差,如果是基于FFmpeg则是软解,速度慢,兼容好,不过这个兼容问题,因为我们在引入依赖的时候把各个处理器相应的依赖,所以可以使用硬解,兼容问题基本都是手机处理器不同产生的。

  
 <代码> IjkMediaPlayer IjkMediaPlayer=new IjkMediaPlayer ();
  ijkMediaPlayer.native_setLogLevel (IjkMediaPlayer.IJK_LOG_DEBUG);  
  

////开启硬解码
ijkMediaPlayer.setOption (IjkMediaPlayer。OPT_CATEGORY_PLAYER“mediacodec" 1);
IMediaPlayer mMediaPlayer=零;
mMediaPlayer=ijkMediaPlayer;

  

关于IjkMediaPlayer的源码我只贴出一个函数的,从下面几个loadLibrary看出来,他还是基于FFmpeg, SDL底层实现的。

  
 <代码>公共静态孔隙loadLibrariesOnce (IjkLibLoader libLoader) {
  类var1=IjkMediaPlayer.class;
  同步(IjkMediaPlayer.class) {
  如果(! mIsLibLoaded) {
  如果(libLoader==null) {
  libLoader=sLocalLibLoader;
  }
  
  libLoader.loadLibrary (“ijkffmpeg”);
  libLoader.loadLibrary (“ijksdl”);
  libLoader.loadLibrary (“ijkplayer”);
  mIsLibLoaded=true;
  }
  
  }
  } 
  

好了,回到那个接口类的IMediaPlayer,源码不多贴出来看一下,通过这些接口函数我们都可以知道这个ijkplayer如何使用我们都有了一个底,什么setDataSource, setDisplay,设置播放源,设置播放的屏幕信息。还有启动、停止、暂停、视频播放的开始,停止,暂停,还有一大堆的接口,这些都是为了监听播放器的状态

  

公共接口IMediaPlayer {
,

  
 <代码>空白setDisplay (SurfaceHolder var1);
  
  空白setDataSource(上下文var1 Uri var2)抛出IOException IllegalArgumentException, SecurityException, IllegalStateException;
  
  @TargetApi (14)
  空白setDataSource(上下文var1、Uri var2 Map<字符串,String>var3)抛出IOException IllegalArgumentException、SecurityException IllegalStateException;
  
  空白setDataSource (FileDescriptor var1)抛出IOException IllegalArgumentException, IllegalStateException;
  
  空白setDataSource(字符串var1)抛出IOException IllegalArgumentException, SecurityException, IllegalStateException;
  
  字符串getDataSource ();
  
  空白prepareAsync()抛出IllegalStateException;
  
  无效的start()抛出IllegalStateException;
  
  无效停止()抛出IllegalStateException;
  
  空白暂停()抛出IllegalStateException;
  
  空白setScreenOnWhilePlaying(布尔var1);
  
  int getVideoWidth ();
  
  int getVideoHeight ();
  
  布尔isPlaying ();
  
  空白寻求(长var1) IllegalStateException扔;
  
  长getCurrentPosition ();
  
  长getDuration ();
  
  空白释放();
  
  空白重置();
  
  空白setVolume中(var1浮动,浮动var2);
  
  int getAudioSessionId ();
  
  MediaInfo getMediaInfo ();/* * @deprecated */@Deprecated
  空白setLogEnabled(布尔var1);/* * @deprecated */@Deprecated
  布尔isPlayable ();
  
  空白setOnPreparedListener (IMediaPlayer。OnPreparedListener var1);
  
  空白setOnCompletionListener (IMediaPlayer。OnCompletionListener var1);
  
  空白setOnBufferingUpdateListener (IMediaPlayer。OnBufferingUpdateListener var1);
  
  空白setOnSeekCompleteListener (IMediaPlayer。OnSeekCompleteListener var1);
  
  空白setOnVideoSizeChangedListener (IMediaPlayer。OnVideoSizeChangedListener var1);
  
  空白setOnErrorListener (IMediaPlayer。OnErrorListener var1);
  
  空白setOnInfoListener (IMediaPlayer。OnInfoListener var1);
  
  空白setOnTimedTextListener (IMediaPlayer。OnTimedTextListener var1);
  
  空白setAudioStreamType (int var1);/* * @deprecated */@Deprecated
  空白setKeepInBackground(布尔var1);
  
  int getVideoSarNum ();
  
  int getVideoSarDen ();/* * @deprecated */@Deprecated
  空白setWakeMode(上下文var1 int var2);
  
  空白setLooping(布尔var1);
  
  布尔isLooping ();
  
  ITrackInfo [] getTrackInfo ();
  
  空白setSurface(表面var1);
  
  空白setDataSource (IMediaDataSource var1);
  
  公共接口
  android: layout_width=" match_parent "
  android: layout_height=" match_parent "/比;
  
  & lt;包括
  android: id=癅 + id/include_play_top”
  布局=" @layout/include_play_top”
  android: layout_alignParentTop=" true "
  android: layout_width=" match_parent "
  android: layout_height=?0 dp/比;
  
  & lt;包括
  android: id=癅 + id/include_play_bottom”
  布局=" @layout/include_play_bottom”
  android: layout_alignParentBottom=" true "
  android: layout_width=" match_parent "
  android: layout_height=?0 dp/祝辞

Android音视频深入十九使用ijkplayer做个视频播放器(附源码下载)