Как проверить текущее время и продолжительность в AudioQueue - PullRequest
4 голосов
/ 03 августа 2010

Как получить общее время звучания музыки в 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);для получения текущего времени воспроизведения он дает большое значение, является ли он действительным и как получить длительность музыкального файла.

Ответы [ 3 ]

7 голосов
/ 09 ноября 2010

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

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;
}
2 голосов
/ 03 августа 2010

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

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

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

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

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

1 голос
/ 04 августа 2010
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;
}
...