Cocoa 如何检查AudioQueue中的当前时间和持续时间

Cocoa 如何检查AudioQueue中的当前时间和持续时间,cocoa,audio,core-audio,audioqueueservices,Cocoa,Audio,Core Audio,Audioqueueservices,如何获取audioQueue中音乐的总持续时间。我正在使用 NSTimeInterval AQPlayer::getCurrentTime() { NSTimeInterval timeInterval = 0.0; AudioQueueTimelineRef timeLine; OSStatus status = AudioQueueCreateTimeline(mQueue, &timeLine); if(status == noErr) {

如何获取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(MQUE、时间线和时间戳,NULL);对于获取当前播放时间,它给出了一些较大的值,即它是否有效以及如何获取音乐文件的持续时间

AudioQueueGetCurrentTime(MQUE、时间线和时间戳,NULL);对于获取当前播放时间,它给出了一些较大的值,是否有效

可能吧,但不是你想的那样。不是在几秒钟之内;不要真的说它是什么,但谷歌搜索,它似乎是在帧,无论出于何种原因。(例如,包含一个将其视为帧的代码段。)尝试除以采样率,再除以(源的)帧速率,然后看看哪一个可以得到正确的数字

如何获取音乐文件的持续时间

没有。音频队列就是:要播放或录制的音频样本队列。队列的唯一长度是可以在其中排队的样本数;如果这些源的长度是有限的,那么队列不知道可能传入的任何内容的长度


音频队列调用您创建的函数以从您处获取音频样本。无论函数从何处获取样本(例如音频文件),都需要从何处获取长度。如果您自己生成样本(如在音调或噪声发生器中),则长度(如有)由您决定。

为了便于将来参考,我对Chandan的代码稍加修改即可获得正确的时间(以秒为单位):

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;
}
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;
}

我有像sample.mp4这样的音频文件。。。如何获取音频的持续时间。正如我所说,您需要从获取示例的相同API获取持续时间。这并不总是给出准确的结果。并非所有的编解码器每个数据包都有固定数量的帧,有些格式,如AAC,有苹果公司称之为“启动”和“剩余”帧。您需要从文件中获取数据包表,才能真正计算出准确的持续时间。@s继续我的工作。此方法已添加到Apple SpeakHere示例中的AQPlayer(v2.4)中。嘿,托马斯,这里有一个相关问题。。你能看一下吗?