Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在访问内存流时轮询该内存流?_C#_Xamarin.forms_Stream_Memorystream - Fatal编程技术网

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正在缓冲数据,所以写入速度非常快。不需要所有额外的代码。一个简单的设计思想是将数据存储在临时“文件”中,而不是存储在临时“文件”中,比如说,存储在连续编号的临时“文件”中。编写器进程每次都会创建一个新文件。。。锁定文件以确保读取器不能过早打开它。同时,读取器锁定、播放、丢弃文件,然后尝试锁定、播放和丢弃下一个文件。(如果读卡器在那里找不到文件,您需要单独决定这意味着什么。存在各种竞争条件的可能性。)