[英]Playing audio from network on Xamarin.Forms
Is it possible to play audio on Xamarin.Forms (Android only, no iOS required) which is received from network over TCP or UDP?是否可以在通过 TCP 或 UDP 从网络接收的 Xamarin.Forms(仅限 Android,不需要 iOS)上播放音频? In WPF, I'm using NAudio and I have something like this:
在 WPF 中,我使用的是NAudio ,我有这样的东西:
// set output device
var provider = new BufferedWaveProvider(codec.RecordFormat);
outputDevice = new WaveOut();
outputDevice.DeviceNumber = 0;
outputDevice.Init(provider);
outputDevice.Play();
Data is received from TCP connection:从 TCP 连接接收数据:
if (outputDevice != null)
{
byte[] decoded = codec.Decode(data, 0, data.Length);
provider.AddSamples(decoded, 0, decoded.Length);
}
In this case, data
is byte[]
- its added to circular buffer and WaveOut handles it like stream, playing it continously.在这种情况下,
data
是byte[]
- 它被添加到循环缓冲区中,WaveOut 像流一样处理它,连续播放它。 That solution works great.该解决方案效果很好。
I need same thing in Xamarin - I guess I need some kind of wrapper around AudioTrack since it apparently supports playing from byte stream .我需要在 Xamarin 中做同样的事情 - 我想我需要某种围绕AudioTrack的包装器,因为它显然支持从字节流播放。 How should I do this, what is the "best" or preferred way?
我该怎么做,什么是“最佳”或首选方式? Basically, how to play streamed audio received over pure TCP/UDP socket?
基本上,如何播放通过纯 TCP/UDP 套接字接收的流音频?
Google's Android ExoPlayer
can stream that media format properly. Google 的 Android
ExoPlayer
可以正确地流式传输该媒体格式。
The following code is a really simple example of ExoPlayer, but it will show you that it does play that stream:以下代码是 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;
Note:笔记:
1.exoPlayer is a class-level variable of SimpleExoPlayer type; 1.exoPlayer是SimpleExoPlayer类型的类级变量;
2.this is using the Xamarin.Android binding libraries from the Xam.Plugins.Android.ExoPlayer package 2.这是使用Xam.Plugins.Android.ExoPlayer包中的 Xamarin.Android 绑定库
ExoPlayer Docs: ExoPlayer 文档:
https://developer.android.com/guide/topics/media/exoplayer https://developer.android.com/guide/topics/media/exoplayer
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.