Exoplayer 无法播放某些音频流

Exoplayer can't play some audio streams

我开发了一些 Android 应用程序来收听 Internet 广播电台。

对于音频流,我一直在使用 Vitamio 库。不幸的是,它不再受支持并且包含与 Android 7.

的兼容性问题

经过多方尝试,我决定去ExoPlayer库。我对易用性和不断更新感到非常满意。此外,它将我的 APK 大小减小了三倍。

不幸的是,ExoPlayer 库无法播放某些音频流。我尝试过调试、更改对 URL 的调用等等。未成功。

这些是我无法使用 ExoPlayer 库播放但可以使用 Vitamio 重现的流示例:

http://42747t.lp.azioncdn.net:1935/2747t/a/mp4:access_options/rtmp-live/atl_poa.sdp/playlist.m3u8 http://192747t.lp.azioncdn.net/2747t/a/mp4:access_options/rtmp-live/gau_centro.sdp/playlist.m3u8

其中一些流对我的应用成功非常重要。

我没有访问服务器的权限。

这里是 logcat 上的内容:

04-26 21:09:20.189 27953-27953/com.eneasgesing.radios.rs E/EventLogger: playerFailed [987.08] com.google.android.exoplayer2.ExoPlaybackException at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:345) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:154) at android.os.HandlerThread.run(HandlerThread.java:61) at com.google.android.exoplayer2.util.PriorityHandlerThread.run(PriorityHandlerThread.java:40) Caused by: com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor, WavExtractor) could read the stream. at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractorHolder.selectExtractor(ExtractorMediaPeriod.java:713) at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:636) at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:295) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761)

查看您用于启动 exoplayer 的一些代码可能会有所帮助,我假设您使用的是标准 ExtractorMediaSource

.m3u8 文件实际上是播放列表、文本文件,link 到媒体文件 -- 通常用于直播。您将需要另一个 MediaSource,尝试 HLS,或 HlsMediaSource 而不是 ExtractorMediaSource

HLS 代表 HTTP 直播。

要在初始化 Exoplayer 时使用以下代码播放 .m3u8 文件:

    Handler mHandler = new Handler();

    String userAgent = Util.getUserAgent(context, "Your Application Name");

    DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory(
                    userAgent, null,
                    DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS,
                    1800000,
                    true);

    HlsMediaSource mediaSource = new HlsMediaSource(Uri.parse(mediaUrl),dataSourceFactory, 1800000,mHandler, null);

    if (mediaUrl != null) {
        videoPlayer.prepare(mediaSource);
        videoPlayer.setPlayWhenReady(true);
    }