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

Я работаю над аудио-рекордером и использую 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 секунды).

Пожалуйста, помогите, если кто-то реализовал то же самое.Благодаря.

1 Ответ

0 голосов
/ 17 января 2012

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

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

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

...