2

我无法让播放器播放所有 m3u8 播放列表。没有任何问题,播放 mp4 文件的直接链接。我设法找到的只有 1-2 个可以播放的 m3u8 文件(其中一个是:http: //qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8)。但所有其他 m3u8 播放列表都不起作用。例如:这个播放列表http://62.6.220.50:8000/playlist.m3u8在浏览器中播放没有问题,但在 Android Studio 中会产生错误:

«Can’t play this video»

并在日志中出现以下错误:

«E/MediaPlayer: error (1, -1007)   D/VideoView: Error: 1,-1007». 

我究竟做错了什么?我怎样才能让播放器可以毫无问题地播放 m3u8 文件。也许我必须预先解析这个播放列表,然后才播放它。请告诉我,我该如何解决这个问题。这是我的代码:

显现:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

ACTIVITY_MAIN:

<VideoView
    android:id="@+id/myVideoView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:visibility="visible"
    tools:layout_editor_absoluteY="0dp"
    tools:layout_editor_absoluteX="-315dp" />

主要活动:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.net.URL;
import android.net.Uri;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;

public class MainActivity extends AppCompatActivity {
    private String urlStream;
    private VideoView myVideoView;
    private URL url;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myVideoView = (VideoView)this.findViewById(R.id.myVideoView);
        MediaController mc = new MediaController(this);
        myVideoView.setMediaController(mc);
        urlStream = "http://62.6.220.50:8000/playlist.m3u8";
        //urlStream = "http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8";
        //urlStream = "https://archive.org/download/ksnn_compilation_master_the_internet/ksnn_compilation_master_the_internet_512kb.mp4";

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                myVideoView.setVideoURI(Uri.parse(urlStream));
            }
        });
    }
}
4

1 回答 1

0

Android 在历史上一直存在 HLS 流问题 - 我认为可以公平地说 ExoPlayer 仍然是播放 HLS 的一种更可靠的方式:

如果您查看上面链接的当前开发人员指南,它提供了一些 HLS 功能的示例,这些功能超出了常规内置 MediaPlayer 的支持:

  • 支持高级 HLS 功能,例如正确处理 #EXT-X-DISCONTINUITY 标记。
于 2017-10-19T10:27:29.417 回答