zoukankan      html  css  js  c++  java
  • iOS 录制视频MOV格式转MP4

    使用UIImagePickerController系统控制器录制视频时,默认生成的格式是MOV,如果要转成MP4格式的,我们需要使用AVAssetExportSession;

    支持转换的视频质量:低,中,高,640*480,720p,1080p等

    如下代码片段转换

    - (void)mov2mp4:(NSURL *)movUrl
    {
        AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:movUrl options:nil];
        NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];
        /**
         AVAssetExportPresetMediumQuality 表示视频的转换质量,
         */
        if ([compatiblePresets containsObject:AVAssetExportPresetMediumQuality]) {
            AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPresetMediumQuality];
            
            //转换完成保存的文件路径
            NSString * resultPath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/output-%@.mp4",@"cvt"];
            
            exportSession.outputURL = [NSURL fileURLWithPath:resultPath];
            
            //要转换的格式,这里使用 MP4
            exportSession.outputFileType = AVFileTypeMPEG4;
            
            //转换的数据是否对网络使用优化
            exportSession.shouldOptimizeForNetworkUse = YES;
            
            //异步处理开始转换
            [exportSession exportAsynchronouslyWithCompletionHandler:^(void)
             
             {
                 //转换状态监控
                 switch (exportSession.status) {
                     case AVAssetExportSessionStatusUnknown:
                         NSLog(@"AVAssetExportSessionStatusUnknown");
                         break;
                         
                     case AVAssetExportSessionStatusWaiting:
                         NSLog(@"AVAssetExportSessionStatusWaiting");
                         break;
                         
                     case AVAssetExportSessionStatusExporting:
                         NSLog(@"AVAssetExportSessionStatusExporting");
                         break;
                     case AVAssetExportSessionStatusFailed:
                         NSLog(@"AVAssetExportSessionStatusFailed");  
                         break;
                     case AVAssetExportSessionStatusCancelled:
                         NSLog(@"AVAssetExportSessionStatusCancelled");
                         break;
                      
                     case AVAssetExportSessionStatusCompleted:
                     {
                         //转换完成
                         NSLog(@"AVAssetExportSessionStatusCompleted");
                         
                         //测试使用,保存在手机相册里面
                         ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
                         [assetLibrary writeVideoAtPathToSavedPhotosAlbum:exportSession.outputURL completionBlock:^(NSURL *assetURL, NSError *error){
                             if (error) {
                                 NSLog(@"%@",error);
                             }
                         }];
                         break;
                     }
                 }
                 
             }];  
            
        }  
    
    }

    完整的调用以及转换代码

    #import <AssetsLibrary/AssetsLibrary.h>
    #import <MobileCoreServices/MobileCoreServices.h>
    #import <AVFoundation/AVFoundation.h>
    
    @interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
    
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
    
        
    }
    
    - (IBAction)startCampVD:(id)sender {
     
        UIImagePickerController *pickerCon = [[UIImagePickerController alloc]init];
        pickerCon.sourceType = UIImagePickerControllerSourceTypeCamera;
        pickerCon.mediaTypes = @[(NSString *)kUTTypeMovie];//设定相机为视频
        pickerCon.cameraDevice = UIImagePickerControllerCameraDeviceFront;//设置相机后摄像头
        pickerCon.videoMaximumDuration = 6;//最长拍摄时间
        pickerCon.videoQuality = UIImagePickerControllerQualityType640x480;//拍摄质量
        pickerCon.allowsEditing = NO;//是否可编辑
        pickerCon.delegate = self;
        
        
        [self presentViewController:pickerCon animated:YES completion:nil];
    
    
    }
    
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
        
        NSLog(@"视频录制完成...");
        NSLog(@"%@",info);
    
        [self mov2mp4:[info objectForKey:UIImagePickerControllerMediaURL]];
        
        [self dismissViewControllerAnimated:YES completion:nil];
    
        
        
    
    
    }
    
    - (void)mov2mp4:(NSURL *)movUrl
    {
        AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:movUrl options:nil];
        NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];
        /**
         AVAssetExportPresetMediumQuality 表示视频的转换质量,
         */
        if ([compatiblePresets containsObject:AVAssetExportPresetMediumQuality]) {
            AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPresetMediumQuality];
            
            //转换完成保存的文件路径
            NSString * resultPath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/output-%@.mp4",@"cvt"];
            
            exportSession.outputURL = [NSURL fileURLWithPath:resultPath];
            
            //要转换的格式,这里使用 MP4
            exportSession.outputFileType = AVFileTypeMPEG4;
            
            //转换的数据是否对网络使用优化
            exportSession.shouldOptimizeForNetworkUse = YES;
            
            //异步处理开始转换
            [exportSession exportAsynchronouslyWithCompletionHandler:^(void)
             
             {
                 //转换状态监控
                 switch (exportSession.status) {
                     case AVAssetExportSessionStatusUnknown:
                         NSLog(@"AVAssetExportSessionStatusUnknown");
                         break;
                         
                     case AVAssetExportSessionStatusWaiting:
                         NSLog(@"AVAssetExportSessionStatusWaiting");
                         break;
                         
                     case AVAssetExportSessionStatusExporting:
                         NSLog(@"AVAssetExportSessionStatusExporting");
                         break;
                     case AVAssetExportSessionStatusFailed:
                         NSLog(@"AVAssetExportSessionStatusFailed");  
                         break;
                     case AVAssetExportSessionStatusCancelled:
                         NSLog(@"AVAssetExportSessionStatusCancelled");
                         break;
                      
                     case AVAssetExportSessionStatusCompleted:
                     {
                         //转换完成
                         NSLog(@"AVAssetExportSessionStatusCompleted");
                         
                         //测试使用,保存在手机相册里面
                         ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
                         [assetLibrary writeVideoAtPathToSavedPhotosAlbum:exportSession.outputURL completionBlock:^(NSURL *assetURL, NSError *error){
                             if (error) {
                                 NSLog(@"%@",error);
                             }
                         }];
                         break;
                     }
                 }
                 
             }];  
            
        }  
    
    }
    
    
    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
        [picker dismissViewControllerAnimated:YES completion:^{}];
        
        NSLog(@"视频录制取消了...");
        
    }
  • 相关阅读:
    Redis之通用的key操作命令
    Redis常用命令之操作Set(集合)
    Redis常用命令之操作SortedSet(有序集合)
    Redis常用命令之操作List类型
    Winform中实现监控CPU内存使用率(附代码下载)
    Ubuntu安装配置mongodb
    修改Ubuntu国内镜像
    redis安装和配置
    爬虫(十六):scrapy爬取知乎用户信息
    爬虫(十五):scrapy中的settings详解
  • 原文地址:https://www.cnblogs.com/cocoajin/p/8535276.html
Copyright © 2011-2022 走看看