我想获得一个AVAsset视频文件大小,而不是视频的分辨率,但文件重量是KB.
一个解决方案是从持续时间和estimatedDataRate计算估计的文件大小,但这似乎只是为了获得文件大小.
我已经检查了嵌入AVAssetTrack其中的所有数据似乎没有在那里.即使是估计的文件大小也会很好.
Cod*_*der 13
这是一个简单的Swift 4.x/3.x扩展,可以获得任何大小AVURLAsset:
import AVFoundation
extension AVURLAsset {
var fileSize: Int? {
let keys: Set<URLResourceKey> = [.totalFileSizeKey, .fileSizeKey]
let resourceValues = try? url.resourceValues(forKeys: keys)
return resourceValues?.fileSize ?? resourceValues?.totalFileSize
}
}
Run Code Online (Sandbox Code Playgroud)
这将返回一个可选的Int,因为这两个resourceValues.fileSize和resouceValues.totalFileSize返回可选的INTS.
虽然可以修改它以返回0而不是nil,但我选择不这样做,因为那不准确.您不确定它的大小是0,您只是无法获得该值.
打电话给它:
let asset = AVURLAsset(url: urlToYourAsset)
print(asset.fileSize ?? 0)
Run Code Online (Sandbox Code Playgroud)
如果大小返回nil,则它将打印0,如果您选择,则返回不同的值.
使用您的方法,我得到正确的答案.我发布这个给任何看起来的人,我期待在IPOD库中为AVAssets提供一个更简单的替代方案
AVURLAsset* asset;
asset = [[AVURLAsset alloc]initWithURL:realAssetUrl options:nil];
NSArray *tracks = [asset tracks];
float estimatedSize = 0.0 ;
for (AVAssetTrack * track in tracks) {
float rate = ([track estimatedDataRate] / 8); // convert bits per second to bytes per second
float seconds = CMTimeGetSeconds([track timeRange].duration);
estimatedSize += seconds * rate;
}
float sizeInMB = estimatedSize / 1024 / 1024;
float sizeinGB = sizeInMB / 1024;
Run Code Online (Sandbox Code Playgroud)
这给了我2.538 GB,这是我在iTunes中看到的.
我通过请求文件 url 的大小解决了这个问题。下面的示例将提供字节数。只需将该数字除以 1024 即可得到 KB 数。
如果需要获取单个文件的文件大小,可以通过构造该文件的文件 URL 并直接查询该 URL 的属性来实现。
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
NSNumber *fileSizeValue = nil;
[fileURL getResourceValue:&fileSizeValue
forKey:NSURLFileSizeKey
error:nil];
if (fileSizeValue) {
NSLog(@"value for %@ is %@", fileURL, fileSizeValue);
}
Run Code Online (Sandbox Code Playgroud)