如何在录制过程中获得录制音频的确切持续时间



我正在开发一台录音机,并使用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秒)。

如果有人执行了相同的操作,请提供帮助。谢谢

SpeakHere有一个函数,它将为如何计算录制的实际持续时间提供一些很好的线索。它是CalculateBytesForTime。当然,你想做相反的事情,但同样的原则也适用。

当你知道你的音频格式后,你可以倒推计算出持续时间。

查看苹果的文档"设置录音的音频格式",了解详细解释。另请参阅"编写函数以导出播放音频队列缓冲区大小"。后者告诉如何根据参数seconds中的数字计算缓冲区大小。同样,根据您的音频格式,您可以使用其他方法根据缓冲区大小确定seconds

相关内容

  • 没有找到相关文章

最新更新