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 = ;//最长拍摄时间
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(@"视频录制取消了..."); }
iOS 录制视频MOV格式转MP4的更多相关文章
- 腾讯视频QLV格式转换mp4的方法
腾讯视频QLV格式转换mp4的方法不知道大家知不知道用?喜欢用腾讯视频的朋友应该都知道腾讯视频单独搞出了个QLV格式文件,只能用腾讯独有的腾讯视频软件才能播放,就算用格式工厂转换也不行,那么腾讯视频的 ...
- iOS录制视频
随着每一代 iPhone 处理能力和相机硬件配置的提高,使用它来捕获视频也变得更加有意思.它们小巧,轻便,低调,而且与专业摄像机之间的差距已经变得非常小,小到在某些情况下,iPhone 可以真正替代它 ...
- 腾讯视频qlv格式转换MP4普通视频方法
QLV格式视频不是那么好对付的,似乎是一种加密格式,试着把.qlv改成.mp4或.flv都没有用,用格式工厂等转换软件转换也根本无法识别.但这并不意味着没有办法,其实真正的方法是不用任何工具: 1,我 ...
- 摄像头录制视频并且保存成mp4
import cv2import numpy as npimport os cap = cv2.VideoCapture(1)#v4l2-ctl --list-devices 查看设备号,非正常中断时 ...
- Android手机录制视频 实时传输(转载)
最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...
- 记MacOs视频mov与mp4格式转换问题解决
综述 记录了mov转mp4格式的方法 记录了自己是多蠢 问题背景 这学期选修的<工程英语视听说>课,需要提交一段口语考试视频,于是乎: 带着我的大疆Mavic Mini 和iPad Pro ...
- iOS AVCaptureVideoDataOutputSampleBufferDelegate 录制视频
iOS AVCaptureVideoDataOutputSampleBufferDelegate 录制视频 应用场景: 使用AVFoundation提供的API, 我们可以从 AVCaptureVid ...
- iOS 三种录制视频方式
随着每一代 iPhone 处理能力和相机硬件配置的提高,使用它来捕获视频也变得更加有意思.它们小巧,轻便,低调,而且与专业摄像机之间的差距已经变得非常小,小到在某些情况下,iPhone 可以真正替代它 ...
- 使用WebEx录制视频并转换为MP4
1.下载并安装WebEx http://www.question-defense.com/wp-content/uploads/2010/05/ateditor-version-3.0.zip 2.打 ...
随机推荐
- 性能测试四:jmeter进阶之逻辑控制器
常用的逻辑控制器 1,循环控制器:可以设置该控制器内的sampler执行的次数,循环次数与线程的循环次数各自独立 2,if控制器:根据判断条件决定是否执行该控制器内的请求,如果是字符串比较条件,参数和 ...
- python+selenium七:下拉框、选项框、select用法
# from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimpo ...
- python3的unittest中使用test suite(测试套件)执行指定测试用例
示例代码 module.py class baidumodule(): def __init__(self,driver,): self.dr = driver #不能在类中再次导入webdriver ...
- Js引擎解析执行 阅读笔记
Js引擎解析执行 阅读笔记 一篇阅读笔记 http://km.oa.com/group/2178/articles/show/145691?kmref=search&from_page=1&a ...
- 《剑指offer》-统计整数二进制表示中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位 ...
- 指定一个M3U8文件,判断它包含的TS文件是不是都存在。指定一个Office生成的Swf文件,判断它包含的Swf文件是不是完整都存在。
static void Main(string[] args) { //检查M3u8文件 var fiPath = @"D:\Work\CloudPlatformUtil\CloudPlat ...
- wmiprvse.exe cpu占用高怎么解决
可以通过在注册表中设置,来禁用该服务,具体步骤如下: (1)按下“Win+R”组合键呼出运行,在框中输入“CMD”按下回车打开“命令提示符”: (2)在命令提示符中输入:r ...
- 【NPM】npm ERR! Unexpected end of JSON input while parsing near '...",'解决方案
问题描述 今天安装项目依赖npm install 的时候出现错误: npm ERR! Unexpected end of JSON input while parsing near '...e&quo ...
- Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)
勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分享了JVM及其启动流程,今天介绍一下JVM内部的一些区域,以及具体的区域在运行 ...
- CSS-定位(Position)
目录 CSS-定位(Position) CSS-定位(Position) ### 学习自 菜鸟教程 ### Overview CSS中HTML元素存在以下之后定位选项 Position Desc st ...