11

を使用してオーディオを録音しています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.

4

6 に答える 6

16

AVAudioPlayerでご利用の場合は、お時間をAVAudioRecorder頂く場合がございますaudioPlayer.duration

このような。

 NSError *playerError;

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

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

AVAudioPlayerただし、 を使用している場合に限りますAVAudioRecorder

アップデート

または、このようにすることもできます。

//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];
    }
}

鋼はマイクロ秒の値であるため、遅延が発生する可能性があり、それをクリップする方法がわかりません.しかし、それだけです.

于 2012-12-14T05:23:02.393 に答える
2

私の解決策は、単純に開始日を追跡し、最後に経過時間を計算することです。ユーザーがレコーダーを開始および停止しているため、私にとってはうまくいきました。

リコーダークラスでは

NSDate* startTime;
NSTimeInterval duration;

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

}

-(void) stopRecording
{
   //stop the recorder
   ...
   duration = [[NSDate date] timeIntervalSinceDate:startRecording];
}
于 2014-05-29T10:07:43.980 に答える
0

Swift 5.3に対する@Dilipの優れた回答を更新します。

//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)
     }
 }

これは一緒に使用する必要があります

    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSession.Category.playAndRecord, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
        audioSession.requestRecordPermission({ (isGranted: Bool) in
            
        })
    } catch  {}
于 2020-12-17T10:23:03.750 に答える