【问题标题】:Android VideoView error (1,16) and shows black screenAndroid VideoView 错误(1,16)并显示黑屏
【发布时间】:2012-07-16 22:14:13
【问题描述】:

我有一个带有 VideoView 的应用程序,它正在播放内部存储中的 mp4 文件(我的包 files 目录)

一些三星 Epic Touch 4g (Galaxy SII) 设备上,而不是正在显示的视频,屏幕是全黑的。我的应用程序中的所有其他内容都正常运行并响应,因此设备根本没有“冻结”,它只是在屏幕上显示黑色而不是视频。

要开始我的视频,我使用 onPreparedListener 回调来调用 start():

mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer arg0) {
        mVideoView.start();
    }
});

我将视频设置为在此通话中播放:

//file is the reference to my video File object. 
//I am positive that it is correct
mVideoView.setVideoPath(file.getAbsolutePath());

我有一个这样的 onErrorListener 设置:

mVideoView.setOnErrorListener(new OnErrorListener(){
    @Override
    public boolean onError(MediaPlayer arg0, int arg1, int arg2) {  
        Log.i(myTag, "MP ERROR: "+ arg1 + " - " + arg2);
        /* I have also tried this here, no luck this way either
        mVideoView.setVideoPath(file.getAbsolutePath());
        return true;
        */
        return false;
    }       
});

经过仔细检查,我意识到我的 onErrorListener 根本没有收到回调。

虽然屏幕上一片漆黑,但日志却一遍又一遍地收到这些消息:

V/PlayerDriver(2579): HandleInformationalEvent: PVMFInfoProcessingFailure
V/PlayerDriver(2579): HandleInformationalEvent: type=16 UNHANDLED
E/MFC_DEC_APP(2579): SsbSipMfcDecExe] IOCTL_MFC_DEC_EXE failed(ret : -2001)
E/PVMFOMXVideoDecNode(2579): Ln 1652 OMX_EventError nData1 -2147479541 nData2 0

并且(有时后面的行会与上述 4 行的垃圾邮件相互穿插。但其他时候,在上述 4 行的多次垃圾邮件迭代后,这两行会自行发送垃圾邮件。)

W/MediaPlayer(30537): info/warning (1, 16)
I/MediaPlayer(30537): Info (1,16)

我不认为这是我的视频 (AVC MP4) 的编码问题,因为完全相同的视频可以在一些 Epic Touch 4g 设备上正常运行(甚至某些在相同版本的操作系统上) )。而且我过去在这台设备上使用过完全相同的视频,当设备升级到操作系统版本 2.3.6 时,这些问题就开始出现了。

谁能解释我看到的 OMX/MFC 错误?或者有没有其他人对 VideoView 只显示黑屏而不是视频有问题?最后,我应该以其他方式启动视频文件的准备/播放,而这可能不会导致这些错误和黑屏吗?

编辑:我在 this file 发现警告 #16 是:

/*
Notification that a processing failure occurred (not fatal error)
*/
const PVMFStatus PVMFInfoProcessingFailure = 16;

这应该是一个非致命错误。我想它没有崩溃,所以它不是“致命的”,但无论发生什么都会导致我的视​​频无法正常显示。

编辑 2:视频开始时来自设备的更多日志。这些都出现在上述垃圾邮件之前:

