如何在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);为了获得当前的播放时间,它给出了一些有价值的大值以及如何获得音乐文件的持续时间。
答案 0 :(得分:7)
为了将来的参考,我在几秒钟内使用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;
}
答案 1 :(得分:2)
AudioQueueGetCurrentTime(mQueue,timeLine,& timeStamp,NULL);为了获得当前的播放时间,它给出了一些大的价值是否有效
可能,但这不是你的想法。这不是几秒钟; the docs并没有真正说明是的内容,但谷歌搜索,无论出于何种原因,它似乎都在框架中。 (例如,this technote包含一个将其视为帧的片段。)尝试除以采样率并除以(源)的帧速率,然后看看哪一个能让你得到合理的数字。
如何获取音乐文件的持续时间。
没有一个。音频队列就是:要播放或录制的音频样本队列。队列中唯一的长度是您可以在其中排队的样本数;如果这些来源甚至具有有限的长度,那么队列不知道可能进入它的任何东西的长度。
音频队列调用您创建的函数以从您那里获取音频样本。无论您的函数从哪里获取样本(例如,AudioFile),您都需要从中获取长度。如果您自己生成样本(如在音调或噪声发生器中),那么长度(如果有的话)取决于您。
答案 2 :(得分: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;
}