使用 xamarin MediaPlayer 播放音频 url
Play audio url using xamarin MediaPlayer
为什么 xamarin MediaPlayer(在 Xamarin.Android 上)可以像这样(mediaUrl1)从 link 以流的形式播放音频:
https://ia800806.us.archive.org/15/items/Mp3Playlist_555/AaronNeville-CrazyLove.mp3
但是不能像这样从 link 中做到这一点 (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();
//..
有没有办法在不先(当然)下载文件的情况下播放上面的 link (mediaUrl2)?
这是我正在使用的示例的完整 source。任何帮助将不胜感激。
http://api-streaming.youscribe.com/v1/products/2919465/documents/3214936/audio/stream
这是一个 HTTP mpga
流,不直接被我所知道的任何 Android API 支持,因此 MediaPlayer
不支持(请参阅 Android Support Media Formats 进一步阅读)。
您可以查看 MediaPlayer
代码的 logcat
输出,您会看到如下输出:
[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)
Google 的 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;
注意:exoPlayer
是SimpleExoPlayer
类型的class级变量
注意:这是使用 Xam.Plugins.Android.ExoPlayer
包中的 Xamarin.Android
绑定库
ExoPlayer 文档:
为什么 xamarin MediaPlayer(在 Xamarin.Android 上)可以像这样(mediaUrl1)从 link 以流的形式播放音频: https://ia800806.us.archive.org/15/items/Mp3Playlist_555/AaronNeville-CrazyLove.mp3
但是不能像这样从 link 中做到这一点 (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();
//..
有没有办法在不先(当然)下载文件的情况下播放上面的 link (mediaUrl2)?
这是我正在使用的示例的完整 source。任何帮助将不胜感激。
http://api-streaming.youscribe.com/v1/products/2919465/documents/3214936/audio/stream
这是一个 HTTP mpga
流,不直接被我所知道的任何 Android API 支持,因此 MediaPlayer
不支持(请参阅 Android Support Media Formats 进一步阅读)。
您可以查看 MediaPlayer
代码的 logcat
输出,您会看到如下输出:
[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)
Google 的 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;
注意:exoPlayer
是SimpleExoPlayer
类型的class级变量
注意:这是使用 Xam.Plugins.Android.ExoPlayer
包中的 Xamarin.Android
绑定库