2012-05-18 12 views
22

Quindi ho un CMTime da un video. Come faccio a convertirlo in una bella stringa come nell'etichetta durata del video nell'app Foto. Esistono alcuni metodi di comodità che gestiscono questo? Grazie.Conversione di CMTime in tempo leggibile in ogg-c

AVURLAsset* videoAsset = [AVURLAsset URLAssetWithURL:url options:nil]; 
CMTime videoDuration = videoAsset.duration; 
float videoDurationSeconds = CMTimeGetSeconds(videoDuration); 

risposta

4

Ad esempio, è possibile utilizzare NSDate e il relativo metodo di descrizione. È possibile specificare qualsiasi formato di output desiderato.

> ` 
// First, create NSDate object using 
NSDate* d = [[NSDate alloc] initWithTimeIntervalSinceNow:seconds]; 
// Then specify output format 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"HH:mm:ss"]; 
// And get output with 
NSString* result = [dateFormatter stringWithDate:d];` 
+0

è possibile specificare utilizzando un certo codice? sono un noob qui. Grazie. – randomor

+2

Per prima cosa creare l'oggetto NSDate usando 'NSDate * d = [[NSDate alloc] initWithTimeIntervalSinceNow: seconds];' Quindi specificare il formato di output 'NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat: @ "HH: mm: ss"]; ' E ottieni output con ' NSString * result = [dateFormatter stringWithDate: d]; ' – Sangvin

+0

Grazie. funziona, ho usato stringFromDate per l'ultimo metodo, ma il problema è che la durata era 4.168334, ma l'output è 0:36:15 ... Mi sono perso qualcosa? – randomor

12

È possibile utilizzare CMTimeCopyDescription, funziona davvero bene.

NSString *timeDesc = (NSString *)CMTimeCopyDescription(NULL, self.player.currentTime); 
NSLog(@"Description of currentTime: %@", timeDesc); 

edit: va bene, ho letto la domanda troppo veloce, questo non è ciò che il vostro voleva, ma potrebbe essere utile comunque per debuging.

modifica: come @bcattle ha commentato, l'implementazione suggerita contiene una perdita di memoria con ARC. Ecco la versione corretta:

NSString *timeDesc = (NSString *)CFBridgingRelease(CMTimeCopyDescription(NULL, self.player.currentTime)); 
NSLog(@"Description of currentTime: %@", timeDesc); 
+1

Sì! perfetto anche per il depuratore semplice e CMTimeRangeCopyDescription, grazie! – Firula

+3

Questo è fantastico! Aggiornamento secondario, è necessario eseguire un cast bridged: '(NSString *) CFBridgingRelease (CMTimeCopyDescription (NULL, self.player.currentTime))' – bcattle

38

È possibile utilizzare questo come bene per ottenere una durata video in un formato di testo se non richiedono un formato di data

AVURLAsset *videoAVURLAsset = [AVURLAsset assetWithURL:url]; 
CMTime durationV = videoAVURLAsset.duration; 

NSUInteger dTotalSeconds = CMTimeGetSeconds(durationV); 

NSUInteger dHours = floor(dTotalSeconds/3600); 
NSUInteger dMinutes = floor(dTotalSeconds % 3600/60); 
NSUInteger dSeconds = floor(dTotalSeconds % 3600 % 60); 

NSString *videoDurationText = [NSString stringWithFormat:@"%i:%02i:%02i",dHours, dMinutes, dSeconds]; 
+1

'dTotalSeconds% 3600% 60' è anche' dTotalSeconds% 60' :) –

11

Sulla base combinazione di domanda e osservazioni di cui sopra , questo è conciso:

AVURLAsset* videoAsset = [AVURLAsset URLAssetWithURL:url options:nil]; 
CMTime videoDuration = videoAsset.duration; 
float videoDurationSeconds = CMTimeGetSeconds(videoDuration); 

NSDate* date = [NSDate dateWithTimeIntervalSince1970:videoDurationSeconds]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; 
[dateFormatter setDateFormat:@"HH:mm:ss"]; //you can vary the date string. Ex: "mm:ss" 
NSString* result = [dateFormatter stringFromDate:date]; 
+2

Ho eseguito alcuni test delle prestazioni e l'utilizzo di NSDateFormatter è 120 volte più lento rispetto all'utilizzo di NSString stringWithFormat (risposta di ceekay). –

+0

Perché non dovresti creare ripetutamente i formattatori. Sono costosi da creare. Creala una volta e mantienila in giro. – uchuugaka

1

qui è il codice per ottenere secondi dal cmtime

NSLog(@"seconds = %f", CMTimeGetSeconds(cmTime)); 
5

C'è sempre un'estensione;)

import CoreMedia 

extension CMTime { 
    var durationText:String { 
     let totalSeconds = CMTimeGetSeconds(self) 
     let hours:Int = Int(totalSeconds/3600) 
     let minutes:Int = Int(totalSeconds % 3600/60) 
     let seconds:Int = Int(totalSeconds % 60) 

     if hours > 0 { 
      return String(format: "%i:%02i:%02i", hours, minutes, seconds) 
     } else { 
      return String(format: "%02i:%02i", minutes, seconds) 
     } 
    } 
} 

da usare

videoPlayer?.addPeriodicTimeObserverForInterval(CMTime(seconds: 1, preferredTimescale: 1), queue: dispatch_get_main_queue()) { time in 
    print(time.durationText) 
} 
0

Swift 3:

let time = kCMTimeZero 
let timeString = time.toString() 
+1

Puoi esporre un po '? – Adrian

+0

Utilizzare il collegamento [modifica] per spiegare come funziona questo codice e non solo fornire il codice, poiché una spiegazione è più probabile che aiuti i futuri lettori. Vedi anche [risposta]. [fonte] (http://stackoverflow.com/users/5244995) –

1

Swift 3.0 ios 10 risposta basata codingrhythm risposta ...

extension CMTime { 
var durationText:String { 
    let totalSeconds = CMTimeGetSeconds(self) 
    let hours:Int = Int(totalSeconds/3600) 
    let minutes:Int = Int(totalSeconds.truncatingRemainder(dividingBy: 3600)/60) 
    let seconds:Int = Int(totalSeconds.truncatingRemainder(dividingBy: 60)) 

    if hours > 0 { 
     return String(format: "%i:%02i:%02i", hours, minutes, seconds) 
    } else { 
     return String(format: "%02i:%02i", minutes, seconds) 
    } 
    } 
} 
+0

c'è un errore, per i minuti, dovrebbe essere: Int (totalSeconds.truncatingRemainder (dividingBy: 3600)/60) –

+0

Grazie Nadi, lo ha aggiornato. – user3069232

0

Un modo più semplice (senza l'utilizzo di NSDate e NSDateFormatter) per fare questo: -

Utilizzando Swift: -

 func updateRecordingTimeLabel() 
     { 

    // Result Output = MM:SS(01:23) 
    let cmTime = videoFileOutput.recordedDuration 
        var durationInSeconds = Int(CMTimeGetSeconds(cmTime)) 
        let durationInMinutes = Int(CMTimeGetSeconds(cmTime)/60) 
        var strDuMin = String(durationInMinutes) 

        durationInSeconds = durationInSeconds-(60*durationInMinutes) 
        var strDuSec = String(durationInSeconds) 

        if durationInSeconds < 10 
        { 
         strDuSec = "0"+strDuSec 
        } 
        if durationInMinutes < 10 
        { 
         strDuMin = "0"+strDuMin 
        } 
    // Output string 
    let str_output = strDuMin+":"+strDuSec 
print("Result Output : [\(str_output)]") 

} 
Problemi correlati