iOS开发:以编程方式导航视频章节

发布于 2025-02-06 20:20:02 字数 956 浏览 0 评论 0原文

我想编程浏览MP4视频的章节。 这些章节在QuickTime中工作,因此我认为视频格式不是问题。

此页面中的代码应返回章节的数组,但仅返回一个空的章节: https://developer.apple.com/documentation/avfoundation/media_playback/presenting_chapter_markers

let asset = AVAsset(url: <# Asset URL #>)
let chapterLocalesKey = "availableChapterLocales"
 
asset.loadValuesAsynchronously(forKeys: [chapterLocalesKey]) {
    var error: NSError?
    let status = asset.statusOfValue(forKey: chapterLocalesKey, error: &error)
    if status == .loaded {
        let languages = Locale.preferredLanguages
        let chapterMetadata = asset.chapterMetadataGroups(bestMatchingPreferredLanguages: languages)
        // Process chapter metadata.
    }
    else {
        // Handle other status cases.
    }
}

有没有人知道该怎么做?

I want to programmatically navigate chapters of a mp4 video.
The chapters work in QuickTime, so I assume the video format isn't the issue.

The code from this page should return an array of the chapters but only returns an empty one instead:
https://developer.apple.com/documentation/avfoundation/media_playback/presenting_chapter_markers

let asset = AVAsset(url: <# Asset URL #>)
let chapterLocalesKey = "availableChapterLocales"
 
asset.loadValuesAsynchronously(forKeys: [chapterLocalesKey]) {
    var error: NSError?
    let status = asset.statusOfValue(forKey: chapterLocalesKey, error: &error)
    if status == .loaded {
        let languages = Locale.preferredLanguages
        let chapterMetadata = asset.chapterMetadataGroups(bestMatchingPreferredLanguages: languages)
        // Process chapter metadata.
    }
    else {
        // Handle other status cases.
    }
}

Has anyone an idea how to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

丢了幸福的猪 2025-02-13 20:20:02

基于文档链接中的示例代码:

func chapters(from avAsset: AVAsset) async -> [Chapter] {
    guard let locales = try? await avAsset.load(.availableChapterLocales) else { return [] }
    guard let locale = locales.first else { return [] }
    guard let groups = try? await avAsset.loadChapterMetadataGroups(withTitleLocale: locale, containingItemsWithCommonKeys: [.commonKeyArtwork]) else { return [] }
    
    return groups.map { group in
        let titleItems = AVMetadataItem.metadataItems(from: group.items, filteredByIdentifier: .commonIdentifierTitle)
        // Retrieve the artwork metadata items.
        let artworkItems = AVMetadataItem.metadataItems(from: group.items, filteredByIdentifier: .commonIdentifierArtwork)

        let title = titleItems.first?.stringValue ?? ""
        let thumbnailData = artworkItems.first?.dataValue

        return Chapter(cmTime: group.timeRange.start, title: title, thumbnailData: thumbnailData)
    }
}

Based on the sample code from the documentation link:

func chapters(from avAsset: AVAsset) async -> [Chapter] {
    guard let locales = try? await avAsset.load(.availableChapterLocales) else { return [] }
    guard let locale = locales.first else { return [] }
    guard let groups = try? await avAsset.loadChapterMetadataGroups(withTitleLocale: locale, containingItemsWithCommonKeys: [.commonKeyArtwork]) else { return [] }
    
    return groups.map { group in
        let titleItems = AVMetadataItem.metadataItems(from: group.items, filteredByIdentifier: .commonIdentifierTitle)
        // Retrieve the artwork metadata items.
        let artworkItems = AVMetadataItem.metadataItems(from: group.items, filteredByIdentifier: .commonIdentifierArtwork)

        let title = titleItems.first?.stringValue ?? ""
        let thumbnailData = artworkItems.first?.dataValue

        return Chapter(cmTime: group.timeRange.start, title: title, thumbnailData: thumbnailData)
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文