代码之家  ›  专栏  ›  技术社区  ›  Chandan Shetty SP

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

  •  4
  • Chandan Shetty SP  · 技术社区  · 14 年前

    如何获得 总持续时间

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

    3 回复  |  直到 14 年前
        1
  •  8
  •   ThomasRS    14 年前

    为了便于将来参考,我对Chandan的代码进行了一点修改,得到了以秒为单位的正确时间:

    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
  •  2
  •   Peter Hosey    14 年前

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

    the docs 别说什么了 在中,但谷歌四处搜索,它似乎是在帧,无论出于何种原因(举个例子, this technote 包括一个将其视为帧的代码段。)尝试除以采样率,再除以(源代码的)帧速率,看看哪一个得到的数字是正确的。

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

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

        3
  •  1
  •   Chandan Shetty SP    14 年前
    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;
    }