iPhone:获取音频文件的持续时间

时间:2009-08-07 19:43:53

标签: iphone cocoa-touch

获取音频文件持续时间的最简单方法是什么?

我可以创建一个AVAudioPlayer的对象,用URL初始化它,然后获取持续时间,但这种方式太长了。有更简单的方法吗?

感谢。

8 个答案:

答案 0 :(得分:14)

正确的代码是

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 :(得分:9)

您可以使用音频文件服务功能。有一个属性可以给你估计的持续时间。代码:

    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);

您可以查看文档here

答案 2 :(得分:2)

如果您对所涉及的音频文件(samplerate,bitdepth,channel count)一无所知,并且它是未压缩格式(WAV / AIFF),那么您可以从文件大小计算/近似/持续时间:

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

答案 3 :(得分:2)

取决于文件类型。如果它是WAV文件,您可以找到文件的标题并确定播放持续时间。如果它是压缩格式(* .mp3等),你最好坚持使用你提到的方法。

答案 4 :(得分:2)

将AVAudioPlayer与Swift结合起来变得如此简单(我正在迁移下面的Realm表,但你明白了):

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)

答案 5 :(得分:1)

如果有人在这里寻找方法来获取音频和视频文件的持续时间,请查看另一篇文章的答案,而不是使用AVAsset

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

使用AudioFileGetProperty(与此处的其他两个主要答案一样)获取A / V文件的持续时间对我设备上的一些 .mov 文件无效(结果是始终为0),而使用AVAsset的解决方案获得了设备上所有音频和视频文件的持续时间。

(有趣的是,两个解决方案的持续时间有时比实际AVAudioPlayer的UI中显示的持续时间长1秒。很可能AVAudioPlayer使用非标准的舍入例程显示的持续时间。)

答案 6 :(得分: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);

答案 7 :(得分: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);
                    }];
相关问题