项目地址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做个视频播放器(附源码下载)