代码之家  ›  专栏  ›  技术社区  ›  Ilya Suzdalnitski

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

  •  8
  • Ilya Suzdalnitski  · 技术社区  · 15 年前

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

    我可以创建avaudioplayer的对象,用url初始化它,然后获取持续时间,但是这样做太长了。有更简单的方法吗?

    谢谢。

    8 回复  |  直到 6 年前
        1
  •  9
  •   h3dkandi    6 年前

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

        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);
    

    你可以查一下文件 here

        2
  •  14
  •   Farhad Malekpour    12 年前

    正确的代码是

    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。

        3
  •  2
  •   Dave Gamble    15 年前

    如果您知道有关音频文件的任何信息(samplerate、bitsdepth、channel count),并且它是未压缩格式(wav/aiff),则可以从文件大小计算/approximate/duration:

    length_in_seconds=(file_length-guess_100_bytes_for_header)/(samplerate*(bitteth*channel_count/8))。

        4
  •  2
  •   MusiGenesis    15 年前

    这取决于文件类型。如果它是一个wav文件,你可以找到文件的头并以此方式确定播放时间。如果是压缩格式(MP3等),你最好还是坚持你提到的方法。

        5
  •  2
  •   Mazyod    9 年前

    将avaudioplayer和swift结合起来变得很容易(我正在迁移下面的领域表,但您会明白这一点):

    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)
    
        6
  •  1
  •   Community T.Woody    7 年前

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

    https://stackoverflow.com/a/7052147/381233

    使用 AudioFileGetProperty (像这里的其他两个主要答案一样)获取A/V文件的持续时间在少数情况下不起作用。 MOV 当解决方案使用 阿沃斯 获取设备上所有音频和视频文件的持续时间。

    (有趣的是,两个解决方案的持续时间有时比实际用户界面中显示的时间多1秒 AVAudioPlayer . 最有可能的是 音频播放器 在显示的持续时间内使用非标准舍入例程。)

        7
  •  1
  •   Community T.Woody    7 年前

    来自答案的示例代码 How to get the duration of an audio file in iOS? . 这是最好的答案。

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

        8
  •  1
  •   Ishwar Hingu    8 年前
     AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:mp3_url options:nil];
                        [audioAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{
                            CMTime audioDuration = audioAsset.duration;
                            float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
    
                            NSLog(@"duration:%f",audioDurationSeconds);
                        }];