C# 如何阻止MediaPlayer每次启动?

C# 如何阻止MediaPlayer每次启动?,c#,audio,android-mediaplayer,C#,Audio,Android Mediaplayer,我如何修复我的MediaPlayer代码,它接收字节,然后创建一个临时文件,保存输入,但是对于每个输入,播放器从一开始就启动,我希望它只是播放。这是我的代码: Java.IO.File temp = Java.IO.File.CreateTempFile("temp", "mp3"); Java.IO.FileOutputStream fos = new Java.IO.FileOutputStream(temp); Java.IO.FileInputStream fis = new Java.

我如何修复我的MediaPlayer代码,它接收字节,然后创建一个临时文件,保存输入,但是对于每个输入,播放器从一开始就启动,我希望它只是播放。这是我的代码:

Java.IO.File temp = Java.IO.File.CreateTempFile("temp", "mp3");
Java.IO.FileOutputStream fos = new Java.IO.FileOutputStream(temp);
Java.IO.FileInputStream fis = new Java.IO.FileInputStream(temp);
temp.DeleteOnExit();

MediaPlayer player = new MediaPlayer();
player.SetDataSource(fis.FD);  
// If set here, there is an error
//12-09 17:29:44.472 V/MediaPlayer( 9927): setDataSource(58, 0, 576460752303423487)
//12-09 17:29:44.472 E/MediaPlayer( 9927): Unable to to create media player

while (true)
{
    try
    {
        byte[] myReadBuffer = new byte[10000]; //Input array
        mmInStream.Read(myReadBuffer, 0, myReadBuffer.Length); //Reads the incoming array into myReadBuffer
        fos.Write(myReadBuffer, 0, myReadBuffer.Length); //Writes it into temp file

        MediaPlayer player = new MediaPlayer(); //Creates a new object
        player.SetDataSource(fis.FD);  // If here, it would just start from the start each time and add more // Sets the data source to temp file

        player.Prepare();
        player.Start();
        while (true)
        {
            // Checks if it can release resources
            if (!player.IsPlaying)
            {
                player.Release();
                break;
            }
        }
    }
    catch (System.IO.IOException ex)
    {
        System.Diagnostics.Debug.WriteLine("Input stream was disconnected", ex);
    }
} 
我正在使用Xamari表单


基本上,我得到一个字节数组,存储在一个临时文件中,然后尝试播放它们。我知道MediaPlayer在每个循环中都会被重新创建,因为在那里我定义了数据源,但是如果我把它放在循环之外,它会得到一个错误(如上所述)

例如: 这首歌开始,播放了大约2秒,然后重新开始,但现在播放了4秒,再次播放,现在播放6秒。每一次,更多的歌曲被揭示

如果它是一个字符串,它将如下所示:

123
123456
123456789

我如何让它连续播放,但每次都只播放新的部分?

这是一个逻辑问题。基本上,您将块写入流,然后播放该块,然后在不重置流的情况下写入更多块,然后从该流的开始播放

您需要它做的是向流中写入一个块,播放该流,然后向流中写入一个新块并播放该流

  • 移动
    Java.IO.FileOutputStream fos=new Java.IO.FileOutputStream(temp)外部
    while()
    循环的内部
这样做的原因是,您正在写入
fos
,然后播放,然后再次写入,但没有处理初始缓冲区数据。将
fos
移动到while循环中会强制创建一个包含新缓冲区数据的新对象,然后它将播放该对象。由于循环,将出现音频跳过问题,并且必须重新加载要播放的新数据


要更正跳过,您需要在播放缓冲区时异步加载缓冲区。您可以使用单独的线程执行此操作。您可能需要调整缓冲区大小或设置缓冲区条件
MediaPlayer
包含一个可能有用的
BufferingProgress
属性

你能提供一个你试图让它做什么的例子吗?最好是一步一步。@xTwisteDx希望这能解释这一点。我相信这与您的
myReadBuffer
设置为
[xxxx]
有关。您只需将少量数据加载到临时文件中,这很好,但您没有轮询已读入的字节。另外,您创建了两个
MediaPlayer
对象,我认为这是一个输入错误。您将希望在使用缓冲区时循环使用它们。即使这样也不够,因为如果它是本地文件,那么你可能会注意到曲目中有一个小的暂停/跳过。什么是
mmInStream
?有两个对象,所以你可以看到,如果我将对象放在循环前面,它会显示一个错误,但是如果它在其中,它会一直从Beginning开始播放。此外,我不知道你所说的“通过已读取的字节进行轮询”是什么意思。它是System.IO.Stream。