Ios PhotoData中的视频不可播放
我正在构建一个照片/视频采集器,使用以下代码从手机中获取所有视频Ios PhotoData中的视频不可播放,ios,swift,avplayerviewcontroller,phasset,phimagemanager,Ios,Swift,Avplayerviewcontroller,Phasset,Phimagemanager,我正在构建一个照片/视频采集器,使用以下代码从手机中获取所有视频 func fetchVideos() -> AnyPublisher<[Video], Never> { Future { promise in let options = PHFetchOptions() options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending
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()
}
我注意到视频存储在两个不同的地方
- file:///var/mobile/Media/DCIM/100APPLE/IMG_0813.MP4
- file:///var/mobile/Media/PhotoData/Metadata/DCIM/100APPLE/IMG_0787.medium.MP4
存储在前一条路径中的视频工作正常。存储在后一路径的视频不可播放。我试图在AVPlayerViewController中播放它们,但它会显示一个划掉的播放按钮,并且没有视频。为什么?我也有同样的问题。如果我向你提出请求,它似乎只获取元信息。当我尝试更改deliveryMode和版本时,我能够正确地编辑和播放
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
}
}
})
我也有同样的问题。带有.medium.MP4的视频是从iCloud下载的视频,表面上质量中等。但是当我试图阅读它们时,Avassetrader失败了。您找到解决方案了吗?使用PHImageManager.default().requestPlayerItem(forVideo:options)也找到了同样的解决方案。我得到一个avPlayerItem.status失败的消息,错误代码=257,说明我没有查看该文件的权限。
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
}
}
})