使用AudioQueue和Monotouch静音录制

我在MonoTouch中编写了一个小程序,使用InputAudioQueue从我的iPhone 4s麦克风录制声音。

我将记录的数据保存在一个数组中,并将此缓冲区提供给我的音频播放器进行播放(使用OutputAudioQueue)。

播放时,它只是一些口吃的垃圾/静音。 我在播放前尝试用sin波填充缓冲区然后听起来不错,所以我猜问题出在录音中,而不是播放。 任何人都可以帮我看看有什么问题吗? (以下代码)

public class AQRecorder { private const int CountAudioBuffers = 3; private const int AudioBufferLength = 22050; private const int SampleRate = 44100; private const int BitsPerChannel = 16; private const int Channels = 1; private const int MaxRecordingTime = 5; private AudioStreamBasicDescription audioStreamDescription; private InputAudioQueue inputQueue; private short[] rawData; private int indexNextRawData; public AQRecorder () { this.audioStreamDescription.Format = AudioFormatType.LinearPCM; this.audioStreamDescription.FormatFlags = AudioFormatFlags.LinearPCMIsSignedInteger | AudioFormatFlags.LinearPCMIsPacked; this.audioStreamDescription.SampleRate = AQRecorder.SampleRate; this.audioStreamDescription.BitsPerChannel = AQRecorder.BitsPerChannel; this.audioStreamDescription.ChannelsPerFrame = AQRecorder.Channels; this.audioStreamDescription.BytesPerFrame = (AQRecorder.BitsPerChannel / 8) * AQRecorder.Channels; this.audioStreamDescription.FramesPerPacket = 1; this.audioStreamDescription.BytesPerPacket = audioStreamDescription.BytesPerFrame * audioStreamDescription.FramesPerPacket; this.audioStreamDescription.Reserved = 0; } public void Start () { int totalBytesToRecord = this.audioStreamDescription.BytesPerFrame * AQRecorder.SampleRate * AQRecorder.MaxRecordingTime; this.rawData = new short[totalBytesToRecord / sizeof(short)]; this.indexNextRawData = 0; this.inputQueue = SetupInputQueue (this.audioStreamDescription); this.inputQueue.Start (); } public void Stop () { if (this.inputQueue.IsRunning) { this.inputQueue.Stop (true); } } public short[] GetData () { return this.rawData;; } private InputAudioQueue SetupInputQueue (AudioStreamBasicDescription audioStreamDescription) { InputAudioQueue inputQueue = new InputAudioQueue (audioStreamDescription); for (int count = 0; count < AQRecorder.CountAudioBuffers; count++) { IntPtr bufferPointer; inputQueue.AllocateBuffer(AQRecorder.AudioBufferLength, out bufferPointer); inputQueue.EnqueueBuffer(bufferPointer, AQRecorder.AudioBufferLength, null); } inputQueue.InputCompleted += HandleInputCompleted; return inputQueue; } private void HandleInputCompleted (object sender, InputCompletedEventArgs e) { unsafe { short* shortPtr = (short*)e.IntPtrBuffer; for (int count = 0; count = this.rawData.Length) { this.inputQueue.Stop (true); return; } this.rawData [indexNextRawData] = *shortPtr; indexNextRawData++; shortPtr++; } } this.inputQueue.EnqueueBuffer(e.IntPtrBuffer, AQRecorder.AudioBufferLength, null); } } 

好吧,这可能为时已晚,但我听到垃圾声只有同样的问题,并找到了解决方案。

您无法直接从e.IntPtrBuffer读取音频数据。 此指针是指向AudioQueueBuffer对象的指针,而不是指向音频数据本身的指针。 因此,要读取音频数据,您可以使用e.UnsafeBuffer,它允许您访问此对象并使用其AudioData指针。 这是一个IntPtr,您可以(在不安全的上下文中)转换为字节*或短*,并且您拥有音频数据。

最好的祝福

亚历克斯

Interesting Posts