繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM