为啥我的 AVURLAsset 没有持续时间?
Posted
技术标签:
【中文标题】为啥我的 AVURLAsset 没有持续时间?【英文标题】:Why doesn't my AVURLAsset have a duration?为什么我的 AVURLAsset 没有持续时间? 【发布时间】:2011-09-16 15:40:39 【问题描述】:在我的 ios 应用 (SDK 5.6) 中,我从一个短视频创建了一个 AVURLAsset,如下所示:
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:assetURL options:nil];
这似乎工作正常。如果我检查 gdb 中的资产,它看起来像这样:
(gdb) po asset
<AVURLAsset: 0x1a1c40, URL = file://localhost/var/mobile/Applications/A2142D8E-BC19-4E0B-A4C8-ABED4F7D4970/Documents/sample_iTunes.mov>
我使用来自 Apple 网站的示例 .mov 文件,存储在应用程序的 Documents 目录中。
我想知道这个视频的持续时间,以便进一步处理,但是当我检查持续时间属性时,我得到了这个:
(gdb) po asset.duration
There is no member named duration.
我做错了什么?还有其他方法可以确定 AVAsset 或 AVAssetTrack 的持续时间吗?
TIA:约翰
【问题讨论】:
【参考方案1】:然而,创建资产并不一定意味着它已经可以使用了。要使用,资产必须已加载其轨道。使用
加载资产[资产 loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] 完成处理程序: ^ // 完成块在这里。 ];
并且数组中应该有一个“持续时间”键。
加载完成后,使用
获取持续时间Float64 durationSeconds = CMTimeGetSeconds([ duration]);
【讨论】:
【参考方案2】:适用于 Swift 3.0 及更高版本
导入 AVFoundation
let asset = AVAsset(url: URL(fileURLWithPath: ("Your File Path here")!))
let totalSeconds = Int(CMTimeGetSeconds(asset.duration))
let minutes = totalSeconds / 60
let seconds = totalSeconds % 60
let mediaTime = String(format:"%02i:%02i",minutes, seconds)
【讨论】:
以上是关于为啥我的 AVURLAsset 没有持续时间?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能在 Playground 中使用 AVURLAsset 从媒体文件中提取数据?
iOS-如何使用 AVAsset 或 AVURLAsset 获取 .mp4 文件的持续时间