0

.mp4を再生するアプリのソース コードがあり、それを HLS で動作させる必要があります。

ビデオとサウンドは再生されますが、.m3u8 のみに 2 つの問題があります。

1) seekTo()を有効にすると (コメントが削除されると) サウンドが無効になり、プレーヤーを終了したいときに時間がかかり、アプリがクラッシュします。

2) setLooping が機能せず、Error (-38,0)を返します。seekTo を間違って実行しようとしています

state: mPlayer=0x1e0380, mCurrentState=0

注: これらの問題は .M3U8 だけのものです。

プレーヤーのコードの下:

private void playVideo() {
    doCleanUp();
    try {
        // Create a new media player and set the listeners

        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setDataSource(mFilePath);
        mMediaPlayer.setDisplay(mSurfaceHolder);       
        mMediaPlayer.prepare(); 
        mMediaPlayer.start();
        mMediaPlayer.setOnCompletionListener(this);
        mMediaPlayer.setOnVideoSizeChangedListener(this);
        mMediaPlayer.setOnPreparedListener(this);
        //mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
        //mMediaPlayer.seekTo(mResumePosition);
        //mMediaPlayer.setLooping(true);


    } catch (Exception e) {
        Log.e(LOG_TAG, "error: " + e.getMessage(), e);
        showErrorMessage(mErrorPlayingVideo);
        // Toast.makeText(this, "Impossible de jouer la vidéo",
        // 5000).show();
    }
}

setDataSource() で setLooping がアクティブ化されたときのログ:

error (-38, 0)
prepareAsync called in wrong state 0
prepareAsync_l return error =-38
error: null
java.lang.IllegalStateException
at android.media.MediaPlayer.prepare(Native Method)
at fr.niji.broadpeak.activity.BroadpeakDemoPlayer.playVideo(BroadpeakDemoPlayer.java:409)
at fr.niji.broadpeak.activity.BroadpeakDemoPlayer.onRequestFinished(BroadpeakDemoPlayer.java:585)
at fr.niji.lib.dataproxy.service.DataManager.handleResult(DataManager.java:262)
at fr.niji.lib.dataproxy.service.DataManager.onRequestFinished(DataManager.java:292)
at fr.niji.lib.dataproxy.service.ServiceHelper.handleResult(ServiceHelper.java:297)
at fr.niji.lib.dataproxy.service.ServiceHelper$EvalReceiver.onReceiveResult(ServiceHelper.java:119)
at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:43)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4126)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)

コードの下:

Attempt to perform seekTo in wrong state: mPlayer=0x1e0380, 
mCurrentState=0
error (-38, 0)
Error (-38,0)
Error (-38,0)
Attempt to perform seekTo in wrong state: mPlayer=0x1e0380, mCurrentState=0
Error (-38,0)
Error (-38,0)
Attempt to perform seekTo in wrong state: mPlayer=0x1e0380, mCurrentState=0
4

2 に答える 2

2

わかりました、問題を見つけました。.m3u8ファイルでseekTo()を使用し、括弧内の値が0に設定されている場合、それは機能しないため、playBackVideo()メソッドに条件を追加しました。

if (mResumePosition > 0) mMediaPlayer.seekTo(mResumePosition);

したがって、mResumePositionが0に設定されて、ファイルの先頭で再生されることはありません。また、setLooping()の問題を解決しました。

public void onCompletion(final MediaPlayer mediaPlayer)

追加したmMediaPlayer.release(); playVideo();

ループは非常にうまく機能します!

于 2012-05-31T08:13:28.643 に答える
0

ライブの場合かどうかを確認する必要があります。はいの場合、ループとシークが利用できない可能性があります。

于 2012-05-30T09:56:49.087 に答える