Exoplayer-MKV视频无法播放

时间:2020-08-07 14:09:43

标签: android xml exoplayer

我已将Exoplayer集成到我的一个Android应用程序中,可以播放所有类型的视频,但是.mkv视频无法播放。我所拥有的所有URL都有2种不同的例外。

这是我正在使用的代码段:

    private void initializePlayer() {

    TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
    trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
    player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
    mPlayerView.setPlayer(player);

    player.setPlayWhenReady(shouldAutoPlay);
    player.addAnalyticsListener(this);

    MediaSource mediaSource = buildMediaSource(Uri.parse(getIntent().getStringExtra(KEY_URL)));

    boolean haveStartPosition = currentWindow != C.INDEX_UNSET;
    if (haveStartPosition) {
        player.seekTo(currentWindow, playbackPosition);
    }

    player.seekTo(getResumePosition());
    Logger.d(TAG, "mResumePosition >> " + getResumePosition());
    player.prepare(mediaSource, !haveStartPosition, false);
    
}


    private MediaSource buildMediaSource(Uri uri) {

    String userAgent = Util.getUserAgent(this, getString(R.string.app_name));

    if (uri.getLastPathSegment().contains("mp3") || uri.getLastPathSegment().contains("mp4")) {
        return new ExtractorMediaSource.Factory(new DefaultHttpDataSourceFactory(userAgent))
                .createMediaSource(uri);
    } else if (uri.getLastPathSegment().contains("m3u8")) {
        return new HlsMediaSource.Factory(new DefaultHttpDataSourceFactory(userAgent))
                .createMediaSource(uri);
    } else if (uri.getLastPathSegment().contains("mpd")) {
        DashMediaSource mediaSource = new DashMediaSource.Factory(
                new DefaultDashChunkSource.Factory(mediaDataSourceFactory),
                buildDataSourceFactory(true))
                .setManifestParser(
                        new FilteringManifestParser<>(
                                new DashManifestParser(), null))
                .createMediaSource(uri);
        return mediaSource;
    } else {
        DashChunkSource.Factory dashChunkSourceFactory = new DefaultDashChunkSource.Factory(
                new DefaultHttpDataSourceFactory("ua", new DefaultBandwidthMeter()));
        DataSource.Factory manifestDataSourceFactory = new DefaultHttpDataSourceFactory(userAgent);
        return new DashMediaSource.Factory(dashChunkSourceFactory, manifestDataSourceFactory).
                createMediaSource(uri);
    }
}

视频URL:http://tivixtv.net:80/movie/Qquzu5/MBGaYNMY4Q/75988.mkv

我得到的异常:

2020-08-07 19:17:54.867 5721-6862/com.zeenews.tv E/ExoPlayerImplInternal: Source error
  com.google.android.exoplayer2.ParserException: org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT Eߣ������������#B��...@1:98 in java.io.InputStreamReader@5dd061d) 
    at com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.parse(DashManifestParser.java:96)
    at com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.parse(DashManifestParser.java:61)
    at com.google.android.exoplayer2.upstream.ParsingLoadable.load(ParsingLoadable.java:172)
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:415)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)
 Caused by: org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT Eߣ������������#B��...@1:98 in java.io.InputStreamReader@5dd061d) 
    at org.kxml2.io.KXmlParser.next(KXmlParser.java:432)
    at org.kxml2.io.KXmlParser.next(KXmlParser.java:313)
    at com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.parse(DashManifestParser.java:89)
    at com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.parse(DashManifestParser.java:61) 
    at com.google.android.exoplayer2.upstream.ParsingLoadable.load(ParsingLoadable.java:172) 
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:415) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
    at java.lang.Thread.run(Thread.java:764) 

视频网址:http://tivixtv.net:80/movie/Qquzu5/MBGaYNMY4Q/88512.mkv

我得到的异常:

2020-08-07 19:51:54.515 7989-8627/com.zeenews.tv E/ExoPlayerImplInternal: Source error
  com.google.android.exoplayer2.ParserException: org.xmlpull.v1.XmlPullParserException: unterminated entity ref (position:TEXT @2:2937 in java.io.InputStreamReader@265ea06) 
    at com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.parse(DashManifestParser.java:96)
    at com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.parse(DashManifestParser.java:61)
    at com.google.android.exoplayer2.upstream.ParsingLoadable.load(ParsingLoadable.java:172)
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:415)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)
 Caused by: org.xmlpull.v1.XmlPullParserException: unterminated entity ref (position:TEXT @2:2937 in java.io.InputStreamReader@265ea06) 
    at org.kxml2.io.KXmlParser.readEntity(KXmlParser.java:1220)
    at org.kxml2.io.KXmlParser.readValue(KXmlParser.java:1402)
    at org.kxml2.io.KXmlParser.next(KXmlParser.java:393)
    at org.kxml2.io.KxmlParser.next(KXmlParser.java:313)
    at com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.parse(DashManifestParser.java:89)
    at com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.parse(DashManifestParser.java:61) 
    at com.google.android.exoplayer2.upstream.ParsingLoadable.load(ParsingLoadable.java:172) 
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:415) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
    at java.lang.Thread.run(Thread.java:764) 

如果有人可以帮助我,将不胜感激。

1 个答案:

答案 0 :(得分:0)

我从GitHub帖子中获得了以下答案:

https://github.com/google/ExoPlayer/issues/7725

我的代码试图使用DashMediaSource播放Matroska文件,但该文件应使用 ProgressiveMediaSource (或等效地为 ExtractorMediaSource ,尽管该类已弃用)。

这是更新的 buildMediaSource()代码,用于播放.mkv文件:

    private MediaSource buildMediaSource(Uri uri) {

    String userAgent = Util.getUserAgent(this, getString(R.string.app_name));

    if (uri.getLastPathSegment().contains("mp3") || uri.getLastPathSegment().contains("mp4") || uri.getLastPathSegment().contains("mkv")) {
        return new ExtractorMediaSource.Factory(new DefaultHttpDataSourceFactory(userAgent))
                .createMediaSource(uri);
    } else if (uri.getLastPathSegment().contains("m3u8")) {
        return new HlsMediaSource.Factory(new DefaultHttpDataSourceFactory(userAgent))
                .createMediaSource(uri);
    } else if (uri.getLastPathSegment().contains("mpd")) {
        DashMediaSource mediaSource = new DashMediaSource.Factory(
                new DefaultDashChunkSource.Factory(mediaDataSourceFactory),
                buildDataSourceFactory(true))
                .setManifestParser(
                        new FilteringManifestParser<>(
                                new DashManifestParser(), null))
                .createMediaSource(uri);
        return mediaSource;
    } else {
        DashChunkSource.Factory dashChunkSourceFactory = new DefaultDashChunkSource.Factory(
                new DefaultHttpDataSourceFactory("ua", new DefaultBandwidthMeter()));
        DataSource.Factory manifestDataSourceFactory = new DefaultHttpDataSourceFactory(userAgent);
        return new DashMediaSource.Factory(dashChunkSourceFactory, manifestDataSourceFactory).
                createMediaSource(uri);
    }
}