Swift - 如何获取 .Mov 格式?

Posted

技术标签:

【中文标题】Swift - 如何获取 .Mov 格式?【英文标题】:Swift - How to fetch a .Mov format? 【发布时间】:2019-01-09 16:33:09 【问题描述】:

我找到了很多关于使用

获取视频或图像的解决方案
phfetchOptions.predicate = NSPredicate(format : "mediaType = %d" , PHAssetMediaType.video.rawvalue)

还有一个PHAssetMediaSubtype,这与我正在寻找的非常不同。

如何准确地从PHAsset 中的所有其他格式获取 .Mov 文件的数量

我已经接近解决方案,但我想这不是获得计数的正确方法。创建多个后台调用的视频数量,而不是该过程应该在一个异步调用中完成。有什么建议吗?

 private func getMovVideosCount() 

    let fetchOptions = PHFetchOptions()

    fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.video.rawValue)
    var count : Int = 0
    let imagesAndVideos = PHAsset.fetchAssets(with: fetchOptions)
    for i in 0..<imagesAndVideos.count 
        let videoRequestOptions = PHVideoRequestOptions()
        PHImageManager.default().requestPlayerItem(forVideo: imagesAndVideos[i], options: videoRequestOptions)  (playerItem, result) in
            let currentVideoUrlAsset = playerItem?.asset as?  AVURLAsset
            if let currentVideoFilePAth = currentVideoUrlAsset?.url
                let lastObject = currentVideoFilePAth.pathExtension
                if lastObject == "MOV" 
                    count += 1
                
            
            print(Thread.isMainThread) // false 
        
    
    print(Thread.isMainThread) // true

【问题讨论】:

【参考方案1】:

这个解决方案给出了.MOV的计数并解决了调度组的并发问题。

private func getMovVideosCount() 

let fetchOptions = PHFetchOptions()
let dispatchgroup = DispatchGroup()
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.video.rawValue)
var count : Int = 0
let imagesAndVideos = PHAsset.fetchAssets(with: fetchOptions)
for i in 0..<imagesAndVideos.count 
    dispatchgroup.start()
    let videoRequestOptions = PHVideoRequestOptions()
    PHImageManager.default().requestPlayerItem(forVideo: imagesAndVideos[i], options: videoRequestOptions)  (playerItem, result) in
        let currentVideoUrlAsset = playerItem?.asset as?  AVURLAsset
        if let currentVideoFilePAth = currentVideoUrlAsset?.url
            let lastObject = currentVideoFilePAth.pathExtension
            if lastObject == "MOV" 
                count += 1
            
        
        print(Thread.isMainThread) // false 
      dispatchgroup.leave()
    

dispatchgroup.notify()
print(Thread.isMainThread) // true

【讨论】:

以上是关于Swift - 如何获取 .Mov 格式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中从UIImage获取图像扩展/格式

如何从swift中的时间戳获取日期格式

如何从 iOS 9 和 Objective C 中的 .MOV 文件中获取缩略图?

如何在 Swift 4 中使用 FetchedResultsController 获取 DateSectionTitles

如何从 Icloud Swift 上的文件中获取数据

如何在 iOS Swift 中获取 XML 数据并在 tableview 中绑定?