NSDictionary* fileAttributes =
[[NSFileManager defaultManager] attributesOfItemAtPath:filename
error:nil]
通过文件属性键,您可以获取日期、大小等信息。但是如何获取持续时间?
NSDictionary* fileAttributes =
[[NSFileManager defaultManager] attributesOfItemAtPath:filename
error:nil]
通过文件属性键,您可以获取日期、大小等信息。但是如何获取持续时间?
duration
属性从AVAsset实例获取持续时间。AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:audioFileURL options:nil];
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
FigByteFlumeCustomURLOpen signalled err=-12936 (kFigByteFlumeError_BadState) (no provider) at /SourceCache/CoreMedia/CoreMedia-1562.235/Prototypes/FigHTTP/FigByteFlumeCustomURL.c line 1486
。
下面John Goodstadt的答案对我有效。 - MaksimAVAsynchronousKeyValueLoading
中的方法包装您的AVAsset
和AVAssetTrack
访问。 - WeZZard对于仍在寻找的人。 基于答案,Swift 4的代码(包括从苹果文档中异步加载取值):
let audioAsset = AVURLAsset.init(url: yourURL, options: nil)
audioAsset.loadValuesAsynchronously(forKeys: ["duration"]) {
var error: NSError? = nil
let status = audioAsset.statusOfValue(forKey: "duration", error: &error)
switch status {
case .loaded: // Sucessfully loaded. Continue processing.
let duration = audioAsset.duration
let durationInSeconds = CMTimeGetSeconds(duration)
print(Int(durationInSeconds))
break
case .failed: break // Handle error
case .cancelled: break // Terminate processing
default: break // Handle all other cases
}
}
您可以使用 Swift 实现相同的功能:
let audioAsset = AVURLAsset.init(url: audioFileURL, options: nil)
let duration = audioAsset.duration
let durationInSeconds = CMTimeGetSeconds(duration)
为了完整性 - 获取mp3文件持续时间的另一种方法是:
NSURL * pathToMp3File = ...
NSError *error = nil;
AVAudioPlayer* avAudioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:pathToMp3File error:&error];
double duration = avAudioPlayer.duration;
avAudioPlayer = nil;
我使用过这个,没有明显的延迟。
Swift 5.0 + iOS 13:这是我遇到的唯一可行方法(采用@John Goodstadt提供的Swift解决方案)。目前我不确定原因,但使用以下代码记录音频文件(在我的情况下是语音备忘录)和接收音频文件之间平均有0.2秒的差异。
do {
let audioPlayer = try AVAudioPlayer(contentsOf: fileURL)
return CGFloat(audioPlayer.duration)
} catch {
assertionFailure("Failed crating audio player: \(error).")
return nil
}
iOS 15+解决方案
如果可以的话,请尝试这个更新的方法:
let asset = AVURLAsset(url: fileURL, options: nil)
// Returns a CMTime value.
let duration = try await asset.load(.duration)
// An array of AVMetadataItem for the asset.
let metadata = try await asset.load(.metadata)
// A CMTime value and an array of AVMetadataItem.
let (duration, metadata) = try await asset.load(.duration, .metadata)
guard let assetReader = try? AVAssetReader(asset: audioAsset) {
return nil
}
let duration = Double(assetReader.asset.duration.value)
let timescale = Double(assetReader.asset.duration.timescale)
let totalDuration = duration / timescale
print(totalDuration)
AVAudioRecorder
录制了一个线性PCM文件(.pcm)。我借助Farhad Malekpour的帮助获取持续时间。也许这可以帮到你:
iPhone: 获取音频文件的持续时间
NSURL *fileUrl = [NSURL fileURLWithPath:yourFilePath];
AudioFileID fileID;
OSStatus result = AudioFileOpenURL((__bridge CFURLRef)fileUrl,kAudioFileReadPermission, 0, &fileID);
Float64 duration = 0; //seconds. the duration of the audio.
UInt32 ioDataSize = sizeof(Float64);
result = AudioFileGetProperty(fileID, kAudioFilePropertyEstimatedDuration,
&ioDataSize, &duration);
AudioFileClose(fileID);
if(0 == result) {
//success
}
else {
switch (result) {
case kAudioFileUnspecifiedError:{
//
} break;
// other cases...
default:
break;
}
}
我其实发现您可以直接使用“从音乐获取详细信息”块,并将其设置为“获取 ”的持续时间,其中 可以是来自提示的 mp3 输入,指向 mp3 的链接,共享表单中的 mp3 等等。