2009-08-07 89 views
7

獲取音頻文件持續時間的最簡單方法是什麼?iPhone:獲取音頻文件的持續時間

我可以創建AVAudioPlayer的對象,使用URL初始化,比得到持續,但這種方式太長。有更容易的方法嗎?

謝謝。

+0

的可能的複製[如何獲得在iOS中的音頻文件的持續時間?](http://stackoverflow.com/questions/5219379/how-to-get-the-duration-of-an-audio-file-in-ios) – user471651 2016-04-21 01:06:26

回答

8

您可以使用音頻文件服務功能。有一個屬性應該給你預計的持續時間。代碼:

NSURL *afUrl = [NSURL fileURLWithPath:soundPath]; 
    AudioFileID fileID; 
    OSStatus result = AudioFileOpenURL((CFURLRef)afUrl, kAudioFileReadPermission, 0, &fileID); 
    UInt64 outDataSize = 0; 
    UInt32 thePropSize = sizeof(UInt64); 
    result = AudioFileGetProperty(fileID, kAudioFilePropertyEstimatedDuration, &thePropSize, &outDataSize); 
    AudioFileClose(fileID); 

您可以查看文檔here

+0

謝謝,但我不明白,爲什麼我得到每一個outDataSize等於0的時間? – 2009-08-07 20:22:12

+0

謝謝你的解決方案,我發現問題出在哪裏。 – 2009-08-07 20:27:30

+0

嘿,這是不公平的,使用實際的知識來獲得支票,而不是模糊的關於你從來沒有用過的操作系統的猜測。 :) – MusiGenesis 2009-08-07 20:31:39

2

如果你知道有問題的音頻文件(採樣率,比特深度,通道數)的事,那是一個未壓縮格式(WAV/AIFF),那麼你可以計算從文件大小的/近似/時間:

length_in_seconds =(file_length-guess_100_bytes_for_header)/(samplerate *(bitdepth * channel_count/8))

+0

標題爲100個字節?無論發生在規範44? :) – MusiGenesis 2009-08-07 20:02:42

+0

任何數量的原因;)BWF元數據,AIFF頭? – 2009-08-07 20:15:18

+0

14年後我應該知道更多,但就在上個月我花了半天的時間試圖找出我的聲音開始處的小點擊來自哪裏。我正在使用假定只有44字節標題的快速和骯髒的方法。我又一次吸取了教訓。 – MusiGenesis 2009-08-07 20:36:49

2

它取決於文件類型。如果是WAV文件,您可以找到文件的標題並確定播放時間。如果它是一種壓縮格式(* .mp3等),你最好堅持你提到的方法。

12

正確的代碼

NSURL *afUrl = [NSURL fileURLWithPath:soundPath]; 
AudioFileID fileID; 
OSStatus result = AudioFileOpenURL((CFURLRef)afUrl, kAudioFileReadPermission, 0, &fileID); 
Float64 outDataSize = 0; 
UInt32 thePropSize = sizeof(Float64); 
result = AudioFileGetProperty(fileID, kAudioFilePropertyEstimatedDuration, &thePropSize, &outDataSize); 
AudioFileClose(fileID); 

outDataSize應Float64不UINT64。

1

如果任何人登陸這裏尋找一種方式來獲得的音頻和視頻文件的時間,看看這個答案另一篇文章,這反而使用AVAsset代替:

https://stackoverflow.com/a/7052147/381233

使用AudioFileGetProperty(像其他兩個主要的答案在這裏),以獲得的A/V文件的時間爲我的設備上的幾個.MOV文件沒有工作(結果總是0),同時採用AVAsset的解決方案得到了持續時間我的設備上的所有音頻和視頻文件。

(有趣的是,然而,從兩個解決方案的持續時間有時1秒以上,在實際AVAudioPlayer的UI顯示。最有可能的AVAudioPlayer使用爲顯示持續時間的非標準舍入程序。)

1

來自回答How to get the duration of an audio file in iOS?的示例代碼。這是最好的答案。

AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:audioFileURL options:nil]; CMTime audioDuration = audioAsset.duration; float audioDurationSeconds = CMTimeGetSeconds(audioDuration);

2

與斯威夫特結合AVAudioPlayer變得一樣簡單(我下面遷移境界表,但你的想法):

import AVFoundation 

let resource = old!["filename"] as? String 
let afUrl = NSBundle.mainBundle().URLForResource(resource, withExtension: nil) 
let player = try! AVAudioPlayer(contentsOfURL: afUrl!) 

new!["duration"] = Double(player.duration) 
1
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:mp3_url options:nil]; 
        [audioAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{ 
         CMTime audioDuration = audioAsset.duration; 
         float audioDurationSeconds = CMTimeGetSeconds(audioDuration); 

         NSLog(@"duration:%f",audioDurationSeconds); 
        }]; 
相關問題