从 Live Photo 中提取视频部分
Extract video portion from Live Photo
有没有人知道如何从 Live Photo 中提取视频部分?我正在开发一个将实时照片转换为 GIF 的应用程序,第一步是从实时照片中获取视频文件。看起来应该是可行的,因为如果您将 phone 插入 Mac,您可以看到单独的图像和视频文件。我在提取过程中有点 运行 碰壁了,我尝试了很多方法,但都失败了。
我做的第一件事是通过执行以下操作为我认为是 Live Photo 的视频部分获取 PHAsset:
if let livePhoto = info["UIImagePickerControllerLivePhoto"] as? PHLivePhoto {
let assetResources = PHAssetResource.assetResourcesForLivePhoto(livePhoto)
for assetRes in assetResources {
if (assetRes.type == .PairedVideo) {
let assets = PHAsset.fetchAssetsWithLocalIdentifiers([assetRes.assetLocalIdentifier], options: nil)
if let asset = assets.firstObject as? PHAsset {
将 PHAsset 转换为 AVAsset 我试过:
asset.requestContentEditingInputWithOptions(nil, completionHandler: { (contentEditingInput, info) -> Void in
if let url = contentEditingInput?.fullSizeImageURL {
let movieUrl = url.absoluteString + ".mov"
let avAsset = AVURLAsset(URL: NSURL(fileURLWithPath: movieUrl), options: nil)
debugPrint(avAsset)
debugPrint(avAsset.duration.value)
}
})
我认为这个不起作用,因为带有 duration.value 的调试打印结果为 0。
我也尝试过不添加“.mov”但它仍然不起作用。
我也试过:
PHImageManager.defaultManager().requestAVAssetForVideo(asset, options: nil, resultHandler: { (avAsset, audioMix, info) -> Void in
debugPrint(avAsset)
})
并且 debugPrint(avAsset) 打印 nil 所以它不起作用。
我有点担心他们可能无法做到这一点,我好像在兜圈子,因为我得到的 PHAsset 似乎仍然是实时照片,而不是视频。
使用 PHAssetResourceManager
从 PHAssetResource
获取视频文件。
PHAssetResourceManager.defaultManager().writeDataForAssetResource(assetRes,
toFile: fileURL, options: nil, completionHandler:
{
// Video file has been written to path specified via fileURL
}
注意:iOS9.1
中引入了 Live Photo 特定 API
我不小心做了。我有一个名为 Goodreader 的 ios 应用程序(在应用程序商店中可用),它具有类似 windows 的文件管理器。导入实时照片时,它会将其保存为以 .pvt 结尾的文件夹,其中包含 jpg 和 mov 文件。只有一个警告:在将实时照片发送给自己或其他人后,您需要从消息应用程序中打开实时照片才能看到 "import to goodreader" 选项,而不是从照片应用程序中打开。
// suppose you have PHAsset instance (you can get it via [PHAsset fetchAssetsWithOptions:...])
PHAssetResource *videoResource = nil;
NSArray *resourcesArray = [PHAssetResource assetResourcesForAsset:asset];
const NSInteger livePhotoAssetResourcesCount = 2;
const NSInteger videoPartIndex = 1;
if (resourcesArray.count == livePhotoAssetResourcesCount) {
videoResource = resourcesArray[videoPartIndex];
}
if (videoResource) {
NSString * const fileURLKey = @"_fileURL";
NSURL *videoURL = [videoResource valueForKey:fileURLKey];
// load video url using AVKit or AVFoundation
}
有没有人知道如何从 Live Photo 中提取视频部分?我正在开发一个将实时照片转换为 GIF 的应用程序,第一步是从实时照片中获取视频文件。看起来应该是可行的,因为如果您将 phone 插入 Mac,您可以看到单独的图像和视频文件。我在提取过程中有点 运行 碰壁了,我尝试了很多方法,但都失败了。
我做的第一件事是通过执行以下操作为我认为是 Live Photo 的视频部分获取 PHAsset:
if let livePhoto = info["UIImagePickerControllerLivePhoto"] as? PHLivePhoto {
let assetResources = PHAssetResource.assetResourcesForLivePhoto(livePhoto)
for assetRes in assetResources {
if (assetRes.type == .PairedVideo) {
let assets = PHAsset.fetchAssetsWithLocalIdentifiers([assetRes.assetLocalIdentifier], options: nil)
if let asset = assets.firstObject as? PHAsset {
将 PHAsset 转换为 AVAsset 我试过:
asset.requestContentEditingInputWithOptions(nil, completionHandler: { (contentEditingInput, info) -> Void in
if let url = contentEditingInput?.fullSizeImageURL {
let movieUrl = url.absoluteString + ".mov"
let avAsset = AVURLAsset(URL: NSURL(fileURLWithPath: movieUrl), options: nil)
debugPrint(avAsset)
debugPrint(avAsset.duration.value)
}
})
我认为这个不起作用,因为带有 duration.value 的调试打印结果为 0。 我也尝试过不添加“.mov”但它仍然不起作用。
我也试过:
PHImageManager.defaultManager().requestAVAssetForVideo(asset, options: nil, resultHandler: { (avAsset, audioMix, info) -> Void in
debugPrint(avAsset)
})
并且 debugPrint(avAsset) 打印 nil 所以它不起作用。
我有点担心他们可能无法做到这一点,我好像在兜圈子,因为我得到的 PHAsset 似乎仍然是实时照片,而不是视频。
使用 PHAssetResourceManager
从 PHAssetResource
获取视频文件。
PHAssetResourceManager.defaultManager().writeDataForAssetResource(assetRes,
toFile: fileURL, options: nil, completionHandler:
{
// Video file has been written to path specified via fileURL
}
注意:iOS9.1
中引入了 Live Photo 特定 API我不小心做了。我有一个名为 Goodreader 的 ios 应用程序(在应用程序商店中可用),它具有类似 windows 的文件管理器。导入实时照片时,它会将其保存为以 .pvt 结尾的文件夹,其中包含 jpg 和 mov 文件。只有一个警告:在将实时照片发送给自己或其他人后,您需要从消息应用程序中打开实时照片才能看到 "import to goodreader" 选项,而不是从照片应用程序中打开。
// suppose you have PHAsset instance (you can get it via [PHAsset fetchAssetsWithOptions:...])
PHAssetResource *videoResource = nil;
NSArray *resourcesArray = [PHAssetResource assetResourcesForAsset:asset];
const NSInteger livePhotoAssetResourcesCount = 2;
const NSInteger videoPartIndex = 1;
if (resourcesArray.count == livePhotoAssetResourcesCount) {
videoResource = resourcesArray[videoPartIndex];
}
if (videoResource) {
NSString * const fileURLKey = @"_fileURL";
NSURL *videoURL = [videoResource valueForKey:fileURLKey];
// load video url using AVKit or AVFoundation
}