2013-11-23 15 views
10

Tôi đang cố gắng phát tệp m3u8 cục bộ được lưu trữ trong sdcard của tôi bằng cách sử dụng lớp mediaplayer android. Tệp m3u8 và tệp .ts đều giống nhau danh mục. Người chơi bên thứ ba như MXPlayer tham gia các tệp ts và phát video khi tôi mở m3u8 từ nó. Nhưng sử dụng lớp MediaPlayer android ném error` sauPhát tệp m3u8 cục bộ trên android hiển thị setDataSourceFD không thành công .: status = 0x80000000

Unable to to create media player error: setDataSourceFD failed.: status=0x80000000 java.io.IOException: setDataSourceFD failed.: status=0x80000000 at android.media.MediaPlayer.setDataSource(Native Method) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1204) at com.tcs.hlsvideo.StreamingPlayer.playVideo(StreamingPlayer.java:87) at com.tcs.hlsvideo.StreamingPlayer.surfaceCreated(StreamingPlayer.java:148) at android.view.SurfaceView.updateWindow(SurfaceView.java:609) at android.view.SurfaceView.access$000(SurfaceView.java:86) at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:178) at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:707) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1981) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1143) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4667) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) at android.view.Choreographer.doCallbacks(Choreographer.java:555) at android.view.Choreographer.doFrame(Choreographer.java:525) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4960) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) at dalvik.system.NativeStart.main(Native Method) setDataSourceFD failed.: status=0x80000000

Mã mà tôi đã sử dụng là

private static final String TAG = StreamingPlayer.class.getSimpleName(); 

private String formatedIpAddress; 

private int mVideoWidth; 
private int mVideoHeight; 
private MediaPlayer mMediaPlayer; 
private SurfaceView mPreview; 
private SurfaceHolder holder; 
private String path; 

//private boolean mIsVideoSizeKnown = false; 
private boolean mIsVideoReadyToBePlayed = false; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mPreview = new SurfaceView(this); 
    holder = mPreview.getHolder(); 
    holder.addCallback(this); 
    setContentView(mPreview); 

    WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 
    int ipAddress = wifiManager.getConnectionInfo().getIpAddress(); 
    formatedIpAddress = String.format("%d.%d.%d.%d", (ipAddress & 0xff), 
      (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff)); 

    Log.d(TAG, formatedIpAddress); 

} 

private void playVideo() { 
    doCleanUp(); 
    try { 

     //local m3u8 file 
     path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/ts/prog_index.m3u8"; 

     if (path == "") { 
      // Tell the user to provide a media file URL. 
      Toast 
      .makeText(
        this, 
        "Please edit MediaPlayerDemo_Video Activity," 
          + " and set the path variable to your media file URL.", 
          Toast.LENGTH_LONG).show(); 
     } 

     Log.e("PATH", "Path = " + path); 
     // Create a new media player and set the listeners 
     mMediaPlayer = new MediaPlayer(); 
     //mMediaPlayer.SET 
     mMediaPlayer.setDataSource(path); 
     mMediaPlayer.setDisplay(holder); 
     mMediaPlayer.setOnBufferingUpdateListener(this); 
     mMediaPlayer.setOnPreparedListener(this); 
     mMediaPlayer.prepare(); 
     mMediaPlayer.setOnCompletionListener(this); 
     mMediaPlayer.setOnVideoSizeChangedListener(this); 
     mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    } catch (Exception e) { 
     Log.e(TAG, "error: " + e.getMessage(), e); 
     Log.e(TAG, e.getMessage()); 
    } 
} 

public void onBufferingUpdate(MediaPlayer arg0, int percent) { 
    Log.d(TAG, "onBufferingUpdate percent:" + percent); 

} 

public void onCompletion(MediaPlayer arg0) { 
    Log.d(TAG, "onCompletion called"); 
} 

public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { 
    Log.v(TAG, "onVideoSizeChanged called"); 
    if (width == 0 || height == 0) { 
     Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")"); 
     return; 
    } 
    //mIsVideoSizeKnown = true; 
    mVideoWidth = width; 
    mVideoHeight = height; 
    //&& mIsVideoSizeKnown 
    if (mIsVideoReadyToBePlayed) { 
     startVideoPlayback(); 
    } 
} 

public void onPrepared(MediaPlayer mediaplayer) { 
    Log.d(TAG, "onPrepared called"); 
    mIsVideoReadyToBePlayed = true; 
    //&& mIsVideoSizeKnown 
    if (mIsVideoReadyToBePlayed) { 
     startVideoPlayback(); 
    } 
} 

public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) { 
    Log.d(TAG, "surfaceChanged called"); 

} 

public void surfaceDestroyed(SurfaceHolder surfaceholder) { 
    Log.d(TAG, "surfaceDestroyed called"); 
} 


public void surfaceCreated(SurfaceHolder holder) { 
    Log.d(TAG, "surfaceCreated called"); 
    playVideo(); 

} 

@Override 
protected void onPause() { 
    super.onPause(); 
    releaseMediaPlayer(); 
    doCleanUp(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    releaseMediaPlayer(); 
    doCleanUp(); 

} 

private void releaseMediaPlayer() { 
    if (mMediaPlayer != null) { 
     mMediaPlayer.release(); 
     mMediaPlayer = null; 
    } 
} 

private void doCleanUp() { 
    mVideoWidth = 0; 
    mVideoHeight = 0; 
    mIsVideoReadyToBePlayed = false; 
    //mIsVideoSizeKnown = false; 
} 

private void startVideoPlayback() { 
    Log.v(TAG, "startVideoPlayback"); 
    holder.setFixedSize(mVideoWidth, mVideoHeight); 
    mMediaPlayer.start(); 
} 

Giúp tôi ra khỏi đây guys ... '

+1

bạn có nhận được giải pháp không? – Sush

+0

Tôi gặp vấn đề tương tự, bạn có thấy điều gì hữu ích không? – Alf

Trả lời

1

Tôi không chắc chắn nhưng có vẻ như tệp M3U8 không phải là tệp phương tiện. Đây là định dạng tệp danh sách phát. Nó có nghĩa là bạn phải phân tích nó, nhận được đường dẫn của các tập tin media từ nó và chơi một trong các tập tin bạn có.

Đây là mô tả ngắn về cách định dạng trông giống như http://www.gravlab.com/2013/07/05/what-is-an-m3u8-file/.

Để tìm hiểu cách phân tích cú pháp, hãy xem câu trả lời này: Parsing HLS m3u8 file using regular expressions

Các vấn đề liên quan