视频播放器之遇到问题篇
---------------------------------------------------------------------------------------------------------------------------
遇到问题1:
当播放公司服务器视频,在模拟器2.1系统下无问题播放,但在模拟器2.2系统下当执行到MediaPlayer.prepaer();这个方法时会抛出IOException异常?
解决思路:
首先去查看了Android里面MediaPlayer.prepaer();的源代码,看看在什么情况在会抛出IO异常,但是它的MediaPlayer.java里的prepaer()方法是 native的,看MeidaPlayer.cpp也没具体看明白.后来查看Android Supported Media Formats发现其支持视频编码是Baseline Profile (BP),而播放视频通过MediaInfo查看其视频编码是Baseline@3。后来连接手机调试,使用MOTO Defy 2.2无法播放,但放到HTCG7 2.2及平板电脑上可正常播放,据此推断,可能是由于厂家定制底层和内核的时候,根据需求增减了一部分支持的视频编码。
---------------------------------------------------------------------------------------------------------------------------
遇到问题2
正常情况下如果视频处于started状态直接调用MediaPlayer.seekTo()跳转指定时间没有问题,但是如果处于paused状态调用MediaPlayer.seekTo()方法后,此时开始调用start()方法会出现error,,onError(MediaPlayer mp, int what, int extra)中返回的是
07-1916:05:29.499: INFO/System.out(7763): whatis 100 extra 0
100代表的是MEDIA_ERROR_SERVER_DIED
extra 0没搞懂是什么,后来查看自带的播放器也存在这个问题,视频暂停,然后拖动进度条,在开始会发生错误。
解决办法:
尝试方法1:
1在拖动进度条监听器的onStopTrackingTouch()方法中首先检测视频是否正在播放(mMediaPlayer.isPlaying()==true),
2如果拖动前是暂停状态的话,就先start进入started状态,
3然后在调用seekTo()方法,测试后还是会问题,错误如下
07-1916:54:05.569: ERROR/ProfileVideoFrameDrops(8984): PVMediaOutputNodePort 1Frames dropped at 1
07-1916:54:05.960: ERROR/TI_Video_Decoder(8984): 2273 VIDDEC_HandleCommandFlush DSPflushed without processing SPS/PPS. saving first buffer
07-1916:54:05.983: ERROR/MediaPlayer(8959): internal/external state mismatchcorrected
onError(MediaPlayermp, int what, int extra)中返回的是
07-1916:54:05.983: INFO/System.out(8959): what is 100 extra 0
然后进入了OnCompletionListener中的onCompletion方法
然后onError r(MediaPlayer mp, int what, intextra)继续返回
07-1916:54:06.092: INFO/System.out(8959): what is -38 extra 0
说明此方法行不通。
尝试方法2:
1 和第一步一样,看是否在播放中
2 如果处于paused状态,调用reset()方法,
3然后重新调用prepare()方法准备
4开始seekTo();或者先start(),然后seekTo();
出现的问题是:
onError(MediaPlayer mp, int what, intextra)中返回的是
07-19 17:10:17.749:INFO/System.out(9472): what is -38 extra 0
尝试方法3:
1 和第一步一样,看是否在播放中
2如果处于paused状态,调用stop()方法,
3然后重新调用prepare()方法准备
4开始seekTo();
这种方法是我暂时尝试到了能行得通的方法,但是有个小瑕疵,就是seekTo()后自动播放了,这时调用pause()也停不了,或者先start(),然后pause()也不行。不知道是什么原因,查看log发现当跳动时的错误
07-1920:17:20.108: ERROR/TI_LCML(11015): 507 :: Exiting Init_DSPSubSystem
07-1920:17:20.881: ERROR/ProfileVideoFrameDrops(11015): PVMediaOutputNodePort 5Frames dropped at 6
---------------------------------------------------------------------------------------------------------------------------
遇到问题3
获取PopupWindow上的按钮ID 例如ImageButton playButton = (ImageButton)findViewById(R.id.play);一直出现空指针异常。
解决办法:
这时候findViewById(R.id.play)是当前View的,而不是PopupWindow里的,应该修改成为
ImageButtonplayButton = (ImageButton) vPopupWindow.findViewById(R.id.play);
---------------------------------------------------------------------------------------------------------------------------
遇到问题4
在实验PopupWindow时,把seekBar和开始按钮放到PopupWindow上,但是弹出PopupWindow后,点击PopupWindow外部其他控件时,PopupWindow无法消失,焦点一直在PopupWindow上.
解决办法:
网上查看相关资料后。发现是因为没有给PopupWindow设置背景图片,使用下面这个方法
popup.setBackgroundDrawable(getResources().getDrawable(R.drawable.videoplayer_bg));
后问题解决。
---------------------------------------------------------------------------------------------------------------------------
遇到问题5
想在视频播放中使用OnGestureListener识别用户手势,来做到不使用控制台快捷控制一些常用的例如快进倒退调声等,但是实验时无法进入android.view.GestureDetector.OnGestureListener里的public boolean onFling()函数.因此没法检测手势
解决办法:
把默认生成的onDown方法返回值改成 return true;
public boolean onDown(MotionEvent e)
{
// TODO Auto-generatedmethod stub
return true;
}
----------------------------------------------------------------------------------
遇到问题6
使用更新时间线程和打开控制台一定时间后自动隐藏控制台线程时,如果处于线程延时时间内横竖屏转换时,转变后会发生错误导致崩溃.错误如下:
07-2017:13:13.780: WARN/dalvikvm(12151): threadid=1: thread exiting with uncaughtexception (group=0x400208b0)
07-2017:13:13.803: ERROR/AndroidRuntime(12151): java.lang.IllegalArgumentException:View not attached to window manager
解决办法
原因估计是在横竖屏转换时Activity重载时没有注销线程里的Runnable
隐藏控制台线程在run()方法结尾执行注