问题描述
我正在建立一个照片/视频选择器,使用以下代码从手机中获取所有视频
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
}
}
})