1

私はオーディオ レコーダーに取り組んでおり、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;
}

しかし、最初のものはファイルに書き込まれたパケットの長さを示します。これは常に実際の記録時間よりも短くなります。2番目のものも正確な持続時間を示していません(1〜2秒増加)。

誰かが同じことを実装している場合は助けてください。ありがとう。

4

1 に答える 1

0

SpeakHere には、録音の実際の長さを計算する方法についていくつかの優れた手がかりを提供する関数があります。ですCalculateBytesForTime。もちろん反対のことをしたいのですが、同じ原則が適用されます。

オーディオ形式がわかっている場合は、逆方向に作業して長さを計算できます。

詳細な説明については、Apple のドキュメントSet Up an Audio Format for Recordingを参照してください。Write a Function to Deriv Playback Audio Queue Buffer Sizeも参照してください。後者は、パラメータの数値に基づいてバッファ サイズを計算する方法を示していますseconds。繰り返しますが、オーディオ形式によっては、別の方法でsecondsバッファ サイズに基づいて決定することもできます。

于 2012-01-17T12:02:13.893 に答える