我正在制作录音机并使用SpeakHere示例代码中的AQRecorder。我想在UI上添加一个滑块来显示录制持续时间。我使用在录制开始时初始化的简单计时器来完成此操作。但有时录音会落后1秒。例如,Slider显示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 :(得分:0)
SpeakHere有一个功能,可以提供一些关于如何计算录音实际持续时间的线索。它是CalculateBytesForTime
。当然,你想做相反的事情,但同样的原则适用。
当您知道音频格式时,可以向后工作以计算持续时间。
查看Apple的文档Set Up an Audio Format for Recording以获取详细说明。另请查看Write a Function to Derive Playback Audio Queue Buffer Size。后者告诉您如何根据参数seconds
中的数字计算缓冲区大小。同样,根据您的音频格式,您可以使用另一种方式根据缓冲区大小确定seconds
。