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

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

Не удалось создать ошибку медиаплеера: сбой setDataSourceFD.: status=0x80000000 java.io.IOException: сбой setDataSourceFD.: 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.Хореограф$C allbackRecord.run(Choreographer.java:725) в android.view.Choreographer.doCallbacks(Choreographer.java:555) в android.view.Choreographer.doFrame(Choreographer.java:525) в android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.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(собственный метод) в 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(собственный метод) setDataSourceFD не удалось.: статус = 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();
}

Помогите мне, ребята... `


person anz    schedule 23.11.2013    source источник
comment
ты получил решение?   -  person Sush    schedule 07.05.2014
comment
У меня такая же проблема, вы нашли что-нибудь полезное?   -  person Micky    schedule 11.08.2014


Ответы (1)


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

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

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

person Dmytro    schedule 20.11.2014