如何将video文件保存到文档目录中

我使用以下代码捕捉video:

UIImagePickerController *ipc = [[UIImagePickerController alloc] init]; ipc.sourceType = UIImagePickerControllerSourceTypeCamera; ipc.delegate = self; //need to handle delegates methods // ipc.allowsEditing = YES; ipc.videoQuality = UIImagePickerControllerQualityTypeMedium; ipc.videoMaximumDuration = 30.0f; // 30 seconds //temporary duation of 30 seconds for testing ipc.mediaTypes = [NSArray arrayWithObject:@"public.movie"]; // ipc.mediaTypes = [NSArray arrayWithObjects:@"public.movie", @"public.image", nil]; [self presentModalViewController:ipc animated:YES]; //this controller allows to record the videos 

我可以使用以下代码将录制的video保存到相册中

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { // recover video URL NSURL *url = [info objectForKey:UIImagePickerControllerMediaURL]; // check if video is compatible with album BOOL compatible = UIVideoAtPathIsCompatibleWithSavedPhotosAlbum([url path]); // save if (compatible){ UISaveVideoAtPathToSavedPhotosAlbum([url path], self, @selector(video:didFinishSavingWithError:contextInfo:), NULL); NSLog(@"saved!!!! %@",[url path]); } [self dismissModalViewControllerAnimated:YES]; [picker release]; } 

但我需要从相册检索该文件,并需要存储到文档目录?

将video保存到文档目录如下:

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL]; NSData *videoData = [NSData dataWithContentsOfURL:videoURL]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *tempPath = [documentsDirectory stringByAppendingFormat:@"/vid1.mp4"]; BOOL success = [videoData writeToFile:tempPath atomically:NO]; [picker dismissModalViewControllerAnimated:YES]; } 

如果将来有人需要它,这里是swift代码:

 func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL let videoData = NSData(contentsOfURL: videoURL) let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) let documentsDirectory: AnyObject = paths[0] let dataPath = documentsDirectory.stringByAppendingPathComponent("/vid1.mp4") videoData?.writeToFile(dataPath, atomically: false) self.dismissViewControllerAnimated(true, completion: nil) } 
 #pragma mark - #pragma mark File Names and Paths // Creates the path if it does not exist. - (void)ensurePathAt:(NSString *)path { NSFileManager *fm = [NSFileManager defaultManager]; if ( [fm fileExistsAtPath:path] == false ) { [fm createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:NULL]; } } - (NSString *)documentPath { if ( ! documentPath_ ) { NSArray *searchPaths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); documentPath_ = [searchPaths objectAtIndex: 0]; documentPath_=[documentPath_ stringByAppendingPathComponent:@"VideoAlbum"]; [documentPath_ retain]; } return documentPath_; } - (NSString *)audioPath { if ( ! AudioPath_ ) { AudioPath_ = [[self documentPath] stringByAppendingPathComponent:@"Demo"]; NSLog(@"%@",AudioPath_); [AudioPath_ retain]; [self ensurePathAt:AudioPath_]; } return AudioPath_; } -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSString *type = [info objectForKey:UIImagePickerControllerMediaType]; if ([type isEqualToString:(NSString *)kUTTypeVideo] || [type isEqualToString:(NSString *)kUTTypeMovie]) { NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL]; NSData *videoData = [NSData dataWithContentsOfURL:videoURL]; tempPath = [[self audioPath] stringByAppendingFormat:@"/%@.mp4",[NSDate date]]; BOOL success = [videoData writeToFile:tempPath atomically:NO]; NSLog(@"%hhd",success); } [[picker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; } 

研发的这一点,这对我工作

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

{

  NSURL *url = [info objectForKey:UIImagePickerControllerMediaURL]; // Save video to app document directory NSString *filePath = [url path]; NSString *pathExtension = [filePath pathExtension] ; if ([pathExtension length] > 0) { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) ; NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", [filePath lastPathComponent]]]; // Method last path component is used here, so that each video saved will get different name. NSError *error = nil ; BOOL res = [[NSFileManager defaultManager] moveItemAtPath:filePath toPath:localFilePath error:&error] ; if (!res) { NSLog(@"%@", [error localizedDescription]) ; } else { NSLog(@"File saved at : %@",localFilePath); } } 

}

