在Objective-c中将CMTime转换为人类可读时间

ran*_*mor 25 c cocoa-touch objective-c ios cmtime

所以我有一个视频的CMTime.如何将其转换为一个很好的字符串,如照片应用程序中的视频持续时间标签.是否有一些方便的方法来处理这个问题?谢谢.

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

cee*_*kay 38

如果您不需要日期格式,也可以使用此格式以文本格式获取视频时长

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];
Run Code Online (Sandbox Code Playgroud)


Lif*_*ely 12

你可以使用CMTimeCopyDescription,它工作得很好.

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

编辑:好吧,我读的问题太快了,这不是你想要的,但无论如何都可以帮助调试.

编辑:正如@bcattle评论的那样,我建议的实现包含ARC的内存泄漏.这里更正的版本:

NSString *timeDesc = (NSString *)CFBridgingRelease(CMTimeCopyDescription(NULL, self.player.currentTime));
NSLog(@"Description of currentTime: %@", timeDesc);
Run Code Online (Sandbox Code Playgroud)

  • 这很棒!小更新,需要做一个桥接转换:`(NSString*)CFBridgingRelease(CMTimeCopyDescription(NULL,self.player.currentTime))` (3认同)

Bro*_*son 11

基于上述问题和评论的组合,这是简洁的:

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];
Run Code Online (Sandbox Code Playgroud)

  • 我做了一些性能测试,使用NSDateFormatter比使用NSString stringWithFormat(ceekay的答案)慢120倍. (2认同)
  • 因为你不应该重复创建格式化程序.它们的制作成本很高.创建一次并保持它. (2认同)

cod*_*thm 10

总有一个延伸;)

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用

videoPlayer?.addPeriodicTimeObserverForInterval(CMTime(seconds: 1, preferredTimescale: 1), queue: dispatch_get_main_queue()) { time in
    print(time.durationText)
}
Run Code Online (Sandbox Code Playgroud)


use*_*232 6

Swift 3.0 iOS 10答案基于编码节奏的答案...

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)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Nik*_*Kov 5

斯威夫特 4.2 扩展

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)
    }
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*ich 5

我用于显示视频文件持续时间的简单扩展。

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*z4k 4

例如,您可以使用 NSDate 及其描述方法。您可以指定任何您想要的输出格式。

> ` 
// 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];`
Run Code Online (Sandbox Code Playgroud)

  • 首先,使用 `NSDate* d = [[NSDate alloc] initWithTimeIntervalSinceNow:seconds];` 创建 NSDate 对象,然后指定输出格式 `NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"HH:mm:ss"];` 并使用 `NSString* result = [dateFormatter stringWithDate:d];` 获取输出 (2认同)