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

iPhone:获取音频文件的持续时间,iphone,cocoa-touch,Iphone,Cocoa Touch,获取音频文件持续时间的最简单方法是什么 我可以创建一个AVAudioPlayer的对象,用URL初始化它,然后获得持续时间,但是这种方法太长了。有没有更简单的方法 谢谢。如果您知道有关音频文件的任何信息(采样率、位深度、通道计数),并且它是未压缩格式(WAV/AIFF),那么您可以根据文件大小计算/近似/持续时间: 长度(以秒为单位)=(文件长度-猜测(头为100字节)/(采样器*(比特深度*通道计数/8))它取决于文件类型。如果是WAV文件,您可以找到文件的标题,并通过这种方式确定播放持续时间

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

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


谢谢。

如果您知道有关音频文件的任何信息(采样率、位深度、通道计数),并且它是未压缩格式(WAV/AIFF),那么您可以根据文件大小计算/近似/持续时间:


长度(以秒为单位)=(文件长度-猜测(头为100字节)/(采样器*(比特深度*通道计数/8))

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

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

    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);
您可以检查文档

代码是否正确

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。

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

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

(然而,有趣的是,两种解决方案的持续时间有时比实际
AVAudioPlayer
的UI中显示的持续时间长1秒。最有可能的是
AVAudioPlayer
在显示的持续时间内使用非标准的取整例程。)

来自answer的示例代码。这是最好的答案

AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:audioFileURL options:nil]; 
CMTime audioDuration = audioAsset.duration; 
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);

将AVAudioPlayer与Swift结合起来变得非常简单(我正在迁移下面的一个领域表,但你知道了):


100字节的头?《圣经》第44章发生了什么事?:)14年过去了,我应该知道得更清楚,但就在上个月,我花了半天的时间试图弄清楚我声音开头的那点咔哒声是从哪里来的。我使用的是快速而肮脏的方法,假设只有44字节的头。我又一次吸取了教训。你可以使用dataOffset,我猜它表示头的大小<代码>SInt64数据偏移量=0;UInt32 dataOffsetSize=sizeof(dataOffset);AudioFileStreamGetProperty(inAudioFileStream、kAudioFileStreamProperty_DataOffset和dataOffsetSize和DataOffset)谢谢,但我不明白,为什么每次outDataSize等于0时我都会得到?谢谢你的解决方案,我发现了问题所在。嘿,这一点都不公平,用实际知识来获取检查,而不是对你从未使用过的操作系统的模糊猜测。:)@伊利亚:很高兴它成功了@音乐创世:我必须用实际知识来回答一些问题!明白了…数据类型必须是Float64而不是UIInt64!可能与我编写objective-c已经一天了,所以请原谅这个新手问题。如何将outDataSize转换为一个包含毫秒的int。
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)
 AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:mp3_url options:nil];
                    [audioAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{
                        CMTime audioDuration = audioAsset.duration;
                        float audioDurationSeconds = CMTimeGetSeconds(audioDuration);

                        NSLog(@"duration:%f",audioDurationSeconds);
                    }];