C# Android MediaPlayer如何处理MediaTime中断?
我正在写一个Xamarin.Android项目。我有一些来自Azure语音合成的音频。我将字节保存到一个.wav文件中,然后当我尝试将其用作MediaPlayer的数据源时,我得到了MediaTimeIntercontinuction事件。这些事件似乎导致玩家冻结。我已经四处寻找指导,但我还没有找到如何优雅地处理这些事件或如何处理音频以避免这些问题的建议。音频数据为16位单声道PCM,采样率为24000khz 以下是保存文件的代码:C# Android MediaPlayer如何处理MediaTime中断?,c#,android,xamarin,wav,C#,Android,Xamarin,Wav,我正在写一个Xamarin.Android项目。我有一些来自Azure语音合成的音频。我将字节保存到一个.wav文件中,然后当我尝试将其用作MediaPlayer的数据源时,我得到了MediaTimeIntercontinuction事件。这些事件似乎导致玩家冻结。我已经四处寻找指导,但我还没有找到如何优雅地处理这些事件或如何处理音频以避免这些问题的建议。音频数据为16位单声道PCM,采样率为24000khz 以下是保存文件的代码: soundFilePath = Android
soundFilePath = Android.OS.Environment.ExternalStorageDirectory + "/" + audio.GetHashCode() + ".wav";
var fs = File.Create(soundFilePath);
fs.Write(audio, 0, audio.Length);
fs.Flush();
fs.Close();
var attrs = new AudioAttributes.Builder()
.SetContentType(AudioContentType.Speech)
.SetLegacyStreamType(Android.Media.Stream.Music)
.SetUsage(AudioUsageKind.Media)
.Build();
var format = new AudioFormat.Builder()
.SetEncoding(Encoding.Pcm16bit)
.SetSampleRate(24000)
.SetChannelMask(ChannelOut.Mono)
.Build();
player = new MediaPlayer();
player.SetAudioAttributes(attrs);
player.SetDataSource(soundFilePath);
player.Prepared += (object sender, EventArgs args) =>
{
player.Start();
};
player.MediaTimeDiscontinuity += (object sender, MediaPlayer.MediaTimeDiscontinuityEventArgs args) =>
{
//This code isn't working
var mp = args.Mp;
mp.Pause();
mp.SeekTo((int)args.Mts.AnchorMediaTimeUs / 1000 + 1);
mp.Start();
};
player.PrepareAsync();
以下是我加载和播放文件的代码:
soundFilePath = Android.OS.Environment.ExternalStorageDirectory + "/" + audio.GetHashCode() + ".wav";
var fs = File.Create(soundFilePath);
fs.Write(audio, 0, audio.Length);
fs.Flush();
fs.Close();
var attrs = new AudioAttributes.Builder()
.SetContentType(AudioContentType.Speech)
.SetLegacyStreamType(Android.Media.Stream.Music)
.SetUsage(AudioUsageKind.Media)
.Build();
var format = new AudioFormat.Builder()
.SetEncoding(Encoding.Pcm16bit)
.SetSampleRate(24000)
.SetChannelMask(ChannelOut.Mono)
.Build();
player = new MediaPlayer();
player.SetAudioAttributes(attrs);
player.SetDataSource(soundFilePath);
player.Prepared += (object sender, EventArgs args) =>
{
player.Start();
};
player.MediaTimeDiscontinuity += (object sender, MediaPlayer.MediaTimeDiscontinuityEventArgs args) =>
{
//This code isn't working
var mp = args.Mp;
mp.Pause();
mp.SeekTo((int)args.Mts.AnchorMediaTimeUs / 1000 + 1);
mp.Start();
};
player.PrepareAsync();
.wav文件在其他播放器中播放得很好,当我在Audacity中打开这些文件时,我没有看到任何异常
编辑:忘记提到这是使用Xamarin native
另外,为了了解更多背景信息,我正在GenyMoon上使用Pixel 3配置文件运行应用程序。我也在我的物理像素2设备上试用过
编辑(2020年10月20日):这仍然是一个问题。从文档中,我发现这些事件发生在以下条件下:
当玩家急需数据而无法继续玩时当播放器遇到播放错误时
搜索操作开始和完成时
当播放速度改变时
当播放状态改变时
当播放器复位时 这绝对不是第一个或第三个选项,因为缓冲区的大小正确,而且我从不调用seek(在我的处理程序中除外)
我也不知道如何开始调试它。我在logcat或调试控制台中没有未处理的异常和错误。我测试您提供的代码。它运行良好,没有
mediatimemuncontinuation
。MediaTimeInteraction
有什么作用?如果未经处理,将导致音频完全停止播放。正如你所看到的,我试图手动向前移动曲目并尝试再次播放,但似乎不起作用。我有一些与轨迹位置相关的渲染逻辑,但在碰到其中一个不连续点后,位置不会得到更新。我在谷歌上找不到关于这个问题的任何信息。我会尽快测试并反馈。根据你的代码,没有更多关于手动移动的信息。你能提供更多关于这方面的信息吗?