获取音频文件持续时间的最简单方法是什么?
我可以创建一个AVAudioPlayer的对象,用URL初始化它,然后获取持续时间,但这种方式太长了。有更简单的方法吗?
感谢。
答案 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);
}];