c# - 使用 xamarin MediaPlayer 播放音频 url
问题描述
为什么 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();
//..
有没有办法播放上面的链接(mediaUrl2)而不(当然)首先下载文件?
这是我正在使用的示例的完整来源。任何帮助,将不胜感激。
解决方案
http://api-streaming.youscribe.com/v1/products/2919465/documents/3214936/audio/stream
这是一个 HTTPmpga
流,我所知道的任何 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)
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
注意:这是使用包中的Xamarin.Android
绑定库Xam.Plugins.Android.ExoPlayer
ExoPlayer 文档:
推荐阅读
- python - 我可以让 for 循环运行整个范围吗?
- ios - 如何设置一个自定义端口,在 Xcode 中使用电容器运行我的混合应用程序?
- c++ - 特里树初始化
- c++ - 我正在寻找一种优雅的方法来从元组向量创建 tuple_element 向量
- c - C 模式代码:为什么这个打印 Star-Pyramid 的代码不起作用?
- java - 如何使用新方法更改属性
- c# - HTTP 400。请求标头的大小太长
- java - 无法理解这个初学者 Java ArrayList 问题
- javascript - 如何通过 By.js 传递其他参数
- c# - 使用 CSharpScript.EvaluateAsync 时,如何在 lambda 表达式中使用 II 或 &&