我正在构建一个实时处理音频的Xamarin.Android应用,因此我正在设置AudioRecord。我可以在模拟器中运行它,但是当我在设备(Galaxy S9)上运行它时,AudioRecord.Read()调用永远不会返回。令人费解的是,所有contructor / StartRecording()都正常运行,没有异常,并且Recording状态报告RECORDSTATE_RECORDING。它认为它正在录制,但阅读却无法获得帧。此外,在模拟器上,它运行良好,并且确实可以从缓冲区中成功读取。
这是代码。如果您想尝试,请创建一个空白的Xamarin.Android应用,并使用以下内容替换MainActivity.cs内容:
using Android.App;
using Android.OS;
using Android.Support.V7.App;
using Android.Media;
using Android;
using System.Threading;
using System.Linq;
using System;
namespace AndroidRecord
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_main);
if (CheckSelfPermission(Manifest.Permission.RecordAudio) != Android.Content.PM.Permission.Granted)
{
throw new Exception($"need record permission");
}
StartRecording();
}
protected void OnDataUpdate(float[] data)
{
// consume thse data.
var max = data.Max(sample => sample);
System.Diagnostics.Debug.WriteLine($"{max}");
}
public void StartRecording()
{
new Thread(new ThreadStart(() =>
{
var audioSource = AudioSource.Mic;
int sampleRate = 44100;
var channelConfig = ChannelIn.Front;
var encoding = Encoding.PcmFloat;
int minBufferSize = AudioRecord.GetMinBufferSize(sampleRate, channelConfig, encoding);
AudioRecord recorder = new AudioRecord(audioSource, sampleRate, channelConfig, encoding, minBufferSize);
recorder.StartRecording();
int chunkSize = 2048;
while (true)
{
float[] data = new float[chunkSize];
int i = recorder.Read(data, 0, chunkSize, (int)(int)AudioRecordReadOptions.Blocking);
RunOnUiThread(() => OnDataUpdate(data));
}
})).Start();
}
}
到目前为止,我已经尝试过:
暂停调试器以查看堆栈跟踪的内容。每次中断时,记录线程都在同一位置,等待互操作调用:
0xFFFFFFFFFFFFFFFF in Java.Interop.NativeMethods.java_interop_jnienv_call_int_method_a
0x54 in Java.Interop.JniEnvironment.InstanceMethods.CallIntMethod
0x2C in Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeVirtualInt32Method
0x70 in Android.Media.AudioRecord.Read
0x61 in AndroidRecord.MainActivity.<StartRecording>b__2_0
我还能尝试诊断什么问题或至少获得更多信息?
答案 0 :(得分:0)
我重新启动设备,然后再次尝试,然后确定,现在一切正常。我唯一的猜测是记录设备处于某种状态,可能是在上次运行时从调试器强制停止了我的应用程序。只是一个猜测而已。
答案 1 :(得分:0)
我创建了一个空白的Xamarin.Android应用,并用您的代码替换了MainActivity.cs内容,但我没有重现您的错误。相反,我被卡在权限检查部分中,如下所示:
if (CheckSelfPermission(Manifest.Permission.RecordAudio) != Android.Content.PM.Permission.Granted)
{
throw new Exception($"need record permission");
}
我认为许可请求方法有问题,也许this可以为您提供帮助。