Как получить точную продолжительность записанного звука во время записи?

Я работаю над аудиорекордером и использую AQRecorder из примера кода SpeakHere. Я хочу добавить ползунок в пользовательский интерфейс для отображения продолжительности записи. Я сделал это, используя простой таймер, инициализированный в начале записи. Но иногда запись отстает на 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 секунды).

Помогите, если кто реализовал подобное. Спасибо.


person Jitendra Singh    schedule 10.01.2012    source источник


Ответы (1)


В SpeakHere есть функция, которая даст отличные подсказки о том, как рассчитать фактическую продолжительность записи. Это CalculateBytesForTime. Конечно, вы хотите сделать обратное, но применяются те же принципы.

Когда вы знаете свой аудиоформат, вы можете работать в обратном порядке, чтобы определить продолжительность.

Ознакомьтесь с документацией Apple Настройка аудиоформата для записи для подробного объяснения. Также ознакомьтесь с Напишите функцию для получения размера буфера аудиоочереди воспроизведения. Последний говорит вам, как рассчитать размер буфера на основе числа в параметре seconds. Опять же, в зависимости от вашего аудиоформата, вы можете работать другим способом, чтобы определить seconds на основе размера вашего буфера.

person Max MacLeod    schedule 17.01.2012