等等一些其余更多问题。最为典型的应该就是上述这些问题了。这些问题,仔细看看官网上对于MediaPlayer的讲解后,基本都不会是问题。恩,最后一个问题除外。相对MediaPlayer的状态机来讲,MediaPlayer的各个方法的有效状态和无效状态为咱们在使用MediaPlayer的具体方法时,提供了更好的指南。html
感受用有效状态和无效状态来翻译不太合适,干脆直接就用官方上面所说的Valid and invalid states吧。它指出了MediaPlayer中经常使用公有方法在那些状态下可使用,在那些状态下不可使用。
咱们能够将全部的方法分为三类。
- 在任何状态下均可以使用的。好比设置监听,以及其余MediaPlayer中与资源无关的方法。须要特别注意的是setDisplay和setSurface两个方法。
- 在MediaPlayer状态机中除Error状态均可以使用的。好比获取视频宽高、获取当前位置等。
- 对状态有诸多限制,须要严格遵循状态机流程的方法。 好比start、pause、stop等等方法。
具体的在MediaPlayer官方说明中有对应的表。android
针对上面提到的问题,经过MediaPlayer的状态机和它的经常使用方法的可用状态来进行讨论,咱们就能找到相应的缘由,由于代码是不会欺骗的。
1. 有声音没有图像
视频播放有声音没图像也许是在使用MediaPlayer最容易出现的问题,几乎全部使用MediaPlayer的新手都会遇到。视频播放的图像呈现须要一个载体,须要利用MediaPlayer.setDisplay设置一个展现视频画面的SurfaceHolder,最终视频的每一帧图像是要绘制在Surface上面的。一般,设置给MediaPlayer的SurfaceHolder未被建立,视频播放就注定没有图像。
* 好比你先调用了setDisplay,可是这个时候holder是没有被建立的。视频就没有图像了。
* 或者你在setDisplay的时候holder确保了holder是被建立了,可是当由于一些缘由holder被销毁了,视频也就没有图像了。
* 再者,你没有给展现视频的view设置合适的大小,好比都设置wrap_content,或者都设置0,也会致使SurfaceHolder不能被建立,视频也就没有图像了。
2. 视频图像变形
Surface展现视频图像的时候,是不会去主动保证和呈现出来的图像和原始图像的宽高比例是一致的,因此咱们须要本身去设置展现视频的View的宽高,以保证视频图像展现出来的时候不会变形。我认为比较合适的作法就是利用FrameLayout嵌套一个SurfaceView或者其余拥有Surface的View来做为视频图像播放的载体View,而后再OnVideoSizeChangeListener的监听回调中,对载体View的大小作更改。
3. 切入后台后声音还在继续播放
这个问题只须要在onPause中暂停播放便可
4. 切入后台再切回来,视频黑屏
诸如此类的黑屏问题,可能是由于surfaceholder被销毁了,再切回来时,须要从新给MediaPlayer设置holder。
5. 播放时会有一小段时间的黑屏
视频准备完成后,调用play进行播放视频,承载视频播放的View会是黑屏状态,咱们只须要在播放前,给对应的Surface绘制一张图便可。
6. 多个SurfaceView用来播放视频,滑动切换时会有上个视频的残影
当视频切换出界面,设置surfaceView的visiable状态为Gone,界面切回来时再设置为visiable便可ide