【问题标题】:Exoplayer can't play only audio for HLSExoplayer 不能只播放 HLS 的音频
【发布时间】:2021-03-18 08:30:36
【问题描述】:

我只有链接音频https://storage.googleapis.com/as-piepme/1465/livestream/1465.fef238cdc9d9eb0b958d4eb23080e28b/index.m3u8 但 Exoplayer 无法在链接上方播放, 它返回“源错误”。但是 IOS 和 Chrome 都运行良好。我的代码:

SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build();
player.setMediaItem(MediaItem.fromUri(Uri.parse(linkPlay)));
player.prepare();
player.setPlayWhenReady(true);

更新我的解决方案:

MediaItem mediaItem = new MediaItem.Builder()
                        .setUri(Uri.parse("https://storage.googleapis.com/as-piepme/1465/livestream/1465.fef238cdc9d9eb0b958d4eb23080e28b/index.m3u8"))
                        .build();
                DefaultHlsExtractorFactory defaultHlsExtractorFactory = new DefaultHlsExtractorFactory(DefaultTsPayloadReaderFactory.FLAG_IGNORE_H264_STREAM, false);
                MediaSource mediaSource = new HlsMediaSource.Factory(new DefaultHlsDataSourceFactory(new DefaultDataSourceFactory(context)))
                        .setExtractorFactory(defaultHlsExtractorFactory)
                        .setAllowChunklessPreparation(true)
                        .createMediaSource(mediaItem);
                player.setMediaSource(mediaSource);

【问题讨论】:

  • 提供 logcat 详细信息并显示您的代码。
  • com.google.android.exoplayer2.ExoPlaybackException:在 com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:579) 在 android.os.Handler.dispatchMessage(Handler. java:102) 原因:com.google.android.exoplayer2.ParserException: 在准备完成之前加载完成。
  • 你的代码呢?尤其是 MediaSource 之一。

标签: android exoplayer


【解决方案1】:

您需要使用媒体源。

试试这个示例代码。

DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory();
// Create a HLS media source pointing to a playlist uri.
HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory)
        .createMediaSource(MediaItem.fromUri(hlsUri));
// Create a player instance.
SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(hlsMediaSource);
// Prepare the player.
player.prepare();

更多详情请查看documentation

更新 使用这个。

        DefaultTrackSelector trackSelector = new DefaultTrackSelector(this, new AdaptiveTrackSelection.Factory());
        DefaultTrackSelector.Parameters trackSelectorParameters = trackSelector.buildUponParameters().setMaxAudioChannelCount(0).build();
        trackSelector.setParameters(trackSelectorParameters);
        RenderersFactory renderersFactory = new DefaultRenderersFactory(this);
        SimpleExoPlayer audioPlayer = = new SimpleExoPlayer.Builder(this, renderersFactory).setTrackSelector(trackSelector).build();
        HttpDataSource.Factory factory = new DefaultHttpDataSourceFactory("Online Audio Player", DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS, DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS, true);
        audioPlayer.setMediaSource(new ProgressiveMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri("https://storage.googleapis.com/as-piepme/1465/livestream/1465.fef238cdc9d9eb0b958d4eb23080e28b/index.m3u8")));
        audioPlayer.prepare();
        audioPlayer.setPlayWhenReady(true);

【讨论】:

  • 我尝试了您的代码,但它不起作用,我在 Exoplayer Demo 中进行了测试,它显示相同的错误。我使用 ffprobe 并看到我的链接包含视频信息(我不将视频流式传输到链接)。
  • 我的所有其他链接都可以正常工作(视频+音频),但只有音频不起作用。我使用库流音频github.com/pedroSG94/rtmp-rtsp-stream-client-java。我在 JWplayer 测试器中的音频链接播放正常。我不知道为什么。
  • 感谢您的帮助。我找到了解决方案,播放音频时忽略 H264
  • 想解释一下吗?更新后的代码播放在线广播。
  • 更新的原因是什么?我在 ExoPlayer v2.14.2 上以与原始答案相同的方式使用 HlsMediaSource 看到了与 OP 类似的问题。
猜你喜欢
  • 1970-01-01
  • 2015-01-20
  • 2017-02-18
  • 2012-11-20
  • 2021-10-27
  • 1970-01-01
  • 2020-05-15
  • 2020-02-29
  • 1970-01-01
相关资源
最近更新 更多