播放多个SpeakHere音频文件

时间:2014-08-14 05:00:14

标签: ios voice-recording

通过使用文件名录制多个片段,我尝试SpeakHere中录制多个单独的短语音片段,我想连续播放它们,以固定的固定时间间隔分隔每个片段的开头。我想让这一系列片段永远地循环播放,或者直到用户停止播放。

我的问题是如何改变SpeakHere这样做?

(我说" 尝试"因为我还没有能够在我的Mac Mini iPhone模拟器上运行SpeakHereThat is the subject of another question因为another question on the subject of multiple files也未得到回答。)

SpeakHereController.mm中,播放录制文件的方法定义如下。请注意最后的else子句调用player->StartQueue(false)

- (IBAction)play:(id)sender
{
    if (player->IsRunning())
    {  [snip]
    }
    else
    {       
        OSStatus result = player->StartQueue(false);
        if (result == noErr)
            [[NSNotificationCenter defaultCenter] postNotificationName:@"playbackQueueResumed" object:self];
    }
}

以下摘自SpeakHere AQPlayer.mm

OSStatus AQPlayer::StartQueue(BOOL inResume)
{   
    // if we have a file but no queue, create one now
    if ((mQueue == NULL) && (mFilePath != NULL)) CreateQueueForFile(mFilePath);

    mIsDone = false;

    // if we are not resuming, we also should restart the file read index
    if (!inResume) {
        mCurrentPacket = 0;

        // prime the queue with some data before starting
        for (int i = 0; i < kNumberBuffers; ++i) {
            AQBufferCallback (this, mQueue, mBuffers[i]);           
        }
    }
    return AudioQueueStart(mQueue, NULL);
}

那么,可以使用方法playAQPlayer::StartQueue来播放多个文件,如何强制执行间隔,以及如何重复循环?

我对方法&#39;记录`的代码的修改如下,所以你可以看到如何创建多个文件。

- (IBAction)record:(id)sender
{
    if (recorder->IsRunning()) // If we are currently recording, stop and save the file.
    {
        [self stopRecord];
    }
    else // If we're not recording, start.
    {
        self.counter = self.counter + 1 ;   //Added *****
        btn_play.enabled = NO;  

        // Set the button's state to "stop"
        btn_record.title = @"Stop";

        // Start the recorder
        NSString *filename = [[NSString alloc] initWithFormat:@"recordedFile%d.caf",self.counter];
        // recorder->StartRecord(CFSTR("recordedFile.caf"));
        recorder->StartRecord((CFStringRef)filename);

        [self setFileDescriptionForFormat:recorder->DataFormat() withName:@"Recorded File"];

        // Hook the level meter up to the Audio Queue for the recorder
        [lvlMeter_in setAq: recorder->Queue()];
    }   
}

1 个答案:

答案 0 :(得分:0)

在iOS上与当地的“聚会”小组交谈后,我了解到我的问题的简单解决方案是避免AudioQueues而是使用“更高级别”AVAudioRecorder和{{1来自AVAudioPlayer

我还发现如何使用我的Mac Mini在模拟器上部分测试我的应用程序:将带有USB的Olympus录音机插入我的Mini作为输入“语音”。这可以作为iSight的替代品,它不会在Mini上产生输入音频。