> 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);
-- MediaPlayer 音视频编解码
a、硬件解码:硬件解码是图形芯片厂商提出的用GPU资源解码视频流的方案;
b、软件解码:相对于硬件解码,传统的软件解码是用CPU承担解码工作;
android 原生 MediaPlayer 和 MediaCodec 的区别和联系- http://www.cnblogs.com/nmj1986/p/9489150.html
Android提供了MediaPlayer播放器播放媒体文件,其实MediaPlyer只是对Android Media包下的MediaCodec和MediaExtractor进行了包装。Android媒体文件的解码,编码和渲染流程。
使用android.media包下的MediaCodec和MediaExtractor实现一个简单的视频解码渲染。使用到了:
MediaCodec:负责媒体文件的编码和解码工作,内部方法均为native
MediaExtractor:负责将指定类型的媒体文件从文件中找到轨道,并填充到MediaCodec的缓冲区中
AudioTrack:负责将解码之后的音频播放
SurfaceView:展示解码之后的视频
MediaCodec类可用于访问底层媒体编解码器,例如:编码器/解码器组件。它是Android底层多媒体支持基础架构的一部分(通常与MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface, 和 AudioTrack 一起使用。)。
-- MediaPlayer stop(),release(),restet()
使用MediaPlayer的一些注意事项-
https://blog.csdn.net/panes/article/details/30728447
Android MediaPlayer各种状态切换-
https://blog.csdn.net/joke124/article/details/51674001
调用了reset()方法后,它就处于Idle状态。当调用了release()方法后,它就处于End状态。
一旦发生错误,MediaPlayer对象会进入到Error状态。为了重用一个处于Error状态的MediaPlayer对象,可以调用reset()方法来把这个对象恢复成Idle状态。
> 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对样条进行控制。该方法已在许多动画系统中得到了应用.
> MediaPlayer的原理 Android;基于Stagefight的MediaPLayer框架的结构Android MediaPlayer 及 NativePlayer 之播放格式对比- https://blog.csdn.net/andyhuabing/article/details/40855955Android MediaPlayer的主要具体实现在OpenCore的Pla...
在使用音频时,需要用到
MediaPlayer
,除了一些基础的方法之外,比较难掌握的就是设计播放点的调转的地方,进过反复调试,我最终找到一个可以让g
et
CurrentPosition()和
seekTo
(int)发挥作用的方法。
一、 布局代码如下:
[html] view
plaincopy
最近工作的任务与播放器相关(本人是个新手),需要用到
mediaPlayer
这个类的一些常用方法。在实现快进后退的时候需要用到
seekto
这个方法,我百度查了一下对这个方法的介绍不是太多。后来经过实践才发现该方法的使用。话不多说,接下来就讲下我使用后的经验,希望能新手们启发。
使用步奏:
1.实现 OnSeekCompl
et
eListener这个接口;
2.重写onSeekComple
做到音频播放和音乐播放时,大多数都要用到
Seekbar
。现在我先简单介绍下
Seekbar
的几个重要属性。
android:max 设置值的大小 .
android:thumb=”@drawable/” 显示的那个可拖动图标,如果没有设置该参数则为系统默认,如果自己需要重新定义,则将自己需要的图标存放在资源目录 /res/drawable下,然后调用即可.
android:thumbOffse
mediaPlayer
在当前活动使用,活动pause,destroy一定要
release
,否则系统资源不够
mediaPlayer
2.
release
(); 后一定要接上
mediaPlayer
2=null;
判断
mediaPlayer
是否
release
用if(
mediaPlayer
2!=null)
MediaPlayer
会消耗宝贵的系统资源。因此,你应该经常采取额外的预防措施来确保及时把不需要...
当查阅
MediaPlayer
文档时 你会发现这个方法s
et
OnCompl
et
ionListener,这里的说明指出该方法允许你注册一个回调。当媒体资源或音频文件到达结束位置时会回调该方法,注意该方法的输入是OnCompl
et
ionListener
部分代码如下:
public class NumbersActivity extends AppCo...