Как проверить текущее время и длительность в AudioQueue



Как получить общую длительность музыки в аудиокве. Я использую



NSTimeInterval AQPlayer::getCurrentTime()
{
NSTimeInterval timeInterval = 0.0;

AudioQueueTimelineRef timeLine;
OSStatus status = AudioQueueCreateTimeline(mQueue, &timeLine);
if(status == noErr)
{
AudioTimeStamp timeStamp;
AudioQueueGetCurrentTime(mQueue, timeLine, &timeStamp, NULL);
timeInterval = timeStamp.mSampleTime;
}

return timeInterval;
}


AudioQueueGetCurrentTime (mQueue, timeLine, &timeStamp, NULL); для получения текущего времени воспроизведения он дает некоторое большое значение, является ли он действительным и как получить длительность музыкального файла.

609   3  

3 ответов:

Для дальнейшего использования я получаю правильное время в секундах, используя небольшую модификацию кода Чандана:

int AQPlayer::GetCurrentTime() {
    int timeInterval = 0;
    AudioQueueTimelineRef timeLine;
    OSStatus status = AudioQueueCreateTimeline(mQueue, &timeLine);
    if(status == noErr) {
        AudioTimeStamp timeStamp;
        AudioQueueGetCurrentTime(mQueue, timeLine, &timeStamp, NULL);
        timeInterval = timeStamp.mSampleTime / mDataFormat.mSampleRate; // modified
    }
    return timeInterval;
}

AudioQueueGetCurrentTime (mQueue, timeLine, &timeStamp, NULL); для получения текущего времени воспроизведения он дает некоторое большое значение is it valid

Возможно, но это не то, что ты думаешь. Это не в секундах; документы на самом деле не говорят, что это , но Гуглянув вокруг, кажется, что это в кадрах, по какой-то причине. (Например, это technote включает фрагмент, который рассматривает его как фреймы.) Попробуйте разделить на частоту дискретизации и разделить на частота кадров (источника), и посмотреть, какой из них дает вам нормальные цифры.

Как получить длительность музыкального файла.

Такого нет. Очередь аудио - это просто очередь звуковых сэмплов для воспроизведения или записи. Единственная длина очереди-это количество образцов, которые вы можете поставить в очередь; очередь не знает длины всего, что может быть подано в нее, если эти источники даже имеют конечную длину.

Очередь аудио вызывает функцию, которую вы создаете, чтобы получить образцы аудио от вас. Там, где ваша функция получает образцы (например, аудиофайл), вам нужно получить длину. Если вы сами генерируете сэмплы (как в генераторе тонов или шумов), то длина, если таковая имеется, зависит от вас.

NSTimeInterval  AQPlayer::getTotalDuration()
{   
    UInt64 nPackets;
    UInt32 propsize = sizeof(nPackets);

    XThrowIfError (AudioFileGetProperty(mAudioFile, kAudioFilePropertyAudioDataPacketCount, &propsize, &nPackets), "kAudioFilePropertyAudioDataPacketCount");
    Float64 fileDuration = (nPackets * mDataFormat.mFramesPerPacket) / mDataFormat.mSampleRate;

    return fileDuration;
}

Comments

    Ничего не найдено.