使用xamarin MediaPlayer播放音频网址

Jos*_*eph 2 c# android audio-streaming xamarin.android xamarin

为什么xamarin MediaPlayer(在Xamarin.Android上)可以像这样的链接播放音频(mediaUrl1):https://ia800806.us.archive.org/15/items/Mp3Playlist_555/AaronNeville-CrazyLove.mp3

但不能通过这样的链接(mediaUrl2)来实现:http://api-streaming.youscribe.com/v1/products/2919465/documents/3214936/audio/stream

private MediaPlayer player;
//..
player = new MediaPlayer();
player.SetAudioStreamType(Stream.Music);
//..
await player.SetDataSourceAsync(ApplicationContext, Android.Net.Uri.Parse(mediaUrl));
//..
player.PrepareAsync();
//..
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有(当然)首先下载文件的情况下播放上面的链接(mediaUrl2)?

这是我正在使用的样本的完整来源.任何帮助,将不胜感激.

Sus*_*ver 5

http://api-streaming.youscribe.com/v1/products/2919465/documents/3214936/audio/stream

这是一个HTTP mpga流,并不是我所知道的任何Android API直接支持,因此不受支持MediaPlayer(请参阅Android支持媒体格式以供进一步阅读).

您可以查看代码的logcat输出,您MediaPlayer将看到如下输出:

[MediaPlayerNative] start called in state 4, mPlayer(0x8efb7240)
[MediaPlayerNative] error (-38, 0)
[MediaPlayer] Error (-38,0)
[MediaHTTPConnection] readAt 1161613 / 32768 => java.net.ProtocolException
[MediaHTTPConnection] readAt 1161613 / 32768 => java.net.ProtocolException
[MediaPlayerNative] error (1, -2147483648)
[MediaPlayer] Error (1,-2147483648)
Run Code Online (Sandbox Code Playgroud)

谷歌的Android ExoPlayer可以正确地传输该媒体格式.

这是一个非常简单且非常粗糙的ExoPlayer示例,但它会告诉您它确实播放了该流:

ExoPlayer示例:

var mediaUrl = "http://api-streaming.youscribe.com/v1/products/2919465/documents/3214936/audio/stream";
var mediaUri = Android.Net.Uri.Parse(mediaUrl);

var userAgent = Util.GetUserAgent(this, "ExoPlayerDemo");
var defaultHttpDataSourceFactory = new DefaultHttpDataSourceFactory(userAgent);
var defaultDataSourceFactory = new DefaultDataSourceFactory(this, null, defaultHttpDataSourceFactory);
var extractorMediaSource = new ExtractorMediaSource(mediaUri, defaultDataSourceFactory, new DefaultExtractorsFactory(), null, null);
var defaultBandwidthMeter = new DefaultBandwidthMeter();
var adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory(defaultBandwidthMeter);
var defaultTrackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory);

exoPlayer = ExoPlayerFactory.NewSimpleInstance(this, defaultTrackSelector);
exoPlayer.Prepare(extractorMediaSource);
exoPlayer.PlayWhenReady = true;
Run Code Online (Sandbox Code Playgroud)

注意:exoPlayerSimpleExoPlayer类型的类级变量

注意:这是使用包中的Xamarin.Android绑定库Xam.Plugins.Android.ExoPlayer

ExoPlayer文档: