我有一个视频的CMTime。如何将它转换为像“照片”应用程序中视频时间持续标签中那样的漂亮字符串?是否有一些方便的方法可以处理这个问题?谢谢。
AVURLAsset* videoAsset = [AVURLAsset URLAssetWithURL:url options:nil];
CMTime videoDuration = videoAsset.duration;
float videoDurationSeconds = CMTimeGetSeconds(videoDuration);
我有一个视频的CMTime。如何将它转换为像“照片”应用程序中视频时间持续标签中那样的漂亮字符串?是否有一些方便的方法可以处理这个问题?谢谢。
AVURLAsset* videoAsset = [AVURLAsset URLAssetWithURL:url options:nil];
CMTime videoDuration = videoAsset.duration;
float videoDurationSeconds = CMTimeGetSeconds(videoDuration);
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];
总有办法解决的 ;)
import CoreMedia
extension CMTime {
var durationText:String {
let totalSeconds = Int(CMTimeGetSeconds(self))
let hours:Int = Int(totalSeconds / 3600)
let minutes:Int = Int(totalSeconds % 3600 / 60)
let seconds:Int = Int((totalSeconds % 3600) % 60)
if hours > 0 {
return String(format: "%i:%02i:%02i", hours, minutes, seconds)
} else {
return String(format: "%02i:%02i", minutes, seconds)
}
}
}
使用
videoPlayer?.addPeriodicTimeObserverForInterval(CMTime(seconds: 1, preferredTimescale: 1), queue: dispatch_get_main_queue()) { time in
print(time.durationText)
}
您可以使用CMTimeCopyDescription
,它的效果非常好。
NSString *timeDesc = (NSString *)CMTimeCopyDescription(NULL, self.player.currentTime);
NSLog(@"Description of currentTime: %@", timeDesc);
编辑:好的,我太快阅读了问题,这不是你想要的,但是对于调试可能仍然有帮助。
编辑:如@bcattle评论所述,我建议的实现在ARC下存在内存泄漏。这里是已更正的版本:
NSString *timeDesc = (NSString *)CFBridgingRelease(CMTimeCopyDescription(NULL, self.player.currentTime));
NSLog(@"Description of currentTime: %@", timeDesc);
(NSString*)CFBridgingRelease(CMTimeCopyDescription(NULL, self.player.currentTime))
。 - bcattle基于上面的问题和评论,这是简明扼要的:
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];
基于Swift 3.0和iOS 10的答案,参考codingrhythm的回答...
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)
}
}
}
我使用的简单扩展可以显示视频文件的时长。
import CoreMedia
extension CMTime {
var stringValue: String {
let totalSeconds = Int(self.seconds)
let hours = totalSeconds / 3600
let minutes = totalSeconds % 3600 / 60
let seconds = totalSeconds % 3600 % 60
if hours > 0 {
return String(format: "%i:%02i:%02i", hours, minutes, seconds)
} else {
return String(format: "%02i:%02i", minutes, seconds)
}
}
}
extension CMTime {
var timeString: String {
let sInt = Int(seconds)
let s: Int = sInt % 60
let m: Int = (sInt / 60) % 60
let h: Int = sInt / 3600
return String(format: "%02d:%02d:%02d", h, m, s)
}
var timeFromNowString: String {
let d = Date(timeIntervalSinceNow: seconds)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "mm:ss"
return dateFormatter.string(from: d)
}
}
> `
// 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];`
NSDate* d = [[NSDate alloc] initWithTimeIntervalSinceNow:seconds];
创建NSDate对象;
然后指定输出格式
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"HH:mm:ss"];
最后用NSString* result = [dateFormatter stringWithDate:d];
获取输出结果。 - Andreyz4kNSDate* d = [NSDate dateWithTimeIntervalSince1970:audioDurationSeconds]; //Then specify output format NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; [dateFormatter setDateFormat:@"HH:mm:ss"];
设置时区和更改到1973的引用似乎可以工作。但是如果我不想在小时数前有多余的零呢? - randomor这里是从CMTime获取秒数的代码
NSLog(@"seconds = %f", CMTimeGetSeconds(cmTime));
Swift 3:
let time = kCMTimeZero
let timeString = time.toString()
dTotalSeconds % 3600 % 60
还等同于dTotalSeconds % 60
:) - Ja͢ck