如何在iphone中获取录制音频的时间?

时间:2012-12-14 05:05:07

标签: iphone objective-c ios avaudiorecorder

我正在使用AVAudioRecorder录制音频,现在我想获得录制音频的确切持续时间,我该怎么做呢。

我试过这个:

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:avAudioRecorder.url options:nil];
CMTime time = asset.duration;
double durationInSeconds = CMTimeGetSeconds(time);

但我的time变量返回NULL并且durationInSeconds返回' nan' nan,这意味着什么。

更新

user1903074回答已经解决了我的问题,但仅仅是为了好奇,无论如何都可以在没有AVAudioplayer的情况下解决问题。

5 个答案:

答案 0 :(得分:13)

如果您使用AVAudioPlayer AVAudioRecorder而不是audioPlayer.duration并获得时间。

像这样。

 NSError *playerError;

 audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:yoururl error:&playerError];

 NSlog(@"%@",audioPlayer.duration);

但仅当您将AVAudioPlayerAVAudioRecorder一起使用时才会使用。

<强>更新

或者你可以这样做。

//put this where you start recording
     myTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];

// a method for update
- (void)updateTime {
    if([recorder isRecording])
    {

        float minutes = floor(recorder.currentTime/60);
        float seconds = recorder.currentTime - (minutes * 60);

        NSString *time = [[NSString alloc] 
                                    initWithFormat:@"%0.0f.%0.0f",
                                    minutes, seconds];
    }
}
钢铁你可以得到一些延迟,因为它们是一些微秒值,我不知道如何剪辑它。但就是这样。

答案 1 :(得分:1)

我的解决方案只是跟踪开始日期,最后计算通过的时间。 它对我有用,因为用户正在启动和停止录音机。

在录音机课程中

NSDate* startTime;
NSTimeInterval duration;

-(void) startRecording
{
   //start the recorder
   ...
   duration = 0;
   startTime = [NSDate date];

}

-(void) stopRecording
{
   //stop the recorder
   ...
   duration = [[NSDate date] timeIntervalSinceDate:startRecording];
}

答案 2 :(得分:1)

这里的几个答案使用相同的非常糟糕的时间格式,其结果是“0.1”持续 1 秒或“0.60”持续 1 分钟。如果你想要一些让你看起来像 0:01 或 1:00 这样的正常时间的东西,那么使用这个:

let minutes = Int(audioRecorder.currentTime / 60)
let seconds = Int(audioRecorder.currentTime) - (minutes * 60)
let timeInfo = String(format: "%d:%@%d", minutes, seconds < 10 ? "0" : "", seconds)

答案 3 :(得分:0)

我知道最初的问题是在Objective-C中寻找答案,但对于那些希望在Swift中这样做的人来说,这适用于Swift 4.0:

let recorder = // Your instance of an AVAudioRecorder
let player = try? AVAudioPlayer(contentsOf: recorder.url)
let duration = player?.duration ?? 0.0

假设您有一个有效的记录器,那么您将获得一个持续时间值,该值为TimeInterval

答案 4 :(得分:0)

更新@Dilip对Swift 5.3的出色回答:

//put this where you start recording
myTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)


// a method for update
 @objc func updateTime(){
     if recorder.isRecording{
         let minutes = floor(recorder.currentTime/60)
         let seconds = recorder.currentTime - (minutes * 60)
         let timeInfo = String(format: "%0.0f.%0.0f", minutes, seconds)
     }
 }