//此外,当您必须检查应用程序文档目录中已存在的相同video,并且您不想创build多个副本时,则会进行如下更改

 NSURL *url = [info objectForKey:UIImagePickerControllerMediaURL]; NSURL *videoAsset = [info objectForKey:UIImagePickerControllerReferenceURL]; __weak typeof(self) weakSelf = self; ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library assetForURL:videoAsset resultBlock:^(ALAsset *asset) { weakSelf.selectedFileName = [[asset defaultRepresentation] filename]; NSLog(@"Video Filename %@",weakSelf.selectedFileName); // Save video to doc directory NSString *filePath = [url path]; NSString *pathExtension = [filePath pathExtension] ; if ([pathExtension length] > 0) { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) ; NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", weakSelf.selectedFileName]]; //check if same video is having its copy in app directory. //so that multiple entries of same file should not happen. BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:localFilePath]; if (!fileExists) { NSError *error = nil ; BOOL res = [[NSFileManager defaultManager] moveItemAtPath:filePath toPath:localFilePath error:&error] ; if (!res) { NSLog(@"%@", [error localizedDescription]) ; } else { NSLog(@"File saved at : %@",localFilePath); weakSelf.filePathURL = [NSURL URLWithString:localFilePath]; } } else { NSLog(@"File exist at : %@",localFilePath); weakSelf.filePathURL = [NSURL URLWithString:localFilePath]; } } } 

}

//其中weakSelf.selectedFileName&weakSelf.filePathURL分别是我的类的NSString和NSURLtypes的属性。

我们可以使用NSFileManager的moveItemAtPath:toPath:error:方法将video文件移动到我们应用程序的文档目录。 这样更有效率

我们也应该得到video文件的扩展名,并将其用作本地video文件名的扩展名。

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [self dismissViewControllerAnimated:YES completion:nil] ; if ([info[UIImagePickerControllerMediaType] isEqualToString:(NSString *)kUTTypeMovie]) { // video NSURL *url = [info[UIImagePickerControllerMediaType] ; NSString *filePath = [url path] ; NSString *pathExtension = [filePath pathExtension] ; if ([pathExtension length] > 0) { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) ; NSString *documentsDirectory = [paths objectAtIndex:0] ; NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"temp.%@", pathExtension]] ; NSError *error = nil ; BOOL res = [[NSFileManager defaultManager] moveItemAtPath:filePath toPath:localFilePath error:&error] ; if (!res) { NSLog(@"%@", [error localizedDescription]) ; } } } } 

这个对我有用。

  videoUrl = [info objectForKey:UIImagePickerControllerMediaURL]; urlString=[urlvideo path]; NSLog(@"path url %@",videoUrl); NSData *videoData = [NSData dataWithContentsOfURL:videoUrl]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *sourcePath = [documentsDirectory stringByAppendingPathComponent:@"yourfilename.mp4"]; [videoData writeToFile:sourcePath atomically:YES]; //Below code will save video to iOS Device ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init]; [library writeVideoAtPathToSavedPhotosAlbum:videoUrl completionBlock:^(NSURL *assetURL, NSError *error){/*notify of completion*/}]; [picker dismissViewControllerAnimated:YES completion:nil]; 

希望这个帮助

这篇文章是关于一个录制的video,如何通过拖放添加存储的video? 我试图开发一个应用程序,从一开始就必须在文档目录中有一个video文件(test.mov)。 如果在该目录中存在该应用程序,并且如果没有更多video,则首次检查该应用程序是否会运行,然后将其复制,以便至less有一个video。

在创build项目时,我添加了在Xcode中进行“拖放”的video,因此它在项目导航器列表中与我的其余项目文件(AppDelegate.h,ViewController.h,ViewController.m …等)不能确定如何从中获取url。

  videoURL = info[UIImagePickerControllerMediaURL]as? NSURL print(videoURL!) let urlData=NSData(contentsOf: videoURL as! URL) if((urlData) != nil) { let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) let documentDirectory = path.first! as NSString let fileName = "Video.MOV" let PDFPathFileName = documentDirectory.appendingPathComponent(fileName as String) print(PDFPathFileName) DispatchQueue.main.async( execute: { urlData?.write(toFile: PDFPathFileName, atomically: true) }) do { let asset = AVURLAsset(url: videoURL as! URL , options: nil) let imgGenerator = AVAssetImageGenerator(asset: asset) imgGenerator.appliesPreferredTrackTransform = true let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(0, 1), actualTime: nil) let thumbnail = UIImage(cgImage: cgImage) imgView.image = thumbnail // thumbnail here } catch let error { print("*** Error generating thumbnail: \(error.localizedDescription)") } } self.dismiss(animated: true, completion: nil)