简体   繁体   English

在 Xamarin.Forms 上播放来自网络的音频

[英]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.在这种情况下, databyte[] - 它被添加到循环缓冲区中,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM