2012-01-10 26 views
1

我正在使用录音机并使用SpeakHere示例代码中的AQRecorder。我想在UI上添加一个滑块来显示录制时间。我在录制开始时使用初始化的简单定时器来完成此操作。但有时录音滞后1秒。例如,滑块显示10秒,但保存时音频的实际持续时间为9秒。如何在录制过程中获得录制音频的精确持续时间?

有没有什么办法让我可以在录制更新滑块时获得精确的持续时间,而不是使用计时器。

我尝试以下方法也

NSTimeInterval AQRecorder::GetTotalDuration() 
{ 
    UInt64 nPackets; 
    UInt32 propsize = sizeof(nPackets); 

    XThrowIfError (AudioFileGetProperty(mRecordFile, kAudioFilePropertyAudioDataPacketCount, &propsize, &nPackets), "kAudioFilePropertyAudioDataPacketCount"); 
    Float64 fileDuration = (nPackets * mRecordFormat.mFramesPerPacket)/mRecordFormat.mSampleRate; 

    return fileDuration; 
} 

NSTimeInterval AQRecorder::GetCurrentTime() { 
    double timeInterval = 0; 
    AudioQueueTimelineRef timeLine; 
    OSStatus status = AudioQueueCreateTimeline(mQueue, &timeLine); 
    if(status == noErr) { 
     AudioTimeStamp timeStamp; 
     AudioQueueGetCurrentTime(mQueue, timeLine, &timeStamp, NULL); 
     timeInterval = timeStamp.mSampleTime * 1.0/mRecordFormat.mSampleRate; // modified 
    } 
    return timeInterval; 
} 

但第一个给出了写入文件,它总是小于实际的记录持续时间的分组长度。第二个也没有给出确切的持续时间(增加1-2秒)。

请帮助,如果有人已经实施了相同的。 谢谢。

回答

0

SpeakHere有一个函数可以提供一些关于如何计算实际记录持续时间的线索。这是CalculateBytesForTime。当然你想做相反的事情,但是同样的原则也适用。

当你知道你的音频格式时,你可以反向工作来计算持续时间。

查看Apple的文档Set Up an Audio Format for Recording获取详细解释。也看看Write a Function to Derive Playback Audio Queue Buffer Size。后者告诉您如何根据参数seconds中的数字计算缓冲区大小。再次,根据您的音频格式,您可以通过另一种方式根据缓冲区大小确定seconds