如何阻止 MediaPlayer 每次启动?
How to stop MediaPlayer from starting each time?
我将如何修复接收字节的 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
如何让它连续播放,但每次都只播放新的部分?
这是逻辑问题。本质上,您是将块写入流,然后播放该块,然后在不重置流的情况下写入更多内容,然后从该流的开头播放。
您需要它做的是将一个块写入您的流,播放该流,然后将一个新块写入该流并播放该流。
- Move your
Java.IO.FileOutputStream fos = new Java.IO.FileOutputStream(temp);
inside of your outer while()
loop.
这样做的原因是您正在写入 fos
然后播放,然后再次写入但不处理您的初始缓冲区数据。将 fos
移动到您的 while 循环中会强制创建一个包含新缓冲区数据的新对象,然后它将播放该数据。由于循环和必须重新加载要播放的新数据,音频跳过会出现问题。
要更正跳过,您需要在播放缓冲区时异步加载它。您可以使用单独的线程执行此操作。您可能需要调整缓冲区大小或设置缓冲区条件。 MediaPlayer
包含可能有帮助的 BufferingProgress
属性。
我将如何修复接收字节的 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
如何让它连续播放,但每次都只播放新的部分?
这是逻辑问题。本质上,您是将块写入流,然后播放该块,然后在不重置流的情况下写入更多内容,然后从该流的开头播放。
您需要它做的是将一个块写入您的流,播放该流,然后将一个新块写入该流并播放该流。
- Move your
Java.IO.FileOutputStream fos = new Java.IO.FileOutputStream(temp);
inside of your outerwhile()
loop.
这样做的原因是您正在写入 fos
然后播放,然后再次写入但不处理您的初始缓冲区数据。将 fos
移动到您的 while 循环中会强制创建一个包含新缓冲区数据的新对象,然后它将播放该数据。由于循环和必须重新加载要播放的新数据,音频跳过会出现问题。
要更正跳过,您需要在播放缓冲区时异步加载它。您可以使用单独的线程执行此操作。您可能需要调整缓冲区大小或设置缓冲区条件。 MediaPlayer
包含可能有帮助的 BufferingProgress
属性。