我正在开发Android应用,我正在使用Android SDK的MediaPlayer
在我的应用中播放一些视频。当我在我的应用程序中播放视频时,大约五分之一,视频播放没有视频。这不是一个简单的编码错误,因为大多数时候视频播放都很完美。
我认为我的代码中的竞争条件导致了这个错误。但是,我添加了许多调试语句,当视频无法播放时,所有内容似乎都已正确设置。
我已经扫描过网络,并试图寻找解决方案,但没有一个是足够的(见下文)。
之前有没有人遇到过这类问题?如果是这样,你做了什么?
类似问题:
android media player shows audio but no video
android video, hear sound but no video
更多细节:
更新
我一直在调试这个并查看logcat。我发现当视频工作时,logcat中出现如下内容:
09-28 00:09:03.651: VERBOSE/PVPlayer(10875): setVideoSurface(0x65638)
但是当视频无法播放时,它看起来像是一个空条目:
09-28 00:03:35.284: VERBOSE/PVPlayer(10875): setVideoSurface(0x0)
更新2:
当视频无法播放时,MediaPlayer.OnInfoListener函数包含参数what==MEDIA_ERROR_UNKNOWN(0x1)
和extra==35
。我查看了Android代码库,试图确定未知错误35的含义。我遇到了文件pv_player_interface.h,它表示错误代码35对应于名为PVMFInfoTrackDisable
的内容。我用Google搜索了一个名为pvmf_return_codes.pdf
的文件。该文件给了我以下难以理解的解释:
4.34。 PVMFInfoTrackDisable
通知特定的轨道 禁用。这个是基于每个轨道。对于未压缩的 音频/视频格式,在选择可用曲目的过程中 在内容中,如果解码器不支持音轨,a 发送PVMFInfoTrackDisable事件。如有必要,该活动将是 每个赛道发送一次。
我觉得我走了很长的路,但我没有找到答案......仍在调查。
答案 0 :(得分:18)
我解决了这个问题,尽管是以一种完全黑客的方式。实际上有两个问题:
邪恶的信息35消息:我发现有时会使用extra == 35调用MediaPlayer.OnInfoListener。发生这种情况时,您已经搞砸了,视频无法正常播放。我不知道是什么原因造成的。我找到的唯一解决方法是尝试重新启动视频并重新完成整个prepareAsync过程。视频播放通常是第二次播放。
视频大小未设置:即使发布了MediaPlayer.OnPreparedListener(或等效的prepare()返回),也可能未设置视频大小。视频大小通常会在准备返回后设置几个毫秒,但有一段时间它处于模糊状态。如果在设置视频大小之前调用MediaPlayer.start(),则有时(但不总是)播放失败。有两种可能的解决方案:(1)轮询MediaPlayer.getVideoHeight()或getVideoWidth()直到它们非零或(2)等待直到调用OnVideoSizeChangedListener。只有在这两个事件中的一个之后,你才应该调用start()。
通过这两个修复,视频播放更加一致。这些问题很可能是我的手机(Samsung Charge和T-Mobile Comet)的问题,所以如果在其他手机上存在不同但类似的问题我也不会感到惊讶。
答案 1 :(得分:3)
根据speedplane的建议,我想出了以下代码。如果MediaPlayer.getVideoHeight()在onPrepared中返回0,那么我会延迟1秒并重试。现在,如果第一次不播放,通常会在1秒后播放。我看到它需要多次尝试。
private void videoPlayer(String path){
if (mMediaController == null)
{
mMediaController = new MediaController(this);
mVideoView.setMediaController(mMediaController);
}
if (!mMediaController.isShowing())
mMediaController.show();
getWindow().setFormat(PixelFormat.TRANSLUCENT);
mVideoView.setVideoPath(path);
mVideoView.requestFocus();
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(final MediaPlayer mp) {
mVideoView.seekTo(mImageSeek);
if (mp.getVideoHeight() == 0) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mVideoView.stopPlayback();
mMediaController = null;
videoPlayer(mImageFilepath);
}
}, 1000);
} else
mVideoView.start();
}
});
}
答案 2 :(得分:1)
我已经研究了这个错误2周了,我或多或少地了解了真正的问题。当然,我在谈论 The Evil Info 35 Message 。如果你遇到了这个奇怪的错误,现在你可以开心并拍摄一些像三星这样的供应商:D ......
出现问题是因为用户无法看到表面视图(tabhost中的活动或暂停 - 唤醒功能,有时不会聚焦,有时也不会在前面(可能))。
这是因为某些重置视频运行正常,导致它获得焦点或者其他活动/对象可能没有重叠。
当其中一些发生时,媒体播放器认为您无法看到视频或无法播放视频,并且会禁用视频播放,让您在听音乐曲目时感受到工作中最严重的问题。< / strong>
会看到下一个错误,祝你好运。 :d
答案 3 :(得分:-4)
我的Desire HD上也有这个问题大概1到2次。我尝试了很多东西,但错误总是在那里。毕竟我选择在我的设备上安装自定义ROM。之后它完美地工作了,我再也没有遇到过这个问题。
我知道这不是你想听到的那种答案,但我没有找到其他的灵魂。
您可以在此处找到适用于您设备的自定义ROM:XDA Developers
我希望我能帮助你。
最好的问候和快乐的电影观看
safari =)
答案 4 :(得分:-5)
基本问题是: 在surfaceCreated调用之前你开始视频播放,当持有者没有为MediaPlayer做好准备时,你只能听到声音但却看不到图片!
正确的方法是: