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

Posted

技术标签:

【中文标题】如何在 AudioQueue 中检查当前时间和持续时间【英文标题】:How to check current time and duration in AudioQueue 【发布时间】:2010-08-03 09:34:43 【问题描述】:

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

【问题讨论】:

【参考方案1】:

为了将来参考,我通过稍微修改 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;

【讨论】:

此方法已添加到 Apple SpeakHere 示例中的 AQPlayer (v2.4) 中。 嘿,托马斯,这是一个相关的问题。你能看看吗?***.com/questions/12668803/…【参考方案2】:

AudioQueueGetCurrentTime(mQueue, timeLine, &timeStamp, NULL);为了获得当前的播放时间,它给出了一些很大的值是否有效

可能,但不是你想的那样。不是在几秒钟内; the docs 并没有真正说明它 是什么,但谷歌搜索,它似乎在框架中,无论出于何种原因。 (例如,this technote 包含一个将其视为帧的 sn-p。)尝试除以采样率并除以(源的)帧率,看看哪一个能让你得到正确的数字。

如何获取音乐文件的时长。

没有。音频队列就是这样:要播放或录制的音频样本队列。队列的唯一长度是您可以在其中排队的样本数;队列不知道可能馈入其中的任何内容的长度,即使这些来源甚至具有有限长度。

音频队列调用您创建的函数以从您那里获取音频样本。无论您的函数从哪里获取样本(例如,一个 AudioFile),您都需要从哪里获取长度。如果您自己生成样本(如在音调或噪声发生器中),那么长度(如果有)取决于您。

【讨论】:

我有像 sample.mp4 这样的音频文件...如何获取音频的持续时间。 就像我说的,您需要从获取样本的同一个 API 获取持续时间。【参考方案3】:
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;

【讨论】:

这并不总是给出准确的结果。并非所有编解码器的每个数据包都有恒定数量的帧,并且某些格式(例如 AAC)具有 Apple 所谓的“启动”和“剩余”帧。您需要从文件中获取数据包表才能真正计算出准确的持续时间。 @sbooth Here's 我的解决方法。

以上是关于如何在 AudioQueue 中检查当前时间和持续时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有计时器的情况下连续获取 AudioQueue 的更新

AudioQueue 录制音频样本

如何在不冻结 GUI 的情况下让 AudioQueue 播放?

如何访问 AudioQueue 缓冲区中的数据?

如何从 iOS 上的 AudioQueue 服务获取样本

如何降低 iphone 的 sdk Audioqueue 的声音?