C# 如何在访问内存流时轮询该内存流?
我正在尝试建立一个应用程序,流音乐到另一个应用程序。接收方读取字节,然后将其保存到临时文件中,并播放该临时文件。但是在歌曲的不同部分之间,有一个小的延迟(当一部分开始时,下一部分被保存)。我已经在后台任务中找到了玩家。因此,我想尝试在播放器读取所述文件时将流写入该文件。所有这些都是通过蓝牙连接完成的C# 如何在访问内存流时轮询该内存流?,c#,xamarin.forms,stream,memorystream,C#,Xamarin.forms,Stream,Memorystream,我正在尝试建立一个应用程序,流音乐到另一个应用程序。接收方读取字节,然后将其保存到临时文件中,并播放该临时文件。但是在歌曲的不同部分之间,有一个小的延迟(当一部分开始时,下一部分被保存)。我已经在后台任务中找到了玩家。因此,我想尝试在播放器读取所述文件时将流写入该文件。所有这些都是通过蓝牙连接完成的 System.Threading.Tasks.Task.Run(() => { Java.IO.File temp = Java.IO.File.CreateTempFile("tem
System.Threading.Tasks.Task.Run(() =>
{
Java.IO.File temp = Java.IO.File.CreateTempFile("temp", "mp3");
Java.IO.FileInputStream fis = new Java.IO.FileInputStream(temp);
temp.DeleteOnExit();
MediaPlayer player;
while (true)
{
try
{
byte[] myReadBuffer = new byte[10000];
Java.IO.FileOutputStream fos = new Java.IO.FileOutputStream(temp);
mmInStream.Read(myReadBuffer, 0, myReadBuffer.Length);
fos.Write(myReadBuffer, 0, myReadBuffer.Length);
player = new MediaPlayer();
player.SetDataSource(fis.FD);
player.Prepare();
player.Start();
while (true)
{
if (!player.IsPlaying)
{
player.Release();
break;
}
}
}
catch (System.IO.IOException ex)
{
System.Diagnostics.Debug.WriteLine("Input stream was disconnected", ex);
}
}
}).ConfigureAwait(false);
因此,mmInStream是一个System.IO.Stream。第二个while循环检查是否播放了块,以释放资源。这是在Xamarin.Forms中完成的
如果在循环之前定义它,则会出现以下异常:
Java.IO.File temp = Java.IO.File.CreateTempFile("temp", "mp3");
Java.IO.FileInputStream fis = new Java.IO.FileInputStream(temp);
temp.DeleteOnExit();
MediaPlayer player = new MediaPlayer();
while (true)
{
try
{
byte[] myReadBuffer = new byte[10000];
Java.IO.FileOutputStream fos = new Java.IO.FileOutputStream(temp);
mmInStream.Read(myReadBuffer, 0, myReadBuffer.Length);
fos.Write(myReadBuffer, 0, myReadBuffer.Length);
player.SetDataSource(fis.FD);
player.Prepare();
player.Start();
while (true)
{
if (!player.IsPlaying)
{
player.Stop();
player.Reset();
break;
}
}
}
catch (System.IO.IOException ex)
{
System.Diagnostics.Debug.WriteLine("Input stream was disconnected", ex);
}
}
将MediaPlayer放在外面,使用if-santance检查并停止,然后重置,它可以工作,但仍然会得到短暂的暂停。确实停止以向上投票。祝你好运得到你的答案!为什么你要创建一个新的MediaPlayer,然后用很长时间来编写/启动播放器?@jdweng我想这就是他想要弄明白的。他希望能够在播放当前缓冲的数据时,同时将数据加载到媒体播放器。现在,它在每次迭代、循环中都会跳过。由于MediaPlayer正在缓冲数据,所以写入速度非常快。不需要所有额外的代码。一个简单的设计思想是将数据存储在临时“文件”中,而不是存储在临时“文件”中,比如说,存储在连续编号的临时“文件”中。编写器进程每次都会创建一个新文件。。。锁定文件以确保读取器不能过早打开它。同时,读取器锁定、播放、丢弃文件,然后尝试锁定、播放和丢弃下一个文件。(如果读卡器在那里找不到文件,您需要单独决定这意味着什么。存在各种竞争条件的可能性。)