我开发了一些Android应用程序来收听互联网广播电台。
对于音频流,我一直在使用Vitamio库。不幸的是,它不再受支持,并且包含与Android 7的兼容性问题。
经过多次尝试,我决定去ExoPlayer库。我对它的易用性和不断更新感到非常满意。此外,它还减少了我的APK的三次大小。
不幸的是,ExoPlayer库无法播放一些音频流。我试过调试,更改对URL的调用,等等。没有成功。
这些是流的例子,我不能使用ExoPlayer库,但我可以使用Vitamio复制:
poa.sdp/playlist.m3u8 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 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 ))在android.os.HandlerThread.run(HandlerThread.java:61) at com.google.android.exoplayer2.util.PriorityHandlerThread.run(PriorityHandlerThread.java:40)原因: com.google.android.exoplayer2.source.UnrecognizedInputFormatException:没有任何可用的萃取器(MatroskaExtractor,FragmentedMp4Extractor,Mp4Extractor,Mp3Extractor,AdtsExtractor,Ac3Extractor,TsExtractor,FlvExtractor,OggExtractor,PsExtractor,WavExtractor)都能读懂溪流。在com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractorHolder.selectExtractor(ExtractorMediaPeriod.java:713) at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:636)在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)
发布于 2017-04-28 20:44:44
查看一些用于启动exoplayer的代码可能会有所帮助,我假设您使用的是标准的ExtractorMediaSource
.m3u8文件实际上是播放列表,文本文件,它链接到媒体文件-- 通常用于livestreams。您需要另一个MediaSource,尝试HLS,或者HlsMediaSource而不是ExtractorMediaSource
HLS代表HTTP流。
发布于 2020-03-13 07:36:18
要播放.m3u8文件,请在初始化Exoplayer时使用下面的代码:
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);
}https://stackoverflow.com/questions/43644730
复制相似问题