为啥我的 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 文件的持续时间

AVURLAsset的缓存行为

为啥 AVURLAsset 不加载文件?

为啥我的 LINQ INSERTS 没有在 SQL Server CE 3.5 中持续存在?

从 url (AVURLAsset) 加载后,我的肖像视频会旋转