gpt4 book ai didi

iphone - 如何开始写出现有的 AudioQueue 以响应事件?

转载 作者:行者123 更新时间:2023-12-03 16:19:06 25 4
gpt4 key购买 nike

我正在编写一个类,该类打开 AudioQueue 并分析其特征,然后在某些条件下可以开始或结束从已实例化的 AudioQueue 中写出文件。这是我的代码(完全基于 SpeakHere),它打开 AudioQueue,而不将任何内容写入 tmp:

void AQRecorder::StartListen() {
int i, bufferByteSize;
UInt32 size;

try {

SetupAudioFormat(kAudioFormatLinearPCM);

XThrowIfError(AudioQueueNewInput(&mRecordFormat,
MyInputBufferHandler,
this,
NULL, NULL,
0, &mQueue), "AudioQueueNewInput failed");

mRecordPacket = 0;

size = sizeof(mRecordFormat);
XThrowIfError(AudioQueueGetProperty(mQueue, kAudioQueueProperty_StreamDescription,
&mRecordFormat, &size), "couldn't get queue's format");

bufferByteSize = ComputeRecordBufferSize(&mRecordFormat, kBufferDurationSeconds);
for (i = 0; i < kNumberRecordBuffers; ++i) {
XThrowIfError(AudioQueueAllocateBuffer(mQueue, bufferByteSize, &mBuffers[i]),
"AudioQueueAllocateBuffer failed");
XThrowIfError(AudioQueueEnqueueBuffer(mQueue, mBuffers[i], 0, NULL),
"AudioQueueEnqueueBuffer failed");
}

mIsRunning = true;
XThrowIfError(AudioQueueStart(mQueue, NULL), "AudioQueueStart failed");
}
catch (CAXException &e) {
char buf[256];
fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
}
catch (...) {
fprintf(stderr, "An unknown error occurred\n");
}
}

但是我有点不清楚如何编写一个函数来告诉这个队列“从现在到停止信号,开始将此队列作为文件写入 tmp”。我了解如何告诉 AudioQueue 在创建时以文件形式写出,如何设置文件格式等,但不知道如何告诉它在中途启动和停止。非常感谢任何指点,谢谢。

最佳答案

您可以随时使用 AudioQueuePause(AudioQueueRef inAQ) 和 AudioQueueStart (AudioQueueRef inAQ, const AudioTimeStamp *inStartTime) 暂停/启动音频队列;

而且还有更多的可能性。因为您在回调函数中写入音频文件,所以您可以选择何时保存以及保存哪些数据。

要控制是否写入数据,请在记录器类中创建 bool 标志,例如“doWrite”,并且仅在其设置为"is"时才写入。队列从一开始就开始接收数据并不断填充缓冲区,但是您只需在回调中接收这些数据,直到标志保持为“否”。然后随时设置 doWrite=YES ,下一个缓冲区将保存到文件中。当您根据声音本身更改录音时(例如,仅当声音大于某个阈值时才录音),此方法特别有用。

void AQRecorder::MyInputBufferHandler(  void * inUserData, AudioQueueRef    inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp * inStartTime, UInt32  inNumPackets, const  AudioStreamPacketDescription* inPacketDesc)
{
AQRecorder *aqr = (AQRecorder *)inUserData;
try {
if (inNumPackets > 0) {

if (aqr.doWrite){
// write packets to file
XThrowIfError(AudioFileWritePackets(aqr->mRecordFile, FALSE, inBuffer->mAudioDataByteSize, inPacketDesc, aqr->mRecordPacket, &inNumPackets, inBuffer->mAudioData), "AudioFileWritePackets failed");
aqr->mRecordPacket += inNumPackets;
}
}

// if we're not stopping, re-enqueue the buffe so that it gets filled again
if (aqr->IsRunning())
XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL), "AudioQueueEnqueueBuffer failed");
} catch (CAXException e) {
char buf[256];
fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
}
}

关于iphone - 如何开始写出现有的 AudioQueue 以响应事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2473460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com