最近遇到一個頭疼的問題梯码,錄制高清視頻讶踪,上傳服務器罕偎,但是太大硬毕,上傳緩慢,經(jīng)過幾天的周折考蕾,最后實現(xiàn)了6:1的壓縮率祸憋,如果您有更好的辦法請聯(lián)系我。
#import "ViewController.h"
#import<AssetsLibrary/AssetsLibrary.h>
#import<AVKit/AVKit.h>
#import<AVFoundation/Foundation.h>
@interface ViewController ()<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
@end
@implementation ViewController{
UIImagePickerController *imagePickerController;
}
- (void)viewDidLoad { ? ?[super viewDidLoad];}
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{ ? ? ?
?[self showImagePickerForSourceType:UIImagePickerControllerSourceTypeCamera andCameraCaptureMode:UIImagePickerControllerCameraCaptureModeVideo];
}
- (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType andCameraCaptureMode:(UIImagePickerControllerCameraCaptureMode)mode{ ? ? ? ? ? ? ? ?imagePickerController = [[UIImagePickerController alloc] init]; ? ?//這是 VC 的各種 modal 形式 ? ?imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen; ? ?imagePickerController.sourceType = sourceType; ? ?//支持的攝制類型,拍照或攝影,此處將本設備支持的所有類型全部獲取,并且同時賦值給imagePickerController的話,則可左右切換攝制模式 ? ?imagePickerController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera]; ? ?imagePickerController.delegate = self; ? ?imagePickerController.videoQuality = UIImagePickerControllerQualityTypeIFrame960x540; ? ?//允許拍照后編輯 ? ?imagePickerController.allowsEditing = YES; ? ? ?
?if (sourceType == UIImagePickerControllerSourceTypeCamera) { ? ? ? ?//設置模式-->拍照/攝像 ? ? ? ?imagePickerController.cameraCaptureMode = mode; ? ? ? ?//開啟默認攝像頭-->前置/后置 ? ? ? ?imagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear; ? ? ? ?//設置默認的閃光燈模式-->開/關(guān)/自動 ? ? ? ?imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto; ?
} ?
[self presentViewController:imagePickerController animated:YES completion:NULL];
}
#pragma mark delegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary*)info{
NSString *mediaType = info[UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:@"public.image"]) {
NSLog(@"image...");
/*
//獲取照片的原圖
UIImage* original = [info objectForKey:UIImagePickerControllerOriginalImage];
//獲取圖片裁剪后肖卧,剩下的圖
UIImage* crop = [info objectForKey:UIImagePickerControllerCropRect];
//獲取圖片的url
NSURL* url = [info objectForKey:UIImagePickerControllerMediaURL];
//獲取圖片的metadata數(shù)據(jù)信息
NSDictionary* metadata = [info objectForKey:UIImagePickerControllerMediaMetadata];
*/
//獲取圖片裁剪的圖
UIImage* edit = [info objectForKey:UIImagePickerControllerEditedImage];
[self saveImage:edit];
}else{ ?// public.movie
NSLog(@"video...");
NSURL *url=[info objectForKey:UIImagePickerControllerMediaURL];//視頻路徑
// ? ? ? ?NSString *urlStr=[url path];
//
NSLog(@"開始壓縮,壓縮前大小 %f MB",[self fileSize:url]);
AVURLAsset *avAsset = [[AVURLAsset alloc] initWithURL:url options:nil];
NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];
if ([compatiblePresets containsObject:AVAssetExportPresetHighestQuality]) {
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPresetHighestQuality];
exportSession.outputURL = [self compressedURL];
//優(yōu)化網(wǎng)絡
exportSession.shouldOptimizeForNetworkUse = true;
//轉(zhuǎn)換后的格式
exportSession.outputFileType = AVFileTypeMPEG4;
//異步導出
[exportSession exportAsynchronouslyWithCompletionHandler:^{
// 如果導出的狀態(tài)為完成
NSLog(@"%@",exportSession);
if (exportSession.status == AVAssetExportSessionStatusCompleted) {
NSLog(@"壓縮完畢,壓縮后大小 %f MB",[self fileSize:[self compressedURL]]);
[self saveVideo:[self compressedURL]];
}else{
NSLog(@"當前壓縮進度:%f",exportSession.progress);
}
}];
}
// ? ? ? ?[self saveVideo:url];
}
[picker dismissViewControllerAnimated:YES completion:nil];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
NSLog(@"取消");
[picker dismissViewControllerAnimated:YES completion:nil];
}
//取消屏幕旋轉(zhuǎn)
- (BOOL)shouldAutorotate {
return YES;
}
#pragma mark save
- (void)saveImage:(UIImage *)img
{
// ? ?//如果是拍照的照片蚯窥,則需要手動保存到本地,系統(tǒng)不會自動保存拍照成功后的照片
// ? ?UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
[[[ALAssetsLibrary alloc]init] writeImageToSavedPhotosAlbum:[img CGImage] orientation:(ALAssetOrientation)img.imageOrientation completionBlock:^(NSURL *assetURL, NSError *error) {
if (error) {
NSLog(@"Save image fail:%@",error);
}else{
NSLog(@"Save image succeed.");
}
}];
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
if (error) {
NSLog(@"保存照片過程中發(fā)生錯誤塞帐,錯誤信息:%@",error.localizedDescription);
}else{
NSLog(@"照片保存成功.");
}
}
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
NSLog(@"----%@",contextInfo);
if (error) {
NSLog(@"保存視頻過程中發(fā)生錯誤拦赠,錯誤信息:%@",error.localizedDescription);
}else{
NSLog(@"視頻保存成功.");
}
}
#pragma mark 保存壓縮
- (NSURL *)compressedURL
{
return [NSURL fileURLWithPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"cgq.mp4"]]];
}
- (CGFloat)fileSize:(NSURL *)path
{
return [[NSData dataWithContentsOfURL:path] length]/1024.00 /1024.00;
}
- (void)saveVideo:(NSURL *)outputFileURL
{
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:outputFileURL
completionBlock:^(NSURL *assetURL, NSError *error) {
if (error) {
NSLog(@"保存視頻失敗:%@",error);
} else {
NSLog(@"保存視頻到相冊成功");
}
}];
}
@end