2012-12-14 7 views
6

Sto registrando audio utilizzando AVAudioRecorder e ora voglio ottenere la durata esatta del mio audio registrato, come posso ottenerlo.Come posso ottenere il tempo del mio audio registrato in iphone?

Ho provato questo:

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

Ma il mio time NULL ritorno variabile e durationInSeconds ritorno 'nan', che cosa significa per nan.

UPDATE

user1903074 risposta ha risolto il mio problema, ma solo per curiosità, è Thair un modo per farlo senza AVAudioplayer.

+1

nan significa non un numero. anche l'asset NULL? – geraldWilliam

+0

non so che grazie. –

risposta

13

Se si utilizza AVAudioPlayer con AVAudioRecorder di quello che si può ottenere il audioPlayer.duration e ottenere il tempo.

come questo.

NSError *playerError; 

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

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

Ma solo se si utilizza AVAudioPlayer con AVAudioRecorder.

UPDATE

Oppure si può fare in questo modo.

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

acciaio è possibile ottenere un certo ritardo siccome il loro è un certo valore microsecondi, e non so come agganciarlo .ma questo è tutto.

+0

Sì, sto usando AVAudioPlayer con AVAudioRecorder. –

+0

questo lavoro ottimo –

+2

@lipid: Ma penso che la durata del suono registrato non sarà sempre la stessa del suono riprodotto usando AVAudioPlayer. (Correggimi se sbaglio!) – iShwar

1

La mia soluzione è semplicemente per tenere traccia della data di inizio e, alla fine, calcolare il tempo trascorso. Ha funzionato per me perché l'utente sta avviando e fermando il registratore.

Nella classe registratore

NSDate* startTime; 
NSTimeInterval duration; 

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

} 

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

So che la domanda iniziale era alla ricerca di una risposta in Objective-C, ma per chi cerca di farlo in Swift, questo funziona con la Swift 4.0:

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

Supponendo di disporre di un registratore valido, si otterrà un valore di durata, che viene indicato come TimeInterval.

Problemi correlati