2012-05-30 58 views
0

聲音丟失我有一個應用程序的源代碼播放.mp4,我必須使它與HLS一起使用。m3u8由於seekTo()

視頻和聲音的播放,但我有2個問題,只可以使用.m3u8:

1)當seekTo()被激活(評論刪除)的聲音被禁止,當我要退出播放器,它需要很長時間才能完成,並且會導致應用程序崩潰。

2)setLooping不工作,返回錯誤(-38,0),嘗試在錯誤的

state: mPlayer=0x1e0380, mCurrentState=0

注意執行seekTo:這些問題都只是.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(); 
    } 
} 

日誌時setLooping被的setDataSource下活化():

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 

回答

0

你需要檢查它是否是當前案例。如果是,則可能無法使用循環和搜索。

+0

好的,我發現這個問題。 當使用seekTo()與.m3u8文件和括號之間的值被設置爲0,這是行不通的,所以我說的條件成playBackVideo()方法: '如果(mResumePosition> 0) \t mMediaPlayer.seekTo(mResumePosition);' 因此,mResumePosition永遠不會設置爲0,並在文件的開頭播放。我解決了setLooping()問題,在'public void onCompletion(final MediaPlayer mediaPlayer)'我添加了'mMediaPlayer.release(); playVideo();'和循環工作得很好! – broadpeak

2

好吧,我發現這個問題。當您使用seekTo()與.m3u8文件和括號內的值設置爲0,這是行不通的,所以我增加了一個條件爲playBackVideo()方法:

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

所以mResumePosition會永遠不要設置爲0,並在文件的開頭播放。另外,我解決了setLooping()的問題,在

public void onCompletion(final MediaPlayer mediaPlayer)

我加mMediaPlayer.release(); playVideo();

和循環效果非常好!