大佬教程收集整理的这篇文章主要介绍了iphone – 保存录制的视频太长时,应用程序崩溃,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
保存我的应用中记录的视频时,如果视频大小/持续时间太大/太长,我的应用程序崩溃时没有日志/异常.
我的设置:
在我的应用程序中,我使用UIImagePickerController来录制视频.现在我注意到如果我的视频长度非常长(例如使用UIImagePickerControllerQualityTypeMedium 30分钟,或使用UIImagePickerControllerQualityTypeIFrame1280x720超过一分钟),保存视频时应用程序崩溃.有时有,有时没有警告.现在我开始调试并注意到它与内存有关(malloc_error).
我使用分析器来实时检查分配,并注意到,当它要保存视频时,分配突然变得非常大(我想这与视频的临时内存使用情况有关?)在它最终崩溃之前.以下是分析器的屏幕截图:
该应用必须能够录制最长1小时的视频(指定任何质量).
我尝试过的:
>将picker.videoMaximumDuration设置为更短/更长
>使用分析器/仪器进行调试
>检查是否有泄漏
>关闭所有打开的应用程序&删除设备上的应用程序(用于存储清理)以获得更多内存
码:
- (void)openCamera:(id)sender context:(NsmanagedObjectContext*)context { self.context = context; //Set self as delegate (UIImagePickerControllerDelegatE) [self.picker setDelegate:self]; //If the device has a camera if ([UIImagePickerController issourceTypeAvailable:UIImagePickerControllersourceTypeCamera]) { self.picker.sourCEType = UIImagePickerControllersourceTypeCamera; self.picker.allowsEdiTing = YES; self.picker.videoQuality = [SetTings videoQualitySetTing]; //If the camera can record video NSString *desired = (NSString *)kUTTypeMovie; if ([[UIImagePickerController availableMediaTypesForsourceType:self.picker.sourCEType] containsObject:desired]) { //Let the user record video self.picker.mediaTypes = [NSArray arrayWithObject:desired]; self.picker.videoMaximumDuration = MaxDuration; } else { NSLog(@"Can't take videos with this device"); //debug } //Present the picker fullscreen/in popover if ([SetTings shouldDisplayFullScreenCamera]){ [self presentModalViewController:self.picker animated:YES]; [self.masterPopoverController dismissPopoverAnimated:YES]; } else { if (!_popover){ _popover = [[UIPopoverController alloc] initWithContentViewController:self.picker]; } [_popover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } } else { NSLog(@"Does not have a camera"); //debug } }
选择图像时的代码:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType]; // Save the video,and close the overlay if (CFStringCompare ((__bridge CFStringRef) mediaType,kUTTypeMovie,0) == kcfCompareEqualTo) { self.tempVideoPath = [[info objectForKey: UIImagePickerControllerMediaURL] path]; [LocalVideoStorage saveVideo:[NSData dataWithContentsOfPath:self.tempVideoPath name:self.videoName]; [_picker dismissModalViewControllerAnimated: YES]; [[_picker parentViewController] dismissModalViewControllerAnimated:YES]; [_popover dismissPopoverAnimated:YES]; } }
最后,当它被保存时:
+ (NSString*)saveVideo:(NSData*)video:(NSString*)videoName { NSFileManager *fileManager = [NSFileManager defaultManager];//create instance of NSFileManager NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); //create an array and store result of our search for the documents directory in it NSString *documentsDirectory = [paths objectATindex:0]; //create NSString object,that holds our exact path to the documents directory NSString *fullPath = [documentsDirectory StringByAppendingPathComponent:[NSString StringWithFormat:@"%@.MOV",videoName]]; //add our video to the path [fileManager createFileAtPath:fullPath contents:video attributes:nil]; //finally save the path (video) NSLog(@"Video saved!"); return fullPath; }
我在iOS 5.1.1中使用ARC
更新:
我在malloc_error_break上放了一个断点,在仪器中我可以看到它来自:
# Address Category timestamp Live Size Responsible Library Responsible Caller 0 0x10900000 Malloc 473,29 MB 02:08.951.332 • 496283648 Foundation -[NSData(NSData) initWithContentsOfFile:]
解:
作为lawicko& john.k.doe说,我试图将视频从它的路径加载到NSData变量中.这导致整个视频被加载到内存中.我现在只是移动文件(& reName)copyItemAtPath而不是这样做
NSError *error = nil; if (![fileManager copyItemAtPath:path toPath:fullPath error:&error]) NSLog(@"Error: %@",error);
以上是大佬教程为你收集整理的iphone – 保存录制的视频太长时,应用程序崩溃全部内容,希望文章能够帮你解决iphone – 保存录制的视频太长时,应用程序崩溃所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。