如何获取音频文件的持续时间?
我可以创建一个AVAudioPlayer对象,用URL初始化它,然后获取持续时间,但这种方法太麻烦了。有没有更简单的方法?
谢谢。
如何获取音频文件的持续时间?
我可以创建一个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。
您可以使用Audio File Services函数。有一个属性可用于获取预计的持续时间。 代码:
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);
你可以在这里查看文档:这里。将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)
如果您了解有关音频文件的信息(采样率、位深度、通道数),并且它是未压缩的格式(WAV/AIFF),那么您可以从文件大小计算出大致持续时间:
持续时间(秒)=(文件长度-猜测100字节的文件头大小)/(采样率*(位深度*通道数/8))
这取决于文件类型。如果是WAV格式的文件,您可以找到文件头并确定播放持续时间。如果是压缩格式(*.mp3等),最好使用您提到的方法。
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:mp3_url options:nil];
[audioAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
NSLog(@"duration:%f",audioDurationSeconds);
}];
这是来自iOS中如何获取音频文件的持续时间?的最佳答案示例代码。
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:audioFileURL options:nil];
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
如果有人想要获取音频和视频文件的时长,可以看一下另一篇帖子中的这个答案,它使用了AVAsset
:
https://dev59.com/fm435IYBdhLWcg3wxDL_#7052147
使用 AudioFileGetProperty
(像这里的其他两个主要答案一样)来获取A/V文件的持续时间在我的设备上无法为一些 .mov 文件工作(结果始终为0),而使用 AVAsset
的解决方案可以获取我设备上所有音频和视频文件的持续时间。
(有趣的是,不过,从这两种解决方案中获得的持续时间有时比实际 AVAudioPlayer
UI 中显示的持续时间多1秒。最可能是 AVAudioPlayer
使用了非标准舍入例程来显示持续时间。)