- (void)test:(NSURL *)videoUrl{//videoUrl为什么视频的输入地址NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:videoUrl options:options];NSArray *array = [urlAsset tracksWithMediaType:AVMediaTypeVideo];// 这个是视频输入源错误if (!array.count)return;// 输出的时候需要判断视频的角度是不是0(视频角度0度是  是home建在右边,视频横着拍摄的视频;角度是90度是home键在下面竖着拍摄的;180度是home键在左边横着拍摄的;270度是home键在上面,竖着拍摄) 根据自己的需来调整视频的角度,一般为了方便处理是需要输入视频的时候把角度调为0度AVAssetTrack *videoTrack = [array firstObject];// 视频输出// AVAssetExportPresetMediumQuality高质量的 常用的如下/**1,固定分辨率预设属性(1)AVAssetExportPreset640x480:设置视频分辨率640x480(2)AVAssetExportPreset960x540:设置视频分辨率960x540(3)AVAssetExportPreset1280x720:设置视频分辨率1280x720(4)AVAssetExportPreset1920x1080:设置视频分辨率1920x1080(5)AVAssetExportPreset3840x2160:设置视频分辨率3840x21602,相对质量预设属性(1)AVAssetExportPresetLowQuality:低质量(2)AVAssetExportPresetMediumQuality:中等质量(3)AVAssetExportPresetHighestQuality:高质量这种设置方式,最终生成的视频分辨率与具体的拍摄设备有关。比如 iPhone6 拍摄的视频:使用AVAssetExportPresetHighestQuality则视频分辨率是1920x1080(不压缩)。AVAssetExportPresetMediumQuality视频分辨率是568x320AVAssetExportPresetLowQuality视频分辨率是224x128**/AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:urlAsset presetName:AVAssetExportPresetMediumQuality];// 视频的输出地址exportSession.outputURL = [NSURL fileURLWithPath:@"视频的输出路径"];// 视频的输出格式exportSession.outputFileType = AVFileTypeMPEG4;// 这个一般设置为yes(指示输出文件应针对网络使用进行优化,例如QuickTime电影文件应支持“快速启动”)exportSession.shouldOptimizeForNetworkUse = YES;// 文件的最大多大的设置exportSession.fileLengthLimit = 10 * 1024 * 1024;// 视频角度校正if ([self degressFromVideoFileWithAVAssetTrack:videoTrack] != 0){// 修正角度exportSession.videoComposition = [self fixedCompositionWithAsset:urlAsset];}[exportSession exportAsynchronouslyWithCompletionHandler:^{if (exportSession.status == AVAssetExportSessionStatusCancelled){} else if (exportSession.status == AVAssetExportSessionStatusFailed){} else if (exportSession.status == AVAssetExportSessionStatusCompleted){// 完成后的操作在这个里面执行 这里面不是主线程}}];}
- (int)degressFromVideoFileWithAVAssetTrack:(AVAssetTrack *)videoTrack {int degress = 0;// 视频的transformCGAffineTransform t = videoTrack.preferredTransform;// 矩阵的abcd来判断视频的角度if(t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0){// Portraitdegress = 90;} else if(t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0){// PortraitUpsideDowndegress = 270;} else if(t.a == 1.0 && t.b == 0 && t.c == 0 && t.d == 1.0){// LandscapeRightdegress = 0;} else if(t.a == -1.0 && t.b == 0 && t.c == 0 && t.d == -1.0){// LandscapeLeftdegress = 180;}return degress;
}
// 处理视频角度
- (AVMutableVideoComposition *)fixedCompositionWithAsset:(AVAsset *)videoAsset {// AVMutableVideoComposition 指示是否启用视频合成导出,并提供视频合成说明。导出预设为AVAssetExportPresetPassthrough时忽略AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];// 视频转向int degrees = [VideoCommonTools degressFromVideoFileWithAsset:videoAsset];if (degrees != 0) {CGAffineTransform translateToCenter;CGAffineTransform mixedTransform;videoComposition.frameDuration = CMTimeMake(1, 30);NSArray *tracks = [videoAsset tracksWithMediaType:AVMediaTypeVideo];if (!tracks.count)return nil;AVAssetTrack *videoTrack = [tracks firstObject];// 视频合成器的具体操作类AVMutableVideoCompositionInstruction *roateInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];roateInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, [videoAsset duration]);// 具体操作视频的大小角度的一个类AVMutableVideoCompositionLayerInstruction *roateLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];if (degrees == 90) {// 顺时针旋转90°translateToCenter = CGAffineTransformMakeTranslation(videoTrack.naturalSize.height, 0.0);mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI_2);videoComposition.renderSize = CGSizeMake(videoTrack.naturalSize.height,videoTrack.naturalSize.width);[roateLayerInstruction setTransform:mixedTransform atTime:kCMTimeZero];} else if(degrees == 180){// 顺时针旋转180°translateToCenter = CGAffineTransformMakeTranslation(videoTrack.naturalSize.width, videoTrack.naturalSize.height);mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI);videoComposition.renderSize = CGSizeMake(videoTrack.naturalSize.width,videoTrack.naturalSize.height);[roateLayerInstruction setTransform:mixedTransform atTime:kCMTimeZero];} else if(degrees == 270){// 顺时针旋转270°translateToCenter = CGAffineTransformMakeTranslation(0.0, videoTrack.naturalSize.width);mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI_2*3.0);videoComposition.renderSize = CGSizeMake(videoTrack.naturalSize.height,videoTrack.naturalSize.width);[roateLayerInstruction setTransform:mixedTransform atTime:kCMTimeZero];}roateInstruction.layerInstructions = @[roateLayerInstruction];// 加入视频方向信息videoComposition.instructions = @[roateInstruction];}return videoComposition;
}

ios 视频处理详解一(视频导出)相关推荐

  1. IOS视频编辑功能详解下篇-视频裁剪、视频拼接、音视频的处理

    转自:http://www.hudongdong.com/ios/550.html 前言 用代码在简单视频编辑中,主要就是加美颜.水印(贴图).视频截取.视频拼接.音视频的处理,在美颜中,使用GPUI ...

  2. html5代码转换为视频,HTML5中的视频代码详解

    摘要 腾兴网为您分享:HTML5中的视频代码详解,智学网,云闪付,易推广,小红书等软件知识,以及360win10,流量魔盒,fitbit,上港商城,安卓2.3.7,全民惠,五年级下册英语单词表图片,t ...

  3. 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器...

    [索引页] [×××] 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器 作者:webabcd 介绍 Silverlight 2.0 ...

  4. Java关键字详解-配视频讲解链接(附带一些面试题)

    Java中常用的关键字详解-配视频讲解链接(附带一些面试题) 关键字:被Java赋予了特定含义的英文单词.关于关键字的学习贯穿了整个Java的学习,结合应用理解记忆关键字,不能单纯的死记硬背,在这里通 ...

  5. 短视频运营详解:抖音变现目前流行的是七种方式之一电商卖货

    短视频运营详解:抖音变现目前流行的是七种方式之电商卖货 抖音变现目前流行的是七种方式,电商卖货.广告营销.内容付费.品牌导流.直播变现.IP变现.社群营销. 我们分别来说一下:权威的三方报告提到过,抖 ...

  6. WebRTC视频JitterBuffer详解

    WebRTC视频JitterBuffer详解 1 WebRTC版本 2 概要 3 JitterBuffer结构和基本流程 4 帧完整性 - PacketBuffer 4.1 包缓存 4.2 帧的开始和 ...

  7. FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社

    大家好,我的第一本书正式出版了,可以在京东各大店铺抢购哦. <FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社> 京东自营链接:https://item.jd.com/13 ...

  8. Aegisub的视频窗口详解

    Aegisub的视频窗口详解 标准模式 拖放字幕 绕Z轴旋转字幕 绕X轴或Y轴旋转字幕 沿X轴和Y轴方向缩放 矩形裁剪 矢量裁剪 标准模式 在标准模式下,想要对字幕的位置进行更改,可通过下面两种方法来 ...

  9. Ffmpeg快速命令使用 Ffmpeg选项详解 Ffmepg格式详解 常见视频文件格式详解

    http://www.ffmpeg.com.cn/index.php/%E9%A6%96%E9%A1%B5 Ffmpeg快速命令使用 From Ffmpeg工程组 Jump to: navigatio ...

最新文章

  1. Nginx禁止特定用户代理(User Agents)访问(转)
  2. python有道翻译接口-【Python】Python利用有道翻译开发API应用示例
  3. 实例46:python
  4. PearProject 安装指南
  5. 谁能真正“撬动”微信?| 畅言
  6. jmeter学习指南之Beanshell Sampler 常用方法
  7. PHP 中检查是否关联数组(多维数组)的方法 (UPDATE!)
  8. 算法笔记--卢卡斯定理
  9. Android SDK下载太慢
  10. 腾达无线路由器dns服务器,腾达路由器怎么手动设置dns地址
  11. 树莓派如何接硬盘_树莓派之挂载移动硬盘
  12. 批量将多个 Excel 工作簿文件拆分成单个 Excel 工作簿文件
  13. linux bmp图片怎么转换成ppm,ppm图像格式与bmp之间的相互转换
  14. Go语言核心之美 2.1-整数
  15. CPU乱序发射与内存屏障
  16. CSS3 变形:平移、旋转与缩放
  17. Rook1.0部署+排错
  18. pitch yaw roll方向
  19. 如何写好一封电子邮件
  20. 2016下半年软件评测师上午考试试题

热门文章

  1. Hastelloy C22合金板材 圆钢 无缝管
  2. AnnotationProcessor 处理器不工作怎么定位?
  3. linux下c使用lzma_lzma文件及命令简介
  4. unity shader 入门 全透明与半透明效果实现
  5. 用了三年teambition的我,为什么改用飞项了?
  6. 高质量 Go 进阶图书,它来了
  7. JETT(五)-支持Excel公式
  8. python程序设计上机实践答案_清华大学出版社-图书详情-《C++程序设计上机实践与学习辅导(第三版)》...
  9. 高光谱图像算法实习工程师面经
  10. Mohican_4/22 结构体 typedef 枚举 联合 位段 内存对齐