微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PhotoData中的视频无法播放

如何解决PhotoData中的视频无法播放

我正在建立一个照片/视频选择器,使用以下代码从手机中获取所有视频

func fetchVideos() -> AnyPublisher<[Video],Never> {
    Future { promise in
        let options = PHFetchOptions()
        options.sortDescriptors = [NSSortDescriptor(key: "creationDate",ascending: false)]
            
        var videos = [Video]()
            
        PHAsset.fetchAssets(with: .video,options: options).enumerateObjects { asset,_,_ in
            videos.append(Video(asset: asset))
        }
            
        promise(.success(videos))
    }
    .erasetoAnyPublisher()
}

用户点击视频后,我会使用以下代码从PHAsset中获取AVAset

func fetchAVAsset(_ completion: @escaping (AVAsset?) -> Void) {
    let options = PHVideoRequestOptions()
    options.isNetworkAccessAllowed = true

    PHImageManager.default().requestAVAsset(forVideo: asset,options: options) { avAsset,_ in
        dispatchQueue.main.async {
            completion(avAsset)
        }
    }
}

我注意到视频存储在两个不同的地方

  • 文件:///var/mobile/Media/DCIM/100APPLE/IMG_0813.MP4
  • file:///var/mobile/Media/PhotoData/Metadata/DCIM/100APPLE/IMG_0787.medium.MP4

以前路径中存储的视频运行正常。后一条路径中存储的视频无法播放。我正在尝试在AVPlayerViewController中播放它们,但它显示一个划掉的播放按钮,没有视频。为什么?

解决方法

我遇到了同样的问题。如果我和你一起请求它似乎只获取元信息。当我尝试更改 deliveryMode 和 version 时,我能够正确编辑和播放。

let options: PHVideoRequestOptions = PHVideoRequestOptions()
options.version = .original
options.deliveryMode = .highQualityFormat
options.isNetworkAccessAllowed = true

    
PHImageManager.default().requestAVAsset(forVideo:self.videoAssets[0],options: options,resultHandler: { (asset,audioMix,info) in
        DispatchQueue.main.async {
            if let urlAsset = asset as? AVURLAsset {
                
             // asset,urlAsset
                
            }
        }
})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。