当前位置: 首页 > 知识库问答 >
问题:

在android上播放本地m3u8文件,显示setDataSourceFD失败。

鲁英卫
2023-03-14

我正在尝试使用android mediaplayer类播放存储在SD卡中的本地m3u8文件。m3u8文件和。ts文件位于同一目录中。第三方播放器(如MXPlayer)加入ts文件,并在我从中打开m3u8时播放视频。但是使用android mediaplayer类会引发以下错误`

无法创建媒体播放器错误:setDataSourceFD失败:状态=0x8000000 java。木卫一。IOException:setDataSourceFD失败:android上的状态=0x8000000。媒体媒体播放器。android上的setDataSource(本机方法)。媒体媒体播放器。com上的setDataSource(MediaPlayer.java:1204)。tcs。hlsvideo。流媒体播放器。在com上播放视频(StreamingPlayer.java:87)。tcs。hlsvideo。流媒体播放器。surfaceCreated(StreamingPlayer.java:148)在android上创建。看法SurfaceView。在android上更新Windows(SurfaceView.java:609)。看法SurfaceView。在android上访问$000(SurfaceView.java:86)。看法SurfaceView 3美元。android上的onPreDraw(SurfaceView.java:178)。看法ViewTreeObserver。android上的dispatchOnPreDraw(ViewTreeObserver.java:707)。看法ViewRootImpl。android上的performTraversals(ViewRootImpl.java:1981)。看法ViewRootImpl。android上的doTraversal(ViewRootImpl.java:1143)。看法ViewRootImpl$TraversalRunnable。在android上运行(ViewRootImpl.java:4667)。看法编舞$CallbackRecord。在android上运行(Choreographer.java:725)。看法编舞android上的doCallbacks(Choreographer.java:555)。看法编舞android上的doFrame(Choreographer.java:525)。看法Choreographer$FrameDisplayEventReceiver。在android上运行(Choreographer.java:711)。操作系统。处理程序。android上的handleCallback(Handler.java:615)。操作系统。处理程序。android上的dispatchMessage(Handler.java:92)。操作系统。活套。android上的loop(Looper.java:137)。应用程序。活动线程。java上的main(ActivityThread.java:4960)。朗。反思。方法java上的invokenactive(本机方法)。朗。反思。方法在com上调用(Method.java:511)。Android内部的操作系统。ZygoteInit$MethodandArgscaler。在com上运行(ZygoteInit.java:1038)。Android内部的操作系统。合子体。dalvik的main(ZygoteInit.java:805)。系统原生艺术。主(本机方法)setDataSourceFD失败:状态=0x8000000

我使用的代码是

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

帮帮我伙计们...'

共有1个答案

曾嘉福
2023-03-14

我不确定,但看起来M3U8文件不是媒体文件。它是一种播放列表文件格式。这意味着您必须解析它,从中获取媒体文件的路径,并播放其中一个文件。

下面是该格式的简短描述http://www.gravlab.com/2013/07/05/what-is-an-m3u8-file/.

要了解如何解析它,请查看以下答案:使用正则表达式解析HLS m3u8文件

 类似资料:
  • 我想使用MediaPlayer/MediaView在我的JavaFX应用程序中显示web cam的实时流。我尝试使用ffmpeg录制HLS并播放生成的m3u8文件,但这会引发以下异常(VLC播放视频时没有问题): 我调试了播放器的创建,当。此本机方法返回错误代码,javafx将其映射到。 我使用以下ffmpeg命令录制视频: 我非常确定编码符合javafx的要求,因为如果我将输出容器从m3u8更改

  • 当我尝试在华硕padfone(http://www.asus.com/Mobile/PadFone/)上播放HLS m3u8文件(http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8)时,它显示一个没有视频或音频的黑屏。logcat中没有错误报告。 华硕padfone上安装的操作系统是Android 4.0.3。 我使用的代

  • 我正在尝试从谷歌的VRVideoView示例中播放m3u8 URLhttps://developers.google.com/vr/android/samples/vrview.它与mp4或flv配合得很好,但我在尝试m3u8时出现以下错误: ooper.loopE/VrVideoPlayer内部:ooper.java:154PlayerErrorandroid.os.ExoPlaybackExc

  • 我正在开发一个推荐服装的网站。所以,我希望客户把他们的形象,这是在他们的地方。 首先,我尝试了。但不提供自定义选项。我必须用我的照片显示按钮。因此,我尝试了按钮选项,并编写了这样的代码。 null null

  • 我有比赛的要求。Android设备上的m3u8视频url我正在尝试执行以下代码,但它不工作,我得到的视频无法播放? 有人能帮忙吗? 源代码: 注: 我在Android 3.0上关注了这个链接HLS(http直播)并寻找

  • 我正在尝试使用HTTP直播(HLS)将视频流传输到我的电脑和iPhone。在阅读了苹果的“HTTP直播概述”以及“为iPhone和iPad创建和部署HTTP直播媒体的最佳实践”之后,我有点卡住了。 我获取了我的源文件(一个mkv),并使用ffmpeg对文件进行编码,采用MPEG-TS格式、苹果推荐的设置和基准3.0配置文件: 不用担心。我使用预编译的分段工具来分割视频并构建一个. m3u8播放列表