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

Posted

技术标签:

【中文标题】如何在录制过程中获得录制音频的确切持续时间?【英文标题】:How to get exact duration of recorded audio during recording? 【发布时间】:2012-01-10 11:25:27 【问题描述】:

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

如果有人实现了相同的功能,请提供帮助。 谢谢。

【问题讨论】:

【参考方案1】:

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

当您知道您的音频格式后,您可以向后计算持续时间。

查看 Apple 的文档 Set Up an Audio Format for Recording 以获得详细说明。也看看Write a Function to Derive Playback Audio Queue Buffer Size。后者告诉您如何根据参数seconds 中的数字计算缓冲区大小。同样,根据您的音频格式,您可以根据缓冲区大小确定seconds

【讨论】:

以上是关于如何在录制过程中获得录制音频的确切持续时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改SoX的录制音频设备?

使用 MediaRecorder 录制时的音频质量问题

如何使用附加模式将音频录制到现有的音频文件中?

为啥录制的音频的持续时间是负数? (iOS / 斯威夫特)

如何通过在 iphone 中混合多个音频来录制音频?

如何在gstreamer中录制音频和视频