Iphone 将下载的视频复制到摄像机卷

Iphone 将下载的视频复制到摄像机卷,iphone,ios,objective-c,camera,avfoundation,Iphone,Ios,Objective C,Camera,Avfoundation,尽管这看起来像是一个简单的过程,但到目前为止,我已经尝试了3个小时,但没有成功。我可能错过了一些非常愚蠢的事情 所以,我有一个从互联网下载视频的应用程序。视频正确地存储在本地,因为我可以通过提供本地url播放它们。但是,我无法成功地将视频复制到摄像机上。以下是我的工作: ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; ALAssetsLibraryWriteVideoCompletionBlock videoW

尽管这看起来像是一个简单的过程,但到目前为止,我已经尝试了3个小时,但没有成功。我可能错过了一些非常愚蠢的事情

所以,我有一个从互联网下载视频的应用程序。视频正确地存储在本地,因为我可以通过提供本地url播放它们。但是,我无法成功地将视频复制到摄像机上。以下是我的工作:

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    ALAssetsLibraryWriteVideoCompletionBlock videoWriteCompletionBlock =
    ^(NSURL *newURL, NSError *error) {
        if (error) {
            NSLog( @"Error writing image with metadata to Photo Library: %@", error );
        } else {
            NSLog( @"Wrote image with metadata to Photo Library %@", newURL.absoluteString);
        }
    };

    NSLog(@"file %@", localPath);
    NSURL *url = [NSURL fileURLWithPath:localPath isDirectory:NO];
    [library writeVideoAtPathToSavedPhotosAlbum:url
                                completionBlock:videoWriteCompletionBlock];
但我得到的结果是:

2013-07-24 00:13:32.094 App[1716:907] file /var/mobile/Applications/70C18C4E-9F97-4A6A-B63E-1BD19961F010/Documents/downloaded_video.mp4
2013-07-24 00:13:32.374 App[1716:907] Wrote image with metadata to Photo Library (null)
当然,该文件不会保存在相机卷中。它是一个简单的mp4,与我正在使用的设备兼容(即,应该可以保存它)


我真的不知道该怎么办。任何提示都将不胜感激。谢谢

您在哪里提供块的URL。 我认为你需要这样做

NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:videoURL completionBlock:^(NSURL *assetURL, NSError *error){
       /*notify of completion*/
       NSLog(@"AssetURL: %@",assetURL);
       NSLog(@"Error: %@",error);
       if (!error) {
            //video saved

       }else{
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:error.domain delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
                [alert show];
                [alert release];
       }

}];
您可以在此处更改url,我已将其用于imagePickerController。。
看看它是否对你有帮助。

我可能已经为你找到了解决办法。您是否尝试过AVAssetExportSession

在下面的示例中,我构建了一个简单的应用程序,在屏幕上有两个按钮。你可以调用
onSaveBtn:
,它只需抓取我在应用程序资源包中的视频的URL,并将其保存到用户保存的照片相册中。(不过,在我的情况下,我的视频确实会从
videoatpaths与savedphotosalbum:
兼容中返回
YES
。我没有任何视频不会以其他方式返回。)

第二个按钮连接到
onExportBtn:
,它拍摄我们要保存的视频,创建
avassetextortsession
,将视频导出到临时目录,然后将导出的视频复制到保存的相册中。由于导出时间的原因,此方法确实需要比简单复制更长的时间,但这可能是一种替代路径-检查
videoAtPathIsCompatibleWithSavedPhotosAlbum:
,如果
,则直接复制到相册。否则,请导出视频,然后复制

如果没有一个视频文件不会在兼容性调用中返回
NO
,我不能100%确定这对您是否有效,但值得一试

您可能还想,这将探索您可能正在使用的设备上兼容的视频格式

