Воспроизведите локальный файл m3u8 на Android-дисплее, показывая, что setDataSourceFD не удалось: status = 0x80000000

Я пытаюсь воспроизвести локальный файл m3u8, который хранится в моей sdcard, используя класс mediaplayer для Android. Файл m3u8 и .ts находятся в одном каталоге. Сторонние игроки, такие как MXPlayer, присоединяются к файлам ts и воспроизводят видео, когда я открываю m3u8. Но использование класса mediaplayer для андроидов вызывает следующую ошибку:

Не удалось создать ошибку медиаплеера: сбой setDataSourceFD: status = 0x80000000 java.io.IOException: setDataSourceFD failed: status = 0x80000000 на android.media.MediaPlayer.setDataSource (собственный метод) на android.media.MediaPlayer.setDataSource (MediaPlayer .java: 1204) на com.tcs.hlsvideo.StreamingPlayer.playVideo (StreamingPlayer.java:87) в com.tcs.hlsvideo.StreamingPlayer.surfaceCreated (StreamingPlayer.java:148) в android.view.SurfaceView.updateWindow (SurfaceView. Java: 609) на 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.performTraversals (ViewRootImpl.java:1981) на android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1143) на android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:4667) на android .view.Choreographer $ CallbackRecord.run (Хореограф.ява: 725) на android.view.Choreographer.doCa Llbacks (Хореограф.java:555) на android.view.Choreographer.doFrame (Хореограф.java:525) на android.view.Choreographer $ FrameDisplayEventReceiver.run (Хореограф.java:711) на android.os.Handler.handleCallback (Handler .java: 615) на android.os.Handler.dispatchMessage (Handler.java:92) на android.os.Looper.loop (Looper.java:137) на android.app.ActivityThread.main (ActivityThread.java:4960) В java.lang.reflect.Method.invokeNative (Native Method) в java.lang.reflect.Method.invoke (Method.java:511) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java: 1038) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:805) в dalvik.system.NativeStart.main (Native Method) setDataSourceFD failed: 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(); } 

Помогите мне здесь, ребята … `

    Я не уверен, но похоже, что файл M3U8 не является медиа-файлом. Это формат файла списка воспроизведения. Это означает, что вам нужно разобрать его, получить от него пути из медиафайлов и воспроизвести один из файлов, которые у вас есть.

    Вот краткое описание того, как формат выглядит как http://www.gravlab.com/2013/07/05/what-is-an-m3u8-file/ .

    Чтобы узнать, как его разобрать, посмотрите на этот ответ: Анализ HLS m3u8 с использованием регулярных выражений

    Intereting Posts
    Android Native Video Player с субтитрами Как изменить язык Google Map V2 android Как получить значение ресурса в build.gradle? Как работают оверлеи на базе Android? Android: добавление кнопки в пользовательскую строку заголовка Как центрировать текст и изображения в CompoundDrawable? Можете ли вы безопасно называть «getDrawable» или «decodeResource» в потоке пользовательского интерфейса в Android Нет хранилища, найденного в Crashlytics install for eclipse Как я могу получить номер строки, где исключение было выбрано с помощью Thread.UncaughtExceptionHandler? Обнаружение отсутствия задней камеры Android Oauth Exception с подключением SMTP Transport, с версией Android 2.3. ListView переключает элемент между отмеченными и не отмеченными – Android Как запустить PopupWindow или Dialog из службы метода ввода? BroadcastReceiver пытается вернуть результат во время не упорядоченной передачи – PACKAGE_ADDED в Android «Страница не найдена», когда пользователь нажимает на приглашение Facebook из моего приложения