2010-08-03 124 views
4

如何獲取總時長音樂在audioQueue中。我使用如何查詢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中,時間軸,&和時間戳,NULL);爲了獲得當前的播放時間,它給出了一些很大的值,它是有效的以及如何獲得音樂文件的持續時間。

回答

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

此方法已添加到Apple SpeakHere示例中的AQPlayer(v2.4)中。 – ThomasRS 2011-01-25 00:25:19

+0

嘿托馬斯這裏是一個相關的問題..你可以看看嗎?http://stackoverflow.com/questions/12668803/difference-between-audioqueue-time-and-audioqueue-device-time – abbood 2012-10-01 07:03:21

2

AudioQueueGetCurrentTime(mQueue,timeLine,& timeStamp,NULL);爲了獲得當前的播放時間,它給出了一些很大的價值,它是有效的

可能,但它不是你的想法。這不是在幾秒鐘內; the docs真的不知道它是什麼在,但谷歌搜索,似乎是在框架中,無論出於何種原因。 (例如,this technote包含一個將其視爲幀的片段。)嘗試按採樣率除以(源)的幀頻,然後查看哪一個能讓您理解數字。

如何獲取音樂文件的持續時間。

沒有一個。一個音頻隊列就是這樣:一個要播放或錄製的音頻樣本隊列。隊列中唯一的長度是可以在隊列中排隊的樣本數量;如果這些來源甚至具有有限的長度,那麼隊列不知道可能投入到其中的任何東西的長度。

音頻隊列調用您創建的函數以從您那裏獲取音頻採樣。無論您的功能從哪裏獲取(例如,AudioFile)的樣本都是您需要從中獲取長度的地方。如果您自己生成樣本(如在音調或噪音發生器中),則長度(如果有的話)取決於您。

+0

我有音頻文件,如sample.mp4 ......如何讓聲音的持續時間。 – 2010-08-04 04:45:40

+0

就像我說過的,你需要從你獲得樣本的同一個API中獲得持續時間。 – 2010-08-04 04:47:42

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

這並不總是給出確切的結果。並非所有的編解碼器每個數據包的幀數都是固定的,並且某些格式(如AAC)具有Apple稱之爲「啓動」和「剩餘」幀的格式。您需要從文件中獲取數據包表以真正計算準確的持續時間。 – sbooth 2010-08-05 04:48:25

+0

@sbooth [Here's](http://stackoverflow.com/a/18693593/1971013)我的解決方法。 – 2013-09-09 09:03:34

相關問題