#导入
#进口
-(iAction)onSaveBtn:(id)发送方
{
NSURL*srcURL=[[NSBundle mainBundle]URLForResource:@“WP_20121214_001”,扩展名:@“mp4”];
[self-saveToCameraRoll:srcURL];
}
-(iAction)OneExportBTN:(id)发件人
{
NSURL*srcURL=[[NSBundle mainBundle]URLForResource:@“WP_20121214_001”,扩展名:@“mp4”];
AVAsset*srcAsset=[AVAsset ASETWITHURL:srcURL];
//创建导出会话
AVAssetExportSession*exportSession=[[AVAssetExportSession alloc]initWithAsset:srcAsset预设名称:AVAssetExportPresetHighestQuality];
//将文件导出到tmp目录
NSString*文件名=[srcURL lastPathComponent];
NSString*tmpDir=NSTemporaryDirectory();
NSURL*tmpURL=[NSURL fileURLWithPath:[tmpDir stringByAppendingPathComponent:fileName]];
exportSession.outputURL=tmpURL;
exportSession.outputFileType=AVFileTypeQuickTimeMovie;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
//现在将tmp文件复制到相机卷
开关([exportSession状态]){
案例AvassetExportSessionStatus失败:
NSLog(@“导出失败:%@,[[exportSession error]localizedDescription]);
打破
案例AvassetExportSessionStatus取消:
NSLog(“导出已取消”);
打破
案例AvassetExportSessionStatus已完成:
NSLog(“导出成功”);
[self-saveToCameraRoll:exportSession.outputURL];
打破
违约:
打破
}
}];
}
-(void)saveToCameraRoll:(NSURL*)srcURL
{
NSLog(@“srcURL:%@”,srcURL);
AlassetLibrary*library=[[AlassetLibrary alloc]init];
AlasSetLibraryWriteDeviceCompletionBlock视频写入完成块=
^(NSURL*新URL,NSError*错误){
如果(错误){
NSLog(@“将带有元数据的图像写入照片库时出错:%@”,错误);
}否则{
NSLog(@“将带有元数据的图像写入照片库%@”,newURL.absoluteString);
}
};
if([library videoAtPathIsCompatibleWithSavedPhotosAlbum:srcURL])
{
[library writeVideoAtPathToSavedPhotosAlbum:srcURL
完成块:videoWriteCompletionBlock];
}
}

这里有一个简短的答案

在我的例子中,我使用AFNetworking从URL下载视频,在下载操作的DownloadCompleted块中,
responseObject
返回下载文件。记录
responseObject
会返回下载视频的完整文件路径

如果您使用另一种方法下载视频,只需将
responseObject
替换为视频的完整文件路径,可能是通常的
NSSearchPathForDirectoriesInDomains
方法

以下是我用于将应用程序本地文件目录中的视频导出到摄影机卷的片段:

NSURL *responseObjectPath = [NSURL URLWithString:responseObject];
// If video is compatible with Camera Roll
if ([[ALAssetsLibrary new] videoAtPathIsCompatibleWithSavedPhotosAlbum:responseObjectPath])
{
    // Export to Camera Roll
    [[ALAssetsLibrary new] writeVideoAtPathToSavedPhotosAlbum:responseObjectPath completionBlock:nil];
}
else
{
    NSLog(@"Incompatible File Type");
}

干杯

您是否已验证该视频是否与摄像机卷兼容?调用
videoAtPathIsCompatibleWithSavedPhotosAlbum:
对您正在处理的视频有什么影响?我已经按照@fa7d0链接给出的提示进行了操作,但没有成功。我还转储了Documents目录,文件就在那里。使用@JoshBuhler建议的方法,我实际上得到了一个编号。。但奇怪的是,容器是mp4,应该可以保存它……而且,如果不兼容,保存操作不应该抛出错误吗?!这不正是我在问题中写的吗?这正是你写的…但我没有看到URL路径,路径在哪里,你在这里做的是,将一个图像保存在相机卷和文档目录中,你为文档目录提供URL路径