- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近,开始注意到从照片库导入某些 Assets 时未显示它们。有问题的 Assets 存储在 iCloud 中,不会缓存在设备上。
我相信这是 iOS 14 的问题,因为我从未在 iOS 13 上遇到过这个问题。(我不能 100% 确定,因为我无法将我的个人设备推广到 iOS 13)。
这是我在 中所做的事情iOS 14 :
var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
configuration.filter = PHPickerFilter.videos
let videoPickerController = PHPickerViewController(configuration: configuration)
videoPickerController.delegate = self
present(videoPickerController, animated: true, completion: nil)
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true, completion: nil)
guard results.count > 0 else {
return
}
guard let firstPHAssetIdentifier = results.first?.assetIdentifier else {
fatalError("No asset identifier")
}
let fetchOptions = PHFetchOptions()
guard let phAsset = PHAsset.fetchAssets(withLocalIdentifiers: [firstPHAssetIdentifier], options: fetchOptions).firstObject else {
fatalError("No matching PHAsset")
}
guard phAsset.mediaType == .video else {
fatalError("Asset not of the video type")
}
}
let options = PHVideoRequestOptions()
options.isNetworkAccessAllowed = true
options.progressHandler = { progress, _, _, _ in
print("Progress: \(progress)")
}
PHCachingImageManager.default().requestAVAsset(forVideo: phAsset, options: options) { [weak self] avAsset, _, info in
guard info?[PHImageCancelledKey] == nil && info?[PHImageErrorKey] == nil else {
print("Error or cancelled. Info: \(String(describing: info))")
return
}
guard let avAsset = avAsset else {
print("Asset is nil. Info: \(String(describing: info))")
return
}
guard let videoTrack = avAsset.tracks(withMediaType: .video).first else {
print("Cound not extract video track from AvAsset") // <- My issue
return
}
}
问题 : 通常,当 Assets 来自 iCloud 时,我不会有 videoTrack。 avAsset.duration 也将为 0.0。
最佳答案
我可以通过在我的 iPad 上录制视频来重现这个问题,等到它同步到 iCloud,然后在我的 iPhone SE 2016 上请求 AVAsset。我在 github 上创建了一个 repo 来说明这一点。这是一个 Objective-C 项目,但结论对于 Swift 应该是一样的。 repo 的重要部分位于 https://github.com/Jan-E/ikyle.me-code-examples/blob/master/Photo%20Picker%20ObjC/Photo%20Picker%20ObjC/PHPickerController.m
这是我正在使用的代码:
for (PHAsset *phAsset in assetResults) {
float recordingDuration = phAsset.duration;
NSLog(@"recordingDuration %f", recordingDuration);
NSDate *PHAssetCreationDate = phAsset.creationDate;
NSLog(@"PHAssetCreationDate %@", PHAssetCreationDate);
PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
options.networkAccessAllowed = NO;
[[PHImageManager defaultManager] requestAVAssetForVideo:phAsset
options:options
resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
NSURL *videoURL = (NSURL *)[[(AVURLAsset *)avAsset URL] fileReferenceURL];
NSLog(@"videoURL absoluteString = %@", [videoURL absoluteString]);
NSLog(@"videoURL relativePath = %@", [videoURL relativePath]);
AVURLAsset *avUrl = [AVURLAsset assetWithURL:videoURL];
CMTime time = [avUrl duration];
float recordingDuration;
recordingDuration = time.value/time.timescale;
NSArray *tracks = [avUrl tracksWithMediaType:AVMediaTypeVideo];
NSLog(@"duration %f, tracks %lu", recordingDuration, (unsigned long)tracks.count);
}];
}
当视频仍然只在 iCloud 上时,这些是 NSLog 返回的结果:
result.itemProvider loadFileRepresentationForTypeIdentifier
您可以强制将视频从 iCloud 下载到设备。那么结果如下:
options:nil
我使用的是隐式
networkAccessAllowed = NO
.通过编辑,我明确表示。它还可以解释持续时间 0.0 和轨迹 0。如果允许网络访问,但网络连接失败怎么办?然后你仍然会得到一个有意义的 phAsset.duration 值(来自早期的 iCloud 同步),但没有 avAsset 的实时值。
关于ios - 使用 iCloud PHAsset 请求 AVAsset 返回一个没有 VideoTracks 的 AVAsset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64090158/
最近,开始注意到从照片库导入某些 Assets 时未显示它们。有问题的 Assets 存储在 iCloud 中,不会缓存在设备上。 我相信这是 iOS 14 的问题,因为我从未在 iOS 13 上遇到
有没有办法将数据转换为 AVAsset/AVURLAsset 或更好的 AVPlayerItem? 我找到了一个将 Data 转换为 PHAsset 并需要先将其保存到桌面的答案。 有没有更好的办法?
我有一个适用于 iOS6 及更高版本的音乐播放器应用程序。我的音乐播放器工作正常,它可以在线(流媒体)和离线(本地 mp3 文件)播放音乐。 当我将蓝牙耳机连接到我的设备(iPad 或 iPhone)
给定从 Assets 读取的 CMSampleBuffers 列表,我想调整 Assets 的持续时间,使其长度为原始 Assets 的一半(速度的两倍)。 目前我用于生成新时间戳的函数如下所示: f
我在我的应用程序中使用 AVAsset 并遇到了下一个问题。当我写这样的东西时: AVAsset *audioAsset = [AVAsset assetWithURL:[NSURL fileURLW
我正在我的应用程序中下载和缓存(使用 https://github.com/vdugnist/DVAssetLoaderDelegate )视频。当应用程序启动时,我检查下载的文件,如果它存在,我用本
我想创建像视频 View 一样的照片,在页脚中会有一秒的视频帧。 为此我正在使用这段代码 var imgs : [UIImage] = [] let assetImgGenerate : AVAsse
我有一些简单的 AVFoundation 代码可以将一堆四秒长的 mp4 文件连接在一起,如下所示: func compose(parts inParts: [Part], progress inPr
我已经尝试了很多东西,我也浏览了互联网,但我找不到解决以下问题的方法。Xcode 向我显示此错误: Use of unresolved identifier 'AVAsset' 即使我已经导入了 AV
NSURL* fileURL=[_musicListViewModel fileURLWithModel:model]; NSData* assetData=[NSData dataWithConte
我只想使用 native API(UIKit、AVFoundation、Core Image 等)来过滤 AVAsset,同时在 AVPlayerLayer 或等效的 UI 组件中显示它。我不会使用
我在 Mac 播放器中有视频,视频时长为 31 秒。当我在我的应用程序中使用它并加载该文件时,AVAsset 的持续时间为“28.03”。 AVAsset *videoAsset = [AVAsset
本质上,我希望连接 AVAsset 文件。我大致知道该怎么做,但我正在努力加载音频文件。 我可以使用 AVAudioPlayer 播放文件,我可以通过我的终端在目录中看到它们,但是当我尝试使用 AVA
我正在尝试使用 AVFoundation 一起编辑视频和图像。然而,AVAsset 似乎无法从图像文件创建?有人给我一些建议吗? 最佳答案 好的,我很确定 AVAsset 是为媒体准备的,所以 AVA
我正在处理一个需要对大量短(1-5 秒)进行排序的项目(问题在 n = 30 或更少时可见)AVAsset s。我能找到的所有引用资料和示例项目都指向使用范围 CMTimeRange(start: .
我想使用AVAssetExportSession合成两个音频。当我使用AVAsset来通过'tracksWithMediaType:AVMediaTypeAudio'进行跟踪时,我得到了一个空数组。
我正在开发一个播放视频并允许用户在视频中向前和向后滑动的应用程序。擦洗必须顺利进行,所以我们总是用 SDAVAssetExportSession 重写视频具有视频压缩属性 AVVideoMaxKeyF
我有兴趣获取 AVAsset 的资源名称(又名文件名) ,特别是mp4视频。 Assets 是使用资源名称创建的,我只是想在将来只有 AVAsset 时获得相同的字符串资源实例。在这种情况下,我怎样才
我正在尝试根据声音文件渲染音频波形。我找到了很多教程来展示如何做到这一点,但我没有找到太多涵盖 AVAsset 的文档。 .我查看了苹果文档,但我发现它有点含糊。 我真的很想了解基础知识而不是跳来跳去
当应用程序进入后台时,我的[AVAssetWriter startWriting]被调用,并且由于以下错误而失败: Error Domain = AVFoundationErrorDomain代码=
我是一名优秀的程序员,十分优秀!