点播+直播+VR:ijkPlayer+MD360 (推荐);ijkPlayer可以实现点播和直播,MD360 可以实现VR视频播放。
点播服务普遍采用了HTTP作为流媒体协议,H.264作为视频编码格式,AAC作为音频编码格式。
使用的是ijkplayer 音视频解码 支持播放点播和直播;使用rtmp编码 推流,opengl 进行视频数据的处理 做滤镜和特效。
> ijkplayer 中集成的so文件:ijkplayer.so/ ijksdl.so/ ijkffmpeg.so
播放器基本模块通常都是由以下部分组成:事务处理、数据的接收和解复用、音视频解码以及渲染.
ijkplayer - 播放器数据下载及解码相关;
ijksdl - 音视频数据渲染相关;
ijkplayer是基于ffplay改造的。。
ijkplayer视频播放器源码分析(android)- https://www.jianshu.com/p/7d9b86919682
ijkplayer系列(二) ,ijkplayer初始化流程- https://www.jianshu.com/p/75c31d05c6d9
ijkplayer系列(三) ,ijkplayer网络数据读取线程- https://www.jianshu.com/p/60d1da2c5792
ijkplayer系列(四),ijkplayer音频解码与播放- https://www.jianshu.com/p/a6a4bf59cdae
ijkplayer系列(五),ijkplayer视频解码与播放- https://www.jianshu.com/p/f85ca5b0b07d
-- 从数据接收、音视频解码、音视频渲染及同步这三大方面.
对于播放器来说,音视频同步是一个关键点,同时也是一个难点,同步效果的好坏,直接决定着播放器的质量。通常音视频同步的解决方案就是选择一个参考时钟,播放时读取音视频帧上的时间戳,同时参考当前时钟参考时钟上的时间来安排播放。
ijkplayer 解决rtmp 延迟长的问题,达到秒开的结果- https://blog.csdn.net/yyhjifeng/article/details/71191950
弱网下移动端网络连接处理策略- http://mobile.51cto.com/hot-557695.htm#topx
如何度量和模拟“弱网络”对移动APP的开发有着重大的意义,比如:节约测试成本、易于问题重现、加快产品上线等。一般的方法是使用
“丢包率”和“网络延时”来定义和衡量“弱网络”。
-- 直播技术总结(三)ijkplayer的一些问题优化记录- http://blog.csdn.net/hejjunlin/article/details/57075026
差网络环境下对视音频数据一般有四种处理方式:缓存区设计、网络检测、丢帧处理、降码率处理。
视频经过编码后有关键帧和非关键帧,关键帧也就是一副完整的图片,而非关键帧描述图像的相对变化。
丢帧策略多钟多样,可以自行定义,一个需要注意的地方是:如果要丢弃P帧(非关键帧),那么需要丢弃两个关键帧之间的所有非关键帧
,不然的话会出现马赛克。对于丢帧策略的设计因需求而异,可以自行进行设计。
//ijkplayer 播放rtmp等 实时性,把其缓存设置变小(直播)
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 8);
ijkMediaPlayer.setOption(1, "analyzemaxduration", 100L);
ijkMediaPlayer.setOption(1, "probesize", 10240L);
ijkMediaPlayer.setOption(1, "flush_packets", 1L);
ijkMediaPlayer.setOption(4, "packet-buffering", 0L);
Ijkplayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 5);// Ijkplayer音视频不同步问题设置
-- 当检测到网络变差的时候,丢帧是一个很好的应对机制。视频经过编码后有关键帧和非关键帧,关键帧也就是一副完整的图片,而非关键帧描述图像的相对变化。
丢帧策略多钟多样,可以自行定义,一个需要注意的地方是:如果要丢弃P帧(非关键帧),那么需要丢弃两个关键帧之间的所有非关键帧,不然的话会出现马赛克。对于丢帧策略的设计因需求而异
可以通过修改 framedrop 的值来解决不同步的问题,framedrop 是在视频帧处理不过来的时候丢弃一些帧达到同步的效果。
Ijkplayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 5);// Ijkplayer音视频不同步问题设置
public static final int SDL_FCC_YV12 = 0x32315659; // YV12
public static final int SDL_FCC_RV16 = 0x36315652; // RGB565
public static final int SDL_FCC_RV32 = 0x32335652; // RGBX8888
//Auto Select=,RGB 565=fcc-rv16,RGB 888X=fcc-rv32,YV12=fcc-yv12,默认为RGB 888X
private String pixelFormat = "";
if (TextUtils.isEmpty(pixelFormat)) {
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV32);
} else {
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", pixelFormat);
}
IjkMediaPlayer ijkMediaPlayer = null;
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", 10000000);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "reconnect", 1);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
//http重定向到rtmp/Https,ijkplayer无法播放视频
ijkMediaPlayer.setOption( IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
IjkMediaPlayer player = (IjkMediaPlayer) mPlayer;
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV32);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 60);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-fps", 0);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
//TODO
player.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "reconnect", 1);
//http重定向到rtmp/Https,ijkplayer无法播放视频
player.setOption( IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
-- MediaPlayer几个事件监听
mMediaPlayer.setOnPreparedListener(mPreparedListener);
mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
mMediaPlayer.setOnCompletionListener(mCompletionListener);
mMediaPlayer.setOnErrorListener(mErrorListener);
mMediaPlayer.setOnInfoListener(mInfoListener);
mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
> MD360+ijkplayer
MD360 VR- https://github.com/ashqal/MD360Player4Android
GiraffePlayer- https://github.com/tcking/GiraffePlayer (作者不再维护)
GiraffePlayer2- https://github.com/tcking/GiraffePlayer2
完整版的ijkplayer(编译so)等- https://github.com/thiagooo0/lmnplayer
界面UI定制jjdxm_ijkplayer借鉴了GiraffePlayer项目的IJKPlayer- https://github.com/jjdxmashl/jjdxm_ijkplayer
ijkplayer版本更新日志- https://github.com/Bilibili/ijkplayer/blob/k0.8.4/NEWS.md
MD360 VR 版本更新日志- https://github.com/ashqal/MD360Player4Android/wiki/Changelog
MD360Player4Android Q/A- https://github.com/ashqal/MD360Player4Android/wiki/Q&A
PLDroidPlayer目前基于ijkplayer,使用PLDroidPlayer的PLVideoTextureView- https://github.com/qiezi666/MyPLVideoTextureViewDemo
深剖VR,AR和MR三者之间关系-- http://geek.csdn.net/news/detail/104943
android 基于ijkplayer项目进行的播放器- http://blog.csdn.net/u014608640/article/details/52607577
Android,ijkplayer增加https协议支持,编译运行ijkplayer- http://www.jianshu.com/p/8403ddc48de1
IJKPlayer编译so支持HTTPS的踩坑历程- http://www.jianshu.com/p/bd289e25d272
音频开发ijkplayer小结 android- http://blog.csdn.net/nothingl3/article/details/51204966
Android MediaPlayer使用方法简单介绍(setdatasource)- http://blog.csdn.net/u013366022/article/details/26448911
ijkplayer阅读学习笔记之从代码上看播放流程- http://blog.csdn.net/i_do_can/article/details/51374732
ijkplayer 是一个基于 ffplay 的开源视频播放器核心 https://github.com/bbcallen/ijkplayer,已经切换到bilibili,
ijkplayer 目前在 iOS 平台各方面表现较佳,Android 方面仍存在一些问题。
B站开源的弹幕引擎DanmakuFlameMaster:https://github.com/Bilibili/DanmakuFlameMaster
移动视频播放SDK框架ijkplayer: https://github.com/Bilibili/ijkplayer
html5视频转码内核flv.js:https://github.com/Bilibili/flv.js
3D视觉原理之深度暗示(即立体感)主要有两种:心理深度暗示和生理深度暗示。心理深度暗示主要由平时的经验积累获得。即使用单眼观看也会使人有3D效果。生理深度暗示包括单眼立体视觉暗示和双眼立体视觉暗示。 单眼立体视觉暗示包括有两种:焦点调节和单眼移动视差。双眼立体视觉暗示主要利用的是人的两
眼在观察同一物体的时候成像的不同来获得物体的前后关系。由于左眼看到物体的左边多一点,右眼看到的物体右边多一点,因而形成了视觉上的差异,即双目视差(如图所示)。双目视差是获得深度信息的生理基础。当前的3D系统基本上采用的都是该原理进行成像。换句话说,就是分别让左眼和右眼在同一时间看到不同的图像。
3D显示技术:分别让左眼和右眼在同一时间看到不同的图像。红蓝3D。偏振光3D。快门3D。
> 注意:如果App添加防止反编译文件配置的话,一定得添加 如下代码(有待进一步优化)
#ijkplayer vrlib,不要去混淆这里面的代码,否则会找不到一些类和SO包
-keep class com.asha.vrlib.** { *; }
-keep class tv.danmaku.ijk.media.player.** { *; }
tcking.github.com.giraffeplayer.GiraffePlayer 普通视频的View显示与隐藏都在这边显示,
所有的错误码都在ijkplayer-java/tv.danmaku.ijk.media.player/IMediaPlayer接口文件下,
VR中,设置横竖屏切换监听,可以切屏,OrientationEventListener.
ijkPlayer中tv.danmaku.ijk.media.player.IjkMediaPlayer类中有本地native方法;
tv.danmaku.ijk.media.player.ffmpeg.FFmpegApi类中也有一个本地native方法.
> ijkplayer编译,windows下用cygwin编译android版ijkplayer(windows下编译so一直有坑,没搞定)
Windows下编译android版ijkplayer- http://blog.csdn.net/King1425/article/details/70331868
ijkplayer在windows下编译并导入Android Studio- http://blog.csdn.net/u010072711/article/details/51354834
windows下用cygwin编译android版ijkplayer- http://blog.csdn.net/ytzys/article/details/47302123
> ijkplayer编译,Linux下编译android版ijkplayer,使用VMware安装的Ubuntu 16.04(转向VM 的Linux下编译so)
关于编译ijkplayer下的so经验分享- http://blog.csdn.net/ht_android/article/details/51859698
VMware安装Ubuntu教程,Linux下搭建Android开发环境- http://blog.csdn.net/linchaolong/article/details/52802401
Android 关于编译ijkplayer下的so经验分享- http://www.cnblogs.com/zhujiabin/p/7207669.html
> 改变裁剪eyes的大小 ,com.asha.vrlib.MDVRLibrary
protected MDVRLibrary createVRLibrary() {
return MDVRLibrary.with(this)
.displayMode(MDVRLibrary.DISPLAY_MODE_NORMAL)
.interactiveMode(MDVRLibrary.INTERACTIVE_MODE_MOTION)
.asVideo(new MDVRLibrary.IOnSurfaceReadyCallback() {
@Override
public void onSurfaceReady(Surface surface) {
mMediaPlayerWrapper.setSurface(surface);
}
})
.ifNotSupport(new MDVRLibrary.INotSupportCallback() {
@Override
public void onNotSupport(int mode) {
String tip = mode == MDVRLibrary.INTERACTIVE_MODE_MOTION
? "onNotSupport:MOTION" : "onNotSupport:" + String.valueOf(mode);
Toast.makeText(PlayerActivity.this, tip, Toast.LENGTH_SHORT).show();
}
})
.pinchConfig(new MDPinchConfig().setMin(1.0f).setMax(8.0f).setDefaultValue(0.1f))
.pinchEnabled(true)
.directorFactory(new MD360DirectorFactory() {
@Override
public MD360Director createDirector(int index) {
return MD360Director.builder().setPitch(90).build();
}
})
.projectionFactory(new CustomProjectionFactory())
.barrelDistortionConfig(new BarrelDistortionConfig().setDefaultEnabled(false).setScale(0.95f))//TODO 这里可以裁剪屏幕setScale(0.95f),设置所占屏幕的百分比
.build(findViewById(R.id.gl_view));
}
> VR渲染出来为什么这么模糊?
MD360Player4Android Q/A- https://github.com/ashqal/MD360Player4Android/wiki/Q&A
1.假设输入的是1080P的视频,整个视频大小为1920x1080,可视范围大概在600x420,很明显640*420的画面在1080p的手机上就模糊了;
2.跟解码器有关
> 陀螺仪和重力感应
mVRLibrary.onPause(PlayerActivity.this);//暂停视频 ,mMediaPlayerWrapper.pause();//VR 视频在可见的范围是不动的,不会感应重力和陀螺仪
mVRLibrary.onResume(PlayerActivity.this);//VR 视频在可见的范围内可以适应重力感应和陀螺仪 ,mMediaPlayerWrapper.resume();//播放器能够开始播放
-- java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.asha.vrlib.texture.MD360Texture.texture(com.asha.vrlib.MD360Program)' on a null object reference at com.asha.vrlib.plugins.MDPanoramaPlugin.renderer(MDPanoramaPlugin.java:80).不Pause的话,opengl一直在render
解决方案:mVRLibrary设置mVRLibrary.onPause()方法,恢复陀螺仪和重力感应mVRLibrary.onResume()
> 改变VR图像显示与左右眼偏离值
在 OpenGL中,摄像机离人的远近。近的话(sNear越大0.9),图像是放大的,可能会越模糊;远的话,图像是缩小的;改变左右眼偏离值。
com.asha.vrlib.MD360Director
private static final float sNear = 0.5f;//TODO 0.7 0.9 0.5
改变VR OpenGL中,左右眼的偏离值-2.0f
MD360Director.builder().setLookX(-2.0f)//TODO
.setEyeX(-2.0f)//TODO
.setPitch(90)
.build();
//手指可以滑动VR视频画面
mVRLibrary.switchInteractiveMode(MD360PlayerActivity.this, 2);
private static final SparseArray
static {
sInteractiveMode.put(MDVRLibrary.INTERACTIVE_MODE_TOUCH,"TOUCH");
}
> ijkplayer视频缓存问题,边播放边缓存及缓冲进度
视频缓存因该是下载,储存流,但是下载在提交到App Store是需要版权的,想要做成缓存,我有了解过,也询问过IJKPlayer作者,得到肯定答复是客户端都不支持流缓存的协议。
-- seekbar其实是ProgressBar的子类,但是ProgressBar是不跟用户交互的,只是提供显示任务进度的作用,而SeekBar则是对ProgressBar的功能进行扩充,使其可以和用户进行交互,即响应用户的点击和拖动事件。
android视频缓冲进度条SeekBar有断断续续的间断效果- http://blog.csdn.net/nn955/article/details/48175817
JiaoZiVideoPlayer- https://github.com/lipangit/JiaoZiVideoPlayer
Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)- http://www.jianshu.com/p/9fe377dd9750
https://github.com/CarGuo/GSYVideoPlayer , https://github.com/danikula/AndroidVideoCache
视频边下边播放:- https://github.com/danikula/AndroidVideoCache/tree/exoPlayer
IJKplayer边播边缓存- https://github.com/Bilibili/ijkplayer/issues/2479#issuecomment-268945110
https://github.com/Bilibili/ijkplayer/issues/2375
mMediaPlayerWrapper.getPlayer().setOnBufferingUpdateListener(new IMediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(IMediaPlayer iMediaPlayer, int percent) {
//TODO
mVideoReloadPercent = percent;
LogUtil.e("PlayerActivity", "onBufferingUpdate pecent=" + percent);
ToastUtil.showLongToast(mContext, "secondProgressPercent=" + (percent+1) * 10);
mVideoSeekBar.setSecondaryProgress((mVideoReloadPercent + 1) * 10);//
}
});
-- IJKPlayer拖动播放进度会导致重新请求数据,未使用已经缓冲好的数据,所以应该尽量控制缓冲区大小,减少不必要的数据损失。
1.mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", 100 * 1024);//设置缓冲区为100KB,目前我看来,多缓冲了4秒
2.mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 100);// 视频的话,设置100帧即开始播放
3.mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "reconnect", 1);//重连模式,如果中途服务器断开了连接,
让它重新连接,参考 https://github.com/Bilibili/ijkplayer/issues/445,解决播放一段时间后出错
4.ijkMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_DEBUG);因为缓存协议不支持在移动设备,你说会做一个补丁来制定一个文件进行存储
5.ijk我印象里是用于流播放的,能用来做边下边播么- https://github.com/Bilibili/ijkplayer/issues/2479#issuecomment-268945110
New feature suggestion #2375- https://github.com/Bilibili/ijkplayer/issues/2375
6.FFmpeg3.3 视频缓存- https://www.ffmpeg.org/ffmpeg-protocols.html#cache
-- What you said has been implemented in cache in ffmpeg except specifying the storage location and I will improve it (may be next release) to ffmpeg.
HOW TO DO
1.add cache prefix in your video video url. http://xxx.yyy.zzz/1.flv => cache:http://xxx.yyy.zzz/1.flv
2.pass transferred url to ijkplayer
3.using option to specify the storage location to ijkplayer (NOT IMPLEMENTED YET)
> ijkplayer设置rtmp秒开,可以让rtmp加载时间从5~10秒缩短到1s以内,以达到秒开且低延迟的目的:
IjkMediaPlayer ijkMediaPlayer = null;
ijkMediaPlayer = new IjkMediaPlayer();
ijkMediaPlayer.setOption(1, "analyzemaxduration", 100L);
ijkMediaPlayer.setOption(1, "probesize", 10240L);
ijkMediaPlayer.setOption(1, "flush_packets", 1L);
ijkMediaPlayer.setOption(4, "packet-buffering", 0L);
ijkMediaPlayer.setOption(4, "framedrop", 1L);
-- 边下边播方法成功:
所以我后来受到网上的启示。先不管mdat这一部分,只下载ftyp与moov部分,并按照其原本的位置放置,而将mdat这一部分架空。最后和方法一同样,不断下载mdat的分段文件并追加到指定位置。(注意,可能有这三者以外的其他数据,所以我将视频重新分为三部分:head,mDat,foot,head是mDat的前面部分,foot是mDat的后面部分) .
边下边播方法改良:
上面已经是很久之前的做法了,从数据结构上来说,分的并不是很合理。现在我改变了一下这里的逻辑:将head、foot、自定义数据、mDat大小这些信息在切割的时候就包含子自定义文件tjbb里面,然后在下载回来的时候,先下载tjbb文件就可以了解析所有必要信息了 .
> 快速起直播流:
直播技术总结(五)如何快速起播直播流- http://blog.csdn.net/hejjunlin/article/details/72860470
这里优化后者,主要修改两个参数,一个是 probesize,一个是 analyzeduration,分别用来控制其读取的数据量大小和时长。减少 probesize 和 analyzeduration 可以降低avformat_find_stream_info 的函数耗时,达到起播快
ijkMediaPlayer.setOption(1,"analyzemaxduration",xxx);
ijkMediaPlayer.setOption(1,"probesize",xxx);
> 滚动ListView/RecyclerView, 列表中实现视频的自动播放
仿网易新闻嵌套视频,小屏,全屏播放-http://download.csdn.net/download/zqs62761130/8910069
新版的百度贴吧,网易新闻中有看视频的界面。
Android在滚动列表中实现视频的播放(ListView & RecyclerView)- https://github.com/danylovolokh/VideoPlayerManager
Android在滚动列表中实现视频的播放- https://github.com/hongyang51/VideoPlayerManager
滚动列表自动播放视频(引用了JiaoZiVideoPlayer)- https://github.com/zzzlw/autovideoplayer
节操播放器JiaoZiVideoPlayer- https://github.com/lipangit/JiaoZiVideoPlayer
节操播放器有使用MediaPlayer和使用ijkPlayer核心包:
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
> IjkPlayer加滤镜
让IjkPlayer支持插入自定义的GPU滤镜- http://blog.csdn.net/junzia/article/details/75172160
ijkplayer实时, 播放rtmp等实时性要求很高的流媒体时候,会出现10S左右的延迟,原因是因为加了缓冲区处理,可以把其缓存设置变小,达到实时的效果:
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 8);
ijkMediaPlayer.setOption(1, "analyzemaxduration", 100L);
ijkMediaPlayer.setOption(1, "probesize", 10240L);
ijkMediaPlayer.setOption(1, "flush_packets", 1L);
ijkMediaPlayer.setOption(4, "packet-buffering", 0L);
ijkMediaPlayer.setOption(4, "framedrop", 1L);
> ijkPlayer中的错误码:
MD360Player4Android Q/A- https://github.com/ashqal/MD360Player4Android/wiki/Q&A
使用ijkplayer播放视频一些问题解- http://www.cnblogs.com/renhui/p/6420140.html
IJKMEDIA: SDL_JNI_DetachThreadEnv
ijkplayer如何断掉握手 Android ? ijkplayer如何释放连接 Android ?
/*
* Do not change these values without updating their counterparts in native
*/
int MEDIA_INFO_UNKNOWN = 1;//未知信息
int MEDIA_INFO_STARTED_AS_NEXT = 2;//播放下一条
int MEDIA_INFO_VIDEO_RENDERING_START = 3;//视频开始整备中,视频准备渲染
int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700;//视频日志跟踪
int MEDIA_INFO_BUFFERING_START = 701;//开始缓冲中
int MEDIA_INFO_BUFFERING_END = 702;//缓冲结束
int MEDIA_INFO_NETWORK_BANDWIDTH = 703;//网络带宽,网速方面
int MEDIA_INFO_BAD_INTERLEAVING = 800;//
int MEDIA_INFO_NOT_SEEKABLE = 801;//不可设置播放位置,直播方面
int MEDIA_INFO_METADATA_UPDATE = 802;//
int MEDIA_INFO_TIMED_TEXT_ERROR = 900;
int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901;//不支持字幕
int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902;//字幕超时
int MEDIA_INFO_VIDEO_INTERRUPT= -10000;//数据连接中断,一般是视频源有问题或者数据格式不支持,比如音频不是AAC之类的
int MEDIA_INFO_VIDEO_ROTATION_CHANGED = 10001;//视频方向改变,视频选择信息
int MEDIA_INFO_AUDIO_RENDERING_START = 10002;//音频开始整备中
int MEDIA_ERROR_SERVER_DIED = 100;//服务挂掉,视频中断,一般是视频源异常或者不支持的视频类型
int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;//数据错误没有有效的回收
int MEDIA_ERROR_IO = -1004;//IO 错误
int MEDIA_ERROR_MALFORMED = -1007;
int MEDIA_ERROR_UNSUPPORTED = -1010;//数据不支持
int MEDIA_ERROR_TIMED_OUT = -110;//数据超时
int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;//数据错误没有有效的回收
IjkMediaPlayer: Error (-10000,0),原来 ijkPlayer默认不支持 https 协议的视频,播放器内部错误或视频源问题或网络不好
Error (-10000,0)
ijkplayer tv.danmaku.ijk.media.player.IMediaPlayer -> error_code
> 视频倍速播放
Vitamio和VLC.最后我选择了Vitamio,因为这个的资料多一些。朋友们也可以去github看看VLC怎么做。这里提醒一下,使用Vitamio需要到官网去下载最新的5.2版本。因为github的4.0版本bug太多,而且不支持64位架构的处理器。还不支持android6.0.直接来看看我怎么做的吧。
简单实现Android视频播放器倍速、清晰度切换、m3u8下载- https://www.jianshu.com/p/f9ae63d04fc2
视频播放器倍速、清晰度切换、下载- https://github.com/wapchief/ClaritySpeedSwitchPlayer
-- Ijkplayer倍速变调
视频直播技术(五):使用Ijkplayer倍速变调问题解决方案- https://www.cnblogs.com/renhui/p/6510872.html
https://github.com/Bilibili/ijkplayer/issues/2785
https://github.com/Bilibili/ijkplayer/issues/2930
mMediaPlayer.setPlaybackSpeed(1.0f);
gpu运算,假如一个视频的默认帧率为60帧每秒,当我们在播放时采用120帧每秒的帧速率。那么我们看到的视频就以原来的2倍速度播放。声音也是如此。硬件是有运算极限的,当速率过大时,如果没有设置帧同步的情况下,硬件会忽略一些帧,如果设置了帧同步,那么硬件可能无法达到我们所设置的速率。
另外一种通过cpu来控制,视频是有一定长度的,那么自然我们能通过控制时间线来控制播放速度,这样gpu只需要知道要绘制哪一帧就行了,但是这给cpu带来了承重的负担,他需要不断的读取文件,而且形成的画面也不再是连续的,通常这种方法是不可取的。
> 音频焦点
Android音频焦点详解(上)- http://blog.csdn.net/wangjihuanghun/article/details/54957459
Android音频焦点详解(下)源码详解- http://blog.csdn.net/wangjihuanghun/article/details/56069283
Android AudioManager处理两个播放器同时有声音- http://blog.csdn.net/shuaicike/article/details/39930823
https://github.com/landptf/BlogDemo
> ijkplayer视频播放器源码分析(android)- http://www.jianshu.com/p/7d9b86919682
ijkplayer:基于FFPlay的轻量级Android/iOS视频播放器,实现了跨平台的功能,API易于集成;编译配置可裁剪,方便控制安装包大小。
除了使用IjkMediaPlayer,还可以使用IjkExoMediaPlayer或者AndroidMediaPlayer。只需要修改一下createPlayer(int playerType)的参数就行了。
音视频渲染及同步??