在android上播放一个本地m3u8文件,显示setDataSourceFD失败:状态= 0x80000000

我正在尝试使用android mediaplayer类播放存储在我的SD卡中的本地m3u8文件。m3u8文件和.ts文件位于同一个目录中。 MXPlayer等第三方播放器join了ts文件并播放video,当我从中打开m3u8时。 但使用android mediaplayer类抛出以下错误

无法创build媒体播放器错误:setDataSourceFD失败:状态= 0x80000000 java.io.IOException:setDataSourceFD失败:状态= 0x80000000在android.media.MediaPlayer.setDataSource(本机方法)在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。在Android.view.SurfaceView.access $ 000(SurfaceView.java:86)在android.view.SurfaceView $ 3.onPreDraw(SurfaceView.java:178)在android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:707 )在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1143)的android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1981)在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:4667)在android .view.Choreographer $ CallbackRecord.run(Choreographer.java:725)at android.view.Choreographer.doCa 在Android.view.Choreographer.doFrame(Choreographer.java:525)在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:711)android.os.Handler.handleCallback(Handler .java:615)在android.app.ActivityThread.main(ActivityThread.java:4960)android.os.Looper.loop(Looper.java:137)android.os.Handler.dispatchMessage(Handler.java:92) java.lang.reflect.Method.invokeNative(Native Method)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失败:status = 0x80000000

我使用的代码是

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(); } 

帮我在这里家伙……

Solutions Collecting From Web of "在android上播放一个本地m3u8文件,显示setDataSourceFD失败:状态= 0x80000000"

我不确定,但看起来像M3U8文件不是一个媒体文件。 这是一个播放列表文件格式。 这意味着你必须parsing它,从它获得媒体文件的path,并播放你得到的文件之一。

这里是简短的描述如何格式看起来像http://www.gravlab.com/2013/07/05/what-is-an-m3u8-file/

要学习如何parsing它看看这个答案: 使用正则expression式parsingHLS m3u8文件