SeekBar与MediaPlayer(生命周期)的seekTo()问题

来源:互联网 发布:mac chrome书签位置 编辑:程序博客网 时间:2024/05/16 15:21

> 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


  MediaPlayer.OnPreparedListener:MediaPlayer进入准备完成的状态触发,表示媒体可以开始播放了。
  MediaPlayer.OnSeekCompleteListener:调用MediaPlayer的seekTo方法后,MediaPlayer会跳转到媒体指定的位置,当跳转完成时触发。需要注意的时,seekTo并不能精确的挑战,它的跳转点必须是媒体资源的关键帧。
  MediaPlayer.OnBufferingUpdateListener:网络上的媒体资源缓存进度更新的时候会触发。
  MediaPlayer.OnCompletionListener:媒体播放完毕时会触发。但是当OnErrorLister返回false,或者MediaPlayer没有设置OnErrorListener时,这个监听也会被触发。
  MediaPlayer.OnVideoSizeChangedListener:视频宽高发生改变的时候会触发。当所设置的媒体资源没有视频图像、MediaPlayer没有设置展示的holder或者视频大小还没有被测量出来时,获取宽高得到的都是0.
  MediaPlayer.OnErrorListener:MediaPlayer出错时会触发,无论是播放过程中出错,还是准备过程中出错,都会触发。

> 出错后在重新初始化播放器并在Prepare监听中根据逻辑加入如下,可在出错前的那个position地方进行播放(方案如下):
long pos = 1000L * mCurrentVrVideoPosition / mTotalVrVideoPosition;
SeekBar.setProgress((int) pos);
mMediaPlayerWrapper.getPlayer().seekTo(mVideoSeekBar.getProgress() * mMediaPlayerWrapper.getPlayer().getDuration() / 1000);

    部分视频源的问题。部分视频播放时,调用seekTo的时候,会跳回到最开始的位置,这是因为视频的关键帧的问题(GOP导致的),视频压缩比较高,而seek只支持关键帧,出现这个情况就是原始的视频文件中i帧比较少,目前针对此问题IjkPlayer无解。


Android开发——MediaPlayer的seekto分析- http://blog.csdn.net/liuhui1905/article/details/7634416

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()的相关_android里的mediaplayer- http://blog.csdn.net/some_that_loves/article/details/50533624

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对样条进行控制。该方法已在许多动画系统中得到了应用.

----------------------------------------

> MediaPlayer的原理 Android;基于Stagefight的MediaPLayer框架的结构
Android MediaPlayer的主要具体实现在OpenCore的Player中.Android的MediaPlayer包含了Audio和video的播放功能.
MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。 

原创粉丝点击