D/PowerManagerService(2677): acquireWakeLock flags=0xa tag=KEEP_SCREEN_ON_FLAG uid=1000 pid=2677   myUID=1000 myPID=2677 myTID=23672
I/ALSAModule(2579): Initialized ALSA PLAYBACK device hifi
W/AudioFlinger(2579): write blocked for 99 msecs, 318 delayed writes, thread 0x61a00
I/libfimc(2677): bool SecFimc::create(SecFimc::FIMC_DEV, fimc_overlay_mode, unsigned int):: Fimc reserved memory =0x57da0000
E/Surface(6585): Surface::init token -2 identity 3401
E/action=%s(2677): com.android.music.musicservicecommand
D/AudioService(2677): musicservicecommand
E/MediaPlayer-JNI(6585): setDataSource: outside path in JNI is ?x@
I/WindowManager(2677):   CREATE SURFACE Surface(name=SurfaceView, identity=3401, mNativeSurface=0) IN SESSION android.view.SurfaceSession@40825e90: pid=6585 format=4 flags=0x200 / Window{40bbc478 SurfaceView paused=false}
D/MediaPlayerService(2579): getPlayerType. Ln=935
D/MediaPlayerService(2579): createPlayer. type=1
D/MediaPlayerService(2579):  create PVPlayer
V/PlayerDriver(2579): PVSuspensionState struct constructor
V/PVPlayer(2579): PVPlayer constructor
V/PVPlayer(2579): construct PlayerDriver
V/PlayerDriver(2579): constructor
V/PlayerDriver(2579): OpenCore hardware module not found
V/PlayerDriver(2579): start player thread
V/PlayerDriver(2579): startPlayerThread
V/PlayerDriver(2579): InitializeForThread
V/PlayerDriver(2579): OMX_MasterInit
V/PlayerDriver(2579): OsclScheduler::Init
V/PlayerDriver(2579): CreatePlayer
D/(2579): SISO TEST registering PVMFRecognizerPluginFactory
D/(2579): SISO TEST registering PVMFRecognizerPluginFactory success
V/PlayerDriver(2579): AddToScheduler
V/PlayerDriver(2579): PendForExec
V/PlayerDriver(2579): OsclActiveScheduler::Current
V/PlayerDriver(2579): StartScheduler
V/PVPlayer(2579): send PLAYER_SETUP
V/PlayerDriver(2579): Send player code: 2
V/PlayerDriver(2579): CommandCompleted
V/PlayerDriver(2579): Completed command PLAYER_SETUP status=PVMFSuccess
V/PVPlayer(2579): setVideoSurface(0x46b0d0)
V/PVPlayer(2579): setVideoSurface(0x2d8cd0)
V/PVPlayer(2579): prepareAsync
D/ViewRoot(3990): handleAppVisibility:TN_USA_U1_SPR
V/PlayerDriver(2579): Send player code: 3
V/PlayerDriver(2579): handleSetDataSource
V/PlayerDriver(2579): handleSetDataSource- scanning for extension
V/PlayerDriver(2579): CommandCompleted
V/PlayerDriver(2579): Completed command PLAYER_SET_DATA_SOURCE status=PVMFSuccess
V/PVPlayer(2579): run_init s=0, cancelled=0
V/PlayerDriver(2579): Send player code: 6
V/PlayerDriver(2579): release string is 2.3.6 len 5
V/PlayerDriver(2579): HandleInformationalEvent: PVMFInfoDurationAvailable
V/PlayerDriver(2579): .... with duration = 168483 ms
V/PlayerDriver(2579): CommandCompleted
V/PlayerDriver(2579): Completed command PLAYER_INIT status=PVMFSuccess
V/PlayerDriver(2579): dongju PlayerCommand::PLAYER_INIT enter
V/PlayerDriver(2579): File EXT is : .mp4
E/PlayerDriver(2579): PlayerDriver::it is a not Protected file
V/PlayerDriver(2579): PlayerCommand::PLAYER_INIT exit
V/PVPlayer(2579): run_set_video_surface s=0, cancelled=0
V/PlayerDriver(2579): Send player code: 4
W/PlayerDriver(2579): Using generic video MIO
V/PlayerDriver(2579): CommandCompleted
V/PlayerDriver(2579): Completed command PLAYER_SET_VIDEO_SURFACE status=PVMFSuccess
V/PVPlayer(2579): run_set_audio_output s=0, cancelled=0
V/PlayerDriver(2579): Send player code: 5
V/PlayerDriver(2579): Create realtime output
V/PlayerDriver(2579): CommandCompleted
V/PlayerDriver(2579): Completed command PLAYER_SET_AUDIO_SINK status=PVMFSuccess
V/PVPlayer(2579): run_prepare s=0, cancelled=0
V/PlayerDriver(2579): Send player code: 7
V/PlayerDriver(2579): disable natpkt - 0
I/MFC_DEC_APP(2579): [SsbSipMfcDecOpen] MFC Library Ver 1.00
I/MFC_DEC_APP(2579): [SsbSipMfcDecOpen] handle(61) 
V/PlayerDriver(2579): HandleInformationalEvent: UNKNOWN PVMFStatus
V/PlayerDriver(2579): HandleInformationalEvent: type=44 UNHANDLED
W/MediaPlayer(6585): info/warning (1, 44)
I/MediaPlayer(6585): Info (1,44)
V/PlayerDriver(2579): CommandCompleted
V/PlayerDriver(2579): Completed command PLAYER_PREPARE status=PVMFSuccess
V/PlayerDriver(2579): PLAYER_PREPARE complete mDownloadContextData=0x0, mDataReadyReceived=0
D/MediaPlayer(6585): getMetadata
V/PVPlayer(2579): setLooping(0)
V/PVPlayer(2579): check_for_live_streaming s=0, cancelled=0
V/PlayerDriver(2579): Send player code: 12
V/PVPlayer(2579): setLooping(0)
V/PlayerDriver(2579): Send player code: 12
E/PVPlayer(2579): isDrmfile playing 0
E/PVPlayer(2579): OPLBlocked = 0
E/MediaPlayerService(2579): MediaPlayerService::mIsAnyDrmVideoPlaying : 0
E/MediaPlayerService(2579): MediaPlayerService::mpCheckOPLBlocked : 0
V/PVPlayer(2579): start
E/AudioPolicyManager(2579): getParamFromPolicy
D/AudioPolicyManager(2579): mCurDevice is 2
V/AudioPolicyManager(2579): getDeviceForStrategy() strategy 0, device 2
V/AudioPolicyManager(2579): getNewDevice() selected device 2
I/FmRadioController(2677): Jni player_SetVolume :7 
I/FmRadioController(2677): ---Jni player_SetVolume---
V/PlayerDriver(2579): Send player code: 8
V/PlayerDriver(2579): dongju handleStart
E/PlayerDriver(2579): PlayerDriver::handleTvOut state=[1]
E/PlayerDriver(2579): PlayerDriver::it is not a DRM file.So don't suspend TVOUT
V/PlayerDriver(2579): CommandCompleted
V/PlayerDriver(2579): Completed command PLAYER_START status=PVMFSuccess

