5

如何获取音频队列中音乐的总时长。我在用

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

4

3 回答 3

8

为了将来参考,我通过对 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;
}
于 2010-11-09T05:14:58.483 回答
2

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

可能,但不是你想的那样。不是在几秒钟内;文档并没有真正说明它的内容,但谷歌搜索,无论出于何种原因,它似乎都在框架中。(例如,此技术说明包含一个将其视为帧的片段。)尝试除以采样率并除以(源的)帧率,看看哪一个能让你获得理智的数字。

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

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

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

于 2010-08-03T11:55:53.620 回答
1
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;
}
于 2010-08-04T06:08:36.383 回答