[英]iPhone: get duration of an audio file
获取音频文件持续时间的最简单方法是什么?
我可以创建一个 AVAudioPlayer 对象,用 URL 初始化它,然后获取持续时间,但这种方式太长了。 有更容易的方法吗?
谢谢。
正确的代码是
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。
您可以使用音频文件服务功能。 有一个属性可以为您提供估计的持续时间。 代码:
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);
您可以在此处查看文档
如果您对所讨论的音频文件(采样率、位深度、通道数)有任何了解,并且它是未压缩格式 (WAV/AIFF),那么您可以从文件大小计算 /approximate/ 持续时间:
length_in_seconds = (file_length-guess_100_bytes_for_header) / (samplerate*(bitdepth*channel_count/8))
这取决于文件类型。 如果它是 WAV 文件,您可以找到文件的标题并通过这种方式确定播放持续时间。 如果它是压缩格式(*.mp3 等),您最好坚持使用您提到的方法。
将 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)
如果有人在这里寻找获取音频和视频文件持续时间的方法,请查看另一个帖子的答案,该帖子使用AVAsset
代替:
https://stackoverflow.com/a/7052147/381233
使用AudioFileGetProperty
(就像这里的其他两个主要答案一样)获取 A/V 文件的持续时间对我设备上的一些.mov文件不起作用(结果始终为 0),而使用AVAsset
的解决方案获得了所有的持续时间我设备上的音频和视频文件。
(然而,有趣的是,两种解决方案的持续时间有时比实际AVAudioPlayer
的 UI 中显示的持续时间多 1 秒。很可能AVAudioPlayer
对显示的持续时间使用非标准舍入例程。)
答案中的示例代码如何在 iOS 中获取音频文件的持续时间? . 这是最好的答案。
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:audioFileURL options:nil];
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:mp3_url options:nil];
[audioAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
NSLog(@"duration:%f",audioDurationSeconds);
}];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.