如何在录制过程中获得录制音频的精确持续时间?
问题描述:
我正在使用录音机并使用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秒)。
请帮助,如果有人已经实施了相同的。 谢谢。
答
SpeakHere有一个函数可以提供一些关于如何计算实际记录持续时间的线索。这是CalculateBytesForTime
。当然你想做相反的事情,但是同样的原则也适用。
当你知道你的音频格式时,你可以反向工作来计算持续时间。
查看Apple的文档Set Up an Audio Format for Recording获取详细解释。也看看Write a Function to Derive Playback Audio Queue Buffer Size。后者告诉您如何根据参数seconds
中的数字计算缓冲区大小。再次,根据您的音频格式,您可以通过另一种方式根据缓冲区大小确定seconds
。