AudioRecord.StartRecording() 正在抛出 Java.Lang.IllegalException 表示未初始化的 AudioRecorder
AudioRecord.StartRecording() is Throwing Java.Lang.IllegalException saying that Uninitialized AudioRecorder
我正在尝试在我的 android 应用程序中将音频读取为 16 位整数。我使用 Xamarin.android 编写了这个应用程序。我为此使用 AudioRecord 低级库,因为我需要从电话麦克风读取原始字节而不是高级操作。
在 StartRecording() 函数中有一个来自 Java 的异常,表示未初始化的 AudioRecord.
AudioRecord au = new AudioRecord(AudioSource.Mic, 44100, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit, buffer.Length);
au.StartRecording(); //<-- Here
//(Java.Lang.IllegalStateException: startRecording()
// called on an uninitialized AudioRecord.)
我在堆栈溢出中抛出一些 qns,并尝试在 try catch 块中释放任何先前的分配。问题仍然存在。
AudioRecord au = new AudioRecord(AudioSource.Mic, 44100, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit, buffer.Length);
try {
au.StartRecording();
au.Read(buffer, 0, buffer.Length);
}
catch (Java.Lang.IllegalStateException e ) {
au.Release();
au = new AudioRecord(AudioSource.Mic, 44100, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit, buffer.Length);
au.StartRecording();
au.Read(buffer, 0, buffer.Length);
}
这是我在单独的代码文件中的完整代码。
using System;
using System.Text;
using System.Collections.Generic;
using Android.Media;
namespace core
{
public static class RawAudioInput
{
public static List<short> Listen()
{
int bufferSizeInBytes = AudioRecord
.GetMinBufferSize(44100, ChannelIn.Mono,
Android.Media.Encoding.Pcm16bit);
byte[] buffer = new byte[bufferSizeInBytes];
AudioRecord au = new AudioRecord(AudioSource.Mic, 44100, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit, buffer.Length);
try {
au.StartRecording();
au.Read(buffer, 0, buffer.Length);
}
catch (Java.Lang.IllegalStateException e ) {
au.Release();
au = new AudioRecord(AudioSource.Mic, 44100, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit, buffer.Length);
au.StartRecording();//<-- (Java.Lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.)
au.Read(buffer, 0, buffer.Length);
}
au.Stop();
List<short> result = new List<short>();
for (int i = 0; i < buffer.Length; i += 2)
{
result.Add(BitConverter.ToInt16(buffer, i));
}
au.Release();
return result;
}
}
}
我不明白我哪里做错了。请帮我解决这个问题。
编辑
我设法从 System.Diagnostics.Debug.WriteLine() 获得了异常的完整堆栈跟踪
在这里:
[0:] Java.Lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
at Java.Interop.JniEnvironment+InstanceMethods.CallVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00069] in <286213b9e14c442ba8d8d94cc9dbec8e>:0
at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0002a] in <286213b9e14c442ba8d8d94cc9dbec8e>:0
at Android.Media.AudioRecord.StartRecording () [0x0000a] in <b781ed64f1d743e7881ac038e0fbdf85>:0
at core.RawAudioInput.Listen () [0x00028] in C:\Users\aditya_nadig\source\repos\RawAudio\RawAudio\RawAudioInput.cs:17
at RawAudio.MainActivity.OnRecordButtonClick (System.Object sender, System.EventArgs e) [0x00004] in C:\Users\aditya_nadig\source\repos\RawAudio\RawAudio\MainActivity.cs:31
--- End of managed Java.Lang.IllegalStateException stack trace ---
java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
at android.media.AudioRecord.startRecording(AudioRecord.java:1011)
at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:30)
at android.view.View.performClick(View.java:6993)
at android.widget.TextView.performClick(TextView.java:12752)
at android.view.View$PerformClick.run(View.java:26512)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:7025)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
StartRecording
应该在单独的线程中调用。你应该使用 Async Task.it
,并在你的代码中实现 AudioManager
,这是一个简单的演示,你可以参考它。
https://developer.xamarin.com/samples/monodroid/Example_WorkingWithAudio/
更新
并且不要忘记在AndroidManifest中请求这些权限,
"android.permission.MODIFY_AUDIO_SETTINGS"
"android.permission.READ_EXTERNAL_STORAGE"
"android.permission.WRITE_EXTERNAL_STORAGE"
"android.permission.RECORD_AUDIO"
我正在尝试在我的 android 应用程序中将音频读取为 16 位整数。我使用 Xamarin.android 编写了这个应用程序。我为此使用 AudioRecord 低级库,因为我需要从电话麦克风读取原始字节而不是高级操作。
在 StartRecording() 函数中有一个来自 Java 的异常,表示未初始化的 AudioRecord.
AudioRecord au = new AudioRecord(AudioSource.Mic, 44100, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit, buffer.Length);
au.StartRecording(); //<-- Here
//(Java.Lang.IllegalStateException: startRecording()
// called on an uninitialized AudioRecord.)
我在堆栈溢出中抛出一些 qns,并尝试在 try catch 块中释放任何先前的分配。问题仍然存在。
AudioRecord au = new AudioRecord(AudioSource.Mic, 44100, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit, buffer.Length);
try {
au.StartRecording();
au.Read(buffer, 0, buffer.Length);
}
catch (Java.Lang.IllegalStateException e ) {
au.Release();
au = new AudioRecord(AudioSource.Mic, 44100, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit, buffer.Length);
au.StartRecording();
au.Read(buffer, 0, buffer.Length);
}
这是我在单独的代码文件中的完整代码。
using System;
using System.Text;
using System.Collections.Generic;
using Android.Media;
namespace core
{
public static class RawAudioInput
{
public static List<short> Listen()
{
int bufferSizeInBytes = AudioRecord
.GetMinBufferSize(44100, ChannelIn.Mono,
Android.Media.Encoding.Pcm16bit);
byte[] buffer = new byte[bufferSizeInBytes];
AudioRecord au = new AudioRecord(AudioSource.Mic, 44100, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit, buffer.Length);
try {
au.StartRecording();
au.Read(buffer, 0, buffer.Length);
}
catch (Java.Lang.IllegalStateException e ) {
au.Release();
au = new AudioRecord(AudioSource.Mic, 44100, ChannelIn.Mono, Android.Media.Encoding.Pcm16bit, buffer.Length);
au.StartRecording();//<-- (Java.Lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.)
au.Read(buffer, 0, buffer.Length);
}
au.Stop();
List<short> result = new List<short>();
for (int i = 0; i < buffer.Length; i += 2)
{
result.Add(BitConverter.ToInt16(buffer, i));
}
au.Release();
return result;
}
}
}
我不明白我哪里做错了。请帮我解决这个问题。
编辑 我设法从 System.Diagnostics.Debug.WriteLine() 获得了异常的完整堆栈跟踪 在这里:
[0:] Java.Lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
at Java.Interop.JniEnvironment+InstanceMethods.CallVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00069] in <286213b9e14c442ba8d8d94cc9dbec8e>:0
at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0002a] in <286213b9e14c442ba8d8d94cc9dbec8e>:0
at Android.Media.AudioRecord.StartRecording () [0x0000a] in <b781ed64f1d743e7881ac038e0fbdf85>:0
at core.RawAudioInput.Listen () [0x00028] in C:\Users\aditya_nadig\source\repos\RawAudio\RawAudio\RawAudioInput.cs:17
at RawAudio.MainActivity.OnRecordButtonClick (System.Object sender, System.EventArgs e) [0x00004] in C:\Users\aditya_nadig\source\repos\RawAudio\RawAudio\MainActivity.cs:31
--- End of managed Java.Lang.IllegalStateException stack trace ---
java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
at android.media.AudioRecord.startRecording(AudioRecord.java:1011)
at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:30)
at android.view.View.performClick(View.java:6993)
at android.widget.TextView.performClick(TextView.java:12752)
at android.view.View$PerformClick.run(View.java:26512)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:7025)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
StartRecording
应该在单独的线程中调用。你应该使用 Async Task.it
,并在你的代码中实现 AudioManager
,这是一个简单的演示,你可以参考它。
https://developer.xamarin.com/samples/monodroid/Example_WorkingWithAudio/
更新
并且不要忘记在AndroidManifest中请求这些权限,
"android.permission.MODIFY_AUDIO_SETTINGS"
"android.permission.READ_EXTERNAL_STORAGE"
"android.permission.WRITE_EXTERNAL_STORAGE"
"android.permission.RECORD_AUDIO"