【问题讨论】:

  • 在有此问题的设备上重新安装您的应用程序有什么不同吗?我想知道视频文件是否以某种方式在内部存储中损坏或类似的东西。
  • 不 =/。我已经尝试重新安装,甚至保持安装状态,但删除了视频文件,这样它就可以获取一个新的副本,但也没有运气。
  • 以防万一这可能会有所帮助:我怀疑此 SsbSipMfcDecAPI.c 文件中的第 231 行正在生成错误消息。代码 -2001 似乎根据其header file 指定了 MFC_RET_DEC_EXE_TIME_OUT。虽然不知道如何修复:)
  • 这种情况仅发生在您创建的特定 mp4 文件,还是 Android 2.3.6 上的所有 mp4 文件类型?
  • 我尝试过的每个 mp4 文件都会发生这种情况。 (大约六个,都在具有旧操作系统的同一设备上工作,并且都在具有相同操作系统的同一设备的某些实例上工作。)

标签: android mp4 android-videoview android-mediaplayer


【解决方案1】:

我曾经遇到过类似的问题,当我的回调出现错误时,我通过重新加载活动来解决它。起初它工作,但后来它一直失败,这导致活动的无限重启循环。然后我决定在这种情况下放一张图片而不是视频(这真的没那么重要)。

我猜这值得一试...如果您的 onErrorListener 没有得到任何回调,只需在 Activity 激活 5 秒后运行它,以测试它是否能解决您的问题。

这是我为重新加载活动而编写的代码:

public void reload(String boolExtra) {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    finish();

    overridePendingTransition(0, 0);
    startActivity(intent);
}

我可以建议的另一种方法 - 使用编解码器。我知道它在其他设备上运行良好,但你永远无法知道这个特定 Android 版本附带的这个特定设备的编解码器是否有错误。尝试改变它的尺寸。

祝你好运:)

【讨论】:

  • 它在运行相同版本操作系统的同一设备的其他实例上运行。我试过玩一些视频编码,但没有运气=/
  • 重新启动活动似乎有时会有所帮助。但我不能将其用作永久解决方案
  • 您可能会考虑在活动“开始”几秒钟后开始播放视频。使用 postDelayed(Runnable, Delay) 将 runnable 发布到 Handle。这个runnable将负责启动视频。从长时间的延迟(10 秒)开始,然后一直玩下去,直到找到最佳位置。它并不完美,但它可以解决你的大部分情况
【解决方案2】:
File filepath = new File(Environment.getExternalStorageDirectory()+"/Video/"+"abc_video.mp4");

Uri path = Uri.fromFile(filepath);

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "video/*");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

用它来运行你的视频,我相信你的问题会解决的。

【讨论】:

  • 我需要在我自己的 Activity 中播放视频,在播放视频时还有其他事情发生。
  • 这个 wud 播放视频,在视频停止并按下返回按钮后,您将返回您的活动。此代码仅将视频重定向到视频播放器以播放视频。
  • 我知道,但是我的应用在播放视频时正在做其他事情,所以我需要在我自己的 Activity 中播放它。
【解决方案3】:

由于您已经说过重新启动活动有时会起作用,我敢打赌它是一个多线程事件触发器,通常发生在您的 onPrepared() 侦听器触发之前,但并非总是在特定手机导致您出现问题的情况下.我不知道您何时真正准备要播放的视频,但我猜它在 onCreate() 中。如果是这样,我建议尝试以下机制:

在您的 Activity 类中,像这样创建一个布尔成员:

protected boolean bMyVideoIsReady = false;

一旦你有了,修改你的监听器:

    mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer arg0) {
            if (MyActivity.this.bMyVideoIsReady)
                mVideoView.start();
            else
                MyActivity.this.bMyVideoIsReady = true;
        }
    });

完成这些修改后,将以下内容添加到您的活动的 onResume():

@Override
protected void onResume() {
    super.onResume();
    if (bMyVideoIsReady) 
        mVideoView.start();
    else
        bMyVideoIsReady = true;
}

这将完成的是,如果您的视频在 Activity 准备好开始播放之前加载,您的侦听器将简单地将布尔标志设置为 TRUE,然后 onResume() 将看到该标志已设置并开始播放您的视频。如果 onResume() 在视频完成加载之前被调用,那么它会简单地设置标志,现在你的听众会看到它并在那个时候开始播放视频。这样,您的视频将不会在 Activity 准备好之前开始播放,并希望它可以防止您目睹的这种奇怪行为。

【讨论】:

  • 但是如何强制视频视图准备视频
猜你喜欢
  • 2012-04-03
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多