SeekBar与MediaPlayer(生命周期)的seekTo()问题
> MediaPlayer的原理 Android;基于Stagefight的MediaPLayer框架的结构
Android MediaPlayer 及 NativePlayer 之播放格式对比- https://blog.csdn.net/andyhuabing/article/details/40855955
Android MediaPlayer的主要具体实现在OpenCore的Player中.Android的MediaPlayer包含了Audio和video的播放功能.
MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。
-- Android官方公布的文档显示MediaPlayer支持如下视频格式:
Video H.263 X X 3GPP (.3gp) and MPEG-4 (.mp4)
H.264 AVC X 3GPP (.3gp) and MPEG-4 (.mp4)
MPEG-4 SP X 3GPP (.3gp)
> MediaPlayer生命周期
音频开发ijkplayer小结 android- http://www.jianshu.com/p/55fbfd5b564a
Android MediaPlayer各种状态切换- http://blog.sina.com.cn/s/blog_63f5ae1a0100zajv.html
Android MediaPlayer的生命周期- http://blog.csdn.net/ddna/article/details/5178864
MediaPlayer的生命周期以及状态转换- http://blog.csdn.net/songshizhuyuan/article/details/32947139
Android MediaPlayer生命周期及状态说明- http://blog.csdn.net/biaobiao1217/article/details/51557733
1.MediaPlayer.OnPreparedListener:MediaPlayer进入准备完成的状态触发,表示媒体可以开始播放了。
2.MediaPlayer.OnSeekCompleteListener:调用MediaPlayer的seekTo方法后,MediaPlayer会跳转到媒体指定的位置,当跳转完成时触发。需要注意的时,seekTo并不能精确的挑战,它的跳转点必须是媒体资源的关键帧。
3.MediaPlayer.OnBufferingUpdateListener:网络上的媒体资源缓存进度更新的时候会触发。
4.MediaPlayer.OnCompletionListener:媒体播放完毕时会触发。但是当OnErrorLister返回false,或者MediaPlayer没有设置OnErrorListener时,这个监听也会被触发。
5.MediaPlayer.OnVideoSizeChangedListener:视频宽高发生改变的时候会触发。当所设置的媒体资源没有视频图像、MediaPlayer没有设置展示的holder或者视频大小还没有被测量出来时,获取宽高得到的都是0.
6.MediaPlayer.OnErrorListener:MediaPlayer出错时会触发,无论是播放过程中出错,还是准备过程中出错,都会触发。
-- 出错后在重新初始化播放器并在Prepare监听中根据逻辑加入如下,可在出错前的那个position地方进行播放(方案如下):
long pos = 1000L * mCurrentVrVideoPosition / mTotalVrVideoPosition;
SeekBar.setProgress((int) pos);
mMediaPlayerWrapper.getPlayer().seekTo(mVideoSeekBar.getProgress() * mMediaPlayerWrapper.getPlayer().getDuration() / 1000);
> seekbar ,seekto
seekTo()的相关_android里的mediaplayer- http://blog.csdn.net/some_that_loves/article/details/50533624
安卓 android seekbar 自定义滑块 适合做音量调节 http://download.csdn.net/detail/u013506037/7944623
Android开发——MediaPlayer的seekto分析- http://blog.csdn.net/liuhui1905/article/details/7634416
部分视频源的问题。部分视频播放时,调用seekTo的时候,会跳回到最开始的位置,这是因为视频的关键帧的问题(GOP导致的),视频压缩比较高,而seek只支持关键帧,出现这个情况就是原始的视频文件中i帧比较少,目前针对此问题IjkPlayer无解。
-- mediaPlayer的seekto方法:
使用步奏:
1.实现 OnSeekCompleteListener这个接口;
2.重写onSeekComplete()这个方法,在这个方法里面实现seekto()后的操作,通常是调用mediaplayer的star()t方法进行播放;
3.为mediaplayer设置setOnSeekCompleteListener(OnSeekCompleteListener listener)监听器;
4.调用mediaplayer的seekto(long arg0)这个方法就可以实现前进后退了,arg0参数表示音视频文件的毫秒数,设置到指定时间位置播放;
ps:1.有些媒体不支持Seek,例如直播流。
2.在播放状态下才能实现监听,也就是说播放的时候调用seekto()方法才会有效(个人测试结果)
seekto(position)中position位置不是关键帧;后退几秒是为了找到关键帧开始播放。
其实 seekTo 跳转的位置其实并不是参数所带的 position,而是离 position 最近的视频关键帧。
如果选择第二种方式,要增加视频的关键帧数量,可以推荐大家使用FFmpeg进行增加关键帧的处理工作。
-- FFmpeg 工具相关命令行语句:
ffmpeg.exe -i "D:\in.mp4" -c:v libx264 -preset superfast -x264opts keyint=25 -acodec copy -f mp4 "D:\out.mp4"
命令语句大致意思是:在 D 盘路径下把 in.mp4 视频文件每隔 25 帧设置一个关键帧,音轨保持原视频参数,其余使用 FFmpeg 提供的default 值,最后保存为 out.mp4 文件到 D 盘。
很多情况下都选择盲目地替换不同的视频组件出实现,而忽略了视频源文件本身的问题。
关键帧与关键帧之间的动画可以由软件来创建,叫做过渡帧或者中间帧。
关键帧的用途又分为:普通关键帧(用于处理图形图像和动画);动作脚本关键帧(用于存放动作脚本,关键帧可以通过动作脚本控制flash影片和其中的影片剪辑);
从原理上讲,关键帧插值问题可归结为参数插值问题,传统的插值方法都可应用到关键帧方法中。但关键帧插值又与纯数学的插值不同,它有其特殊性。一个好的关键帧插值方法必须能够产生逼真的运动效果并能给用户提供方便有效的控制手段。一个特定的运动从空间轨迹来看可能是正确的,但从运动学或动画设计来看可能是错误的或者不合适的。用户必须能够控制运动的运动学特性,即通过调整插值函数来改变运动的速度和加速度。为了很好地解决插值过程中的时间控制问题,Steketee等提出了用双插值的方法来控制运动参数。其中之一为位置样条,它是位置对关键帧的函数;另一条为运动样条,它是关键帧对时间的函数。Kochanek等提出了一类适合于keyframe系统的三次插值样条,他们把关键帧处的切矢量分成入矢量和出矢量两部分,并引入三个参数:张量t、连续量c和偏移量b对样条进行控制。该方法已在许多动画系统中得到了应用.
---------------------
作者:desaco
来源:CSDN
原文:https://blog.csdn.net/shareus/article/details/78554225
版权声明:本文为博主原创文章,转载请附上博文链接!
SeekBar与MediaPlayer(生命周期)的seekTo()问题相关推荐
- MediaPlayer生命周期
2019独角兽企业重金招聘Python工程师标准>>> MediaPlayer一旦调用了reset方法以后,必须通过调用setDataSource,prepare和start方法进行 ...
- MediaPlayer状态图及生命周期
MediaPlayer状态图及生命周期 MediaPlayer是Android中的uoge多媒体播放类,我们能通过它控制音视频流或本地音视频资源的播放过程. 这一片博客主要介绍MediaPlayer状 ...
- 【Android笔记】Android MediaPlayer的生命周期
Android MediaPlayer的生命周期 MediaPlayer的状态转换图也表征了它的生命周期,搞清楚这个图可以帮助我们在使用
- MediaPlayer的生命周期和缓冲策略 (源码篇)
目录 概述 必备的知识体系 MediaPlayer的api MediaPlayer的setDataSource(path: String)流程 MediaPlayer::prepare的调用流程 Me ...
- Android SurfaceView的生命周期
本文利用SurfaceView来实现视频的播放 本文地址:http://www.cnblogs.com/wuyudong/p/5851156.html,转载请注明源地址. 在main.xml布局文件添 ...
- Lifecycle Activity和Fragment生命周期感知组件 LifecycleObserver MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Android 广播的生命周期
一:Android 广播的生命周期 一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg).当一 ...
- Android Lifecycle 生命周期组件详解
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/99695779 本文出自[赵彦军的博客] 一.Lifecycle简介 为什么要引进 ...
- Activity生命周期 onCreate onResume onStop onPause
Android应用开发提高系列(6)--Activity生命周期 onCreate 和 onResume 在程序启动时候都会启动, 所有有些需要在onCreate onResume中都要实现的功能,之 ...
最新文章
- python 数据处理 书_Python数据处理
- [iphone]XML 解析 之 TBXML 介绍
- java类验证和装载顺序_java类加载机制,你会了吗?
- 【如何在IDEA中修改连接git远程库中的密码,史上最详细,建议收藏!】
- python转义是什么意思_Python什么情况下会输出转义符
- java设计模式之UML①
- swoole服务器主动推消息,实现websocket-主动消息推送laravelswoole
- android 使用pdf文件大小,Android 加载PDF文件的使用
- linux中对shell变量内容的修改和替换
- Wannafly挑战赛9: D. 造一造(组合数)
- 如何在苹果 M1 上安装使用 FL Studio
- HBase region的split过程浅析
- 代码复杂度问题,coverity代码静态分析工具检查
- Unity3D第三人称Camera视角旋转实现
- 搜索引擎优化(step-by-step)
- 蓝桥杯算法提高 盾神与条状项链
- 如果我写一个开源的HIS软件
- Day01-Oracle的连接与账户
- 177本名著浓缩成了177句话!别等自己做错时才明白
- 从现在开始,请务必珍惜你手里的现金