5

files内部ストレージ (パッケージディレクトリ)から mp4 ファイルを再生する VideoView を持つアプリケーションがあります。

一部のSamsung 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 行のスパムが数回繰り返された後、これら 2 行だけがスパムにされることもあります。)

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

一部のEpic Touch 4g デバイス (同じバージョンの OS であっても) でまったく同じビデオが動作するため、私のビデオ (AVC MP4) のエンコーディングの問題ではないと思います。過去にこのデバイスでまったく同じビデオを使用しましたが、これらの問題は、デバイスが OS バージョン 2.3.6 にアップグレードされたときに発生し始めました。

私が見ているOMX/MFCエラーに誰か光を当てることができますか? または、VideoView でビデオではなく黒い画面しか表示されないという問題が発生した人はいますか? 最後に、ビデオ ファイルの準備/再生を開始する他の方法で、これらのエラーや黒い画面が発生しないようにする方法はありますか?

編集:このファイルで、警告#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
4

3 に答える 3

4

私はかつて同様の問題を抱えていましたが、コールバックでエラーが発生したときにアクティビティをリロードすることで問題を解決しました。最初は機能しましたが、その後も失敗し続け、アクティビティの無限の再起動ループが発生しました。それから私はそのような場合にビデオの代わりに写真を置くことに決めました(それは本当に重要ではありませんでした)。

試してみる価値はあります...onErrorListenerへのコールバックがない場合は、アクティビティが有効になってから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バージョンに付属しているこの特定のデバイスのコーデックにバグがあるかどうかを知ることはできません。寸法も変更してみてください。

幸運を祈ります:)

于 2012-07-19T23:16:48.000 に答える
1
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);

これを使用してビデオを実行します。問題は解決すると思います。

于 2012-07-25T09:08:41.513 に答える
0

アクティビティの再起動が機能する場合があると述べたので、 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;
}

これにより、アクティビティが再生を開始する準備が整う前にビデオがロードされた場合、リスナーは単純にブール値フラグを TRUE に設定し、onResume() はフラグが設定されたことを確認してビデオの再生を開始します。ビデオの読み込みが完了する前に onResume() が呼び出された場合、フラグが設定されるだけで、リスナーはそれを見て、その時点でビデオの再生を開始します。こうすることで、Activity の準備が整う前にビデオの再生が開始されることはなく、うまくいけば、あなたが目撃しているこの奇妙な動作を防ぐことができます。

于 2012-07-26T19:38:12.853 に答える