objective c - Conversión de CMTime a tiempo legible por humanos en object-c
objective-c ios (9)
Así que tengo un CMTime de un video. ¿Cómo lo convierto en una buena cadena como en la etiqueta de duración del video en la aplicación de fotos? ¿Hay algunos métodos de conveniencia que manejan esto? Gracias.
AVURLAsset* videoAsset = [AVURLAsset URLAssetWithURL:url options:nil];
CMTime videoDuration = videoAsset.duration;
float videoDurationSeconds = CMTimeGetSeconds(videoDuration);
Aquí está el código para obtener segundos de cmtime
NSLog(@"seconds = %f", CMTimeGetSeconds(cmTime));
Basado en la combinación de la pregunta y los comentarios anteriores, esto es 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];
Por ejemplo, puede usar NSDate y su método de descripción. Puede especificar cualquier formato de salida que desee.
> `
// 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];`
Puedes usar CMTimeCopyDescription
, funciona muy bien.
NSString *timeDesc = (NSString *)CMTimeCopyDescription(NULL, self.player.currentTime);
NSLog(@"Description of currentTime: %@", timeDesc);
edición: está bien, leí la pregunta demasiado rápido, esto no es lo que buscaba, pero podría ser útil de todos modos para la depuración.
edit: como comentó @bcattle, la implementación que sugerí contiene una pérdida de memoria con ARC. Aquí la versión corregida:
NSString *timeDesc = (NSString *)CFBridgingRelease(CMTimeCopyDescription(NULL, self.player.currentTime));
NSLog(@"Description of currentTime: %@", timeDesc);
Siempre hay una extensión;)
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)
}
}
}
usar
videoPlayer?.addPeriodicTimeObserverForInterval(CMTime(seconds: 1, preferredTimescale: 1), queue: dispatch_get_main_queue()) { time in
print(time.durationText)
}
Swift 3.0 ios 10 respuesta basada en la respuesta de ...
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)
}
}
}
También puede usar esto para obtener la duración del video en formato de texto si no necesita un formato de fecha
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];
Una forma más sencilla (sin usar NSDate y NSDateFormatter) para hacer esto:
Utilizando 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)]")
}
Swift 3:
let time = kCMTimeZero
let timeString = time.toString()