私はオーディオ レコーダーに取り組んでおり、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秒増加)。
誰かが同じことを実装している場合は助けてください。ありがとう。