#前言
我最近在接手一个智能盒子的iOS应用,上面有一个功能是这样的。把你本地的照片和视频可以甩屏到你绑定的盒子上。
我的上一位前辈做的时候必须要求再同一个局域网,但是当我做的时候要求不同的局域网也要实现这样的一个功能,优化用户的使用感受。


#那么 我们下面就进入正题。

#内容一:图片上传
我做的图片上传是用的AF,原理就是把你想上传的照片取出来,如果有文件大小的要求就先做相应的图片压缩。
然后用AFHTTPSessionManager 类去做的上传,下面就是代码:

AFHTTPSessionManager *session = [AFHTTPSessionManager manager];[session.requestSerializer willChangeValueForKey:@"timeoutInterval"];session.requestSerializer.timeoutInterval = 60.f;[session.requestSerializer didChangeValueForKey:@"timeoutInterval"];session.responseSerializer = [AFHTTPResponseSerializer serializer];NSString *imageTitle =_imageSource[pageIndex].title;imageTitle = [imageTitle substringToIndex:imageTitle.length-4];NSDictionary *params = @{@"fileType":@"jpg",@"fileName":imageTitle};[session POST:@"你上传的接口地址" parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {for (NSString *key in dict.allKeys) {[formData appendPartWithFileData:[dict objectForKey:key] name:@"myFile" fileName:[NSString stringWithFormat:@"%@.jpg",key] mimeType:@"image/jpeg"];}} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {}];

这里主要就是和你们的后台确认好相应的参数设置就好了。


#内容二:视频上传
视频上传和图片上传其实是类似的,只不过就是参数的设置不一样而已。也是用上面的方法。关键也是设置好参数。
在这里我想说的是,有的时候视频太大要做相应的压缩处理。因为我之前对视频这面接触的比较少,也上网找了一些资料然后看到这样的一个方法:

- (void)lowQuailtyWithInputURL:(NSURL*)inputURLoutputURL:(NSURL*)outputURLblockHandler:(void (^)(AVAssetExportSession*))handler
{
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:inputURL options:nil];AVAssetExportSession *session = [[AVAssetExportSession alloc] initWithAsset:asset     presetName:AVAssetExportPresetMediumQuality];session.outputURL = outputURL;session.outputFileType = AVFileTypeQuickTimeMovie;[session exportAsynchronouslyWithCompletionHandler:^(void){handler(session);}];
}

通过这个方法就可以对视频进行相应的压缩处理。


#下面就是视频内容的旋转问题了。
一开始我听到了这个需求的时候我的脑子里真的是瞬间万马飞奔啊!! 这是什么鬼需求啊!鬼知道我经历了什么?
我想,那我就上网找一下吧!我找了一下,还真的有这么样的技术博客。但是一上来就是把他的代码网上一贴。我先大概的浏览了一下那代码的长度。写的我实在是没有耐心去仔细的看到底是怎么实现的。我就关掉了。可是后来一看,也没有别的什么博客供我参考了。在我走投无路的时候,我看到了这么一个博客,说是Apple自己就有Demo,我就抱着好奇的态度去看了看。下载了那个Demo仔细的研究了一下。果然就好使了。 那么,接下来就说一下。

再旋转视频之前我们先要确认一下,这个视频是要旋转多少度。

 AVURLAsset *asset = [AVURLAsset URLAssetWithURL:inputURL options:nil];NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];NSInteger degress;if([tracks count] > 0) {AVAssetTrack *videoTrack = [tracks objectAtIndex:0];CGAffineTransform t = videoTrack.preferredTransform;//这里的矩阵有旋转角度,转换一下即可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;}}

这样我们就可以通过degress来确认旋转的角度了。
那么我们接下来就开始旋转视频

AVMutableVideoCompositionInstruction *instruction = nil;AVMutableVideoCompositionLayerInstruction *layerInstruction = nil;CGAffineTransform t1;CGAffineTransform t2;AVAssetTrack *assetVideoTrack = nil;AVAssetTrack *assetAudioTrack = nil;// Check if the asset contains video and audio tracksif ([[asset tracksWithMediaType:AVMediaTypeVideo] count] != 0) {assetVideoTrack = [asset tracksWithMediaType:AVMediaTypeVideo][0];}if ([[asset tracksWithMediaType:AVMediaTypeAudio] count] != 0) {assetAudioTrack = [asset tracksWithMediaType:AVMediaTypeAudio][0];}CMTime insertionPoint = kCMTimeZero;NSError *error = nil;// Step 1// Create a composition with the given asset and insert audio and video tracks into it from the assetif (!mutableComposition) {// Check whether a composition has already been created, i.e, some other tool has already been applied// Create a new compositionmutableComposition = [AVMutableComposition composition];// Insert the video and audio tracks from AVAssetif (assetVideoTrack != nil) {AVMutableCompositionTrack *compositionVideoTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:assetVideoTrack atTime:insertionPoint error:&error];}if (assetAudioTrack != nil) {AVMutableCompositionTrack *compositionAudioTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];[compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:assetAudioTrack atTime:insertionPoint error:&error];}}
//    // Step 2
//    // Translate the composition to compensate the movement caused by rotation (since rotation would cause it to move out of frame)
//    t1 = CGAffineTransformMakeTranslation(assetVideoTrack.naturalSize.height, 0.0);
//    // Rotate transformation
//    t2 = CGAffineTransformRotate(t1, degreesToRadians(90));if (degress == 0) {t1 = CGAffineTransformMakeTranslation(0.0, 0.0);t2 = CGAffineTransformRotate(t1, degreesToRadians(0));}else if (degress == 90){t1 = CGAffineTransformMakeTranslation(assetVideoTrack.naturalSize.height, 0.0);t2 = CGAffineTransformRotate(t1, degreesToRadians(90));}else if (degress == 180){t1 = CGAffineTransformMakeTranslation(assetVideoTrack.naturalSize.width, assetVideoTrack.naturalSize.height);t2 = CGAffineTransformRotate(t1, degreesToRadians(180));}else if (degress == 270){t1 = CGAffineTransformMakeTranslation(0,assetVideoTrack.naturalSize.height*1.78);t2 = CGAffineTransformRotate(t1, degreesToRadians(-90));}// Step 3// Set the appropriate render sizes and rotational transformsif (!mutableVideoComposition) {// Create a new video compositionmutableVideoComposition = [AVMutableVideoComposition videoComposition];if (degress == 0 || degress == 180) {mutableVideoComposition.renderSize = CGSizeMake(assetVideoTrack.naturalSize.width,assetVideoTrack.naturalSize.height);}else{mutableVideoComposition.renderSize = CGSizeMake(assetVideoTrack.naturalSize.height,assetVideoTrack.naturalSize.width);}mutableVideoComposition.frameDuration = CMTimeMake(1, 30);// The rotate transform is set on a layer instructioninstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [mutableComposition duration]);layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:(mutableComposition.tracks)[0]];[layerInstruction setTransform:t2 atTime:kCMTimeZero];} else {mutableVideoComposition.renderSize = CGSizeMake(mutableVideoComposition.renderSize.height, mutableVideoComposition.renderSize.width);// Extract the existing layer instruction on the mutableVideoCompositioninstruction = (mutableVideoComposition.instructions)[0];layerInstruction = (instruction.layerInstructions)[0];// Check if a transform already exists on this layer instruction, this is done to add the current transform on top of previous editsCGAffineTransform existingTransform;if (![layerInstruction getTransformRampForTime:[mutableComposition duration] startTransform:&existingTransform endTransform:NULL timeRange:NULL]) {[layerInstruction setTransform:t2 atTime:kCMTimeZero];} else {// Note: the point of origin for rotation is the upper left corner of the composition, t3 is to compensate for originCGAffineTransform t3 = CGAffineTransformMakeTranslation(-1*assetVideoTrack.naturalSize.height/2, 0.0);CGAffineTransform newTransform = CGAffineTransformConcat(existingTransform, CGAffineTransformConcat(t2, t3));[layerInstruction setTransform:newTransform atTime:kCMTimeZero];}}// Step 4// Add the transform instructions to the video compositioninstruction.layerInstructions = @[layerInstruction];mutableVideoComposition.instructions = @[instruction];

到这个时候呢视频的旋转已经完成了。
上面我们不是写了一个视频压缩的方法吗?把这个时候生成的mutableVideoComposition赋值给session.videoComposition = mutableVideoComposition;就好了。这样就是先旋转视频然后直接压缩完成我们的需求。

iOS图片,视频上传视频内容旋转相关推荐

  1. uniapp-上传图片、上传视频

    基于 uniapp 的应用上传图片/视频 资源的实现: 功能涉及的主要 uniapp API 如下: 1.选择图片:uni.chooseImage(OBJECT) | uni-app官网 2.选择视频 ...

  2. 腾讯视频上传视频如何同步到企鹅号

    企鹅号是腾讯的一个非常棒的产品,让一大批自媒体人赚了钱,我们都知道腾讯视频和企鹅号是互通的,腾讯视频中的视频也可以同步到企鹅号中.所以今天播放器家园网小编教大家如何将视频进行同步. 腾讯视频上传视频如 ...

  3. 阿里云视频上传视频获取进度条问题(使用session方案,获取进度一直为0的解决方案)补充:前后端分离项目中获取进度解决方案

    1.场景描述: 之前用阿里云上传视频,前端反应上传视频经常出现获取视频url失败问题.但是接口我测过很多遍都是没有问题的.后台这边提供了一个视频上传的接口返回一个videoId,还提供了一个根据vid ...

  4. php 编辑器 插入视频,苗景云的博客-PHPCMS V9编辑器中新增上传mp4视频(上传视频并插入HTML5的video标签)的功能...

    由于PHPCMS v9默认的编辑器中上传的视频插入的是embed标签使用的是flash播放器,手机端无法播放,所以来改造下,让其上传视频并插入HTML5的video标签,这样电脑端的主流浏览器和手机端 ...

  5. 解析腾讯视频上传视频源地址网址

    公司最近想用小程序播放腾讯视频的视频,由于小程序的微信接口只是调用视频的vid就能进行播放,但是在pc网页上进行播放就要拿到视频的真实地址,然而实际上腾讯视频上传后只是给你一个:https://v.q ...

  6. yii2.0使用ueditior完成上传单张,多张图片,上传视频等操作

    一.前言 由于工作需求需要集成富文本编辑器,本来是想要选用之前用过的WangEditor的,但是考虑到WangEditor还是比较小众,所以最终选择了没用过的Uedtor,这篇文章主要讲述了Yii2. ...

  7. php腾讯云+视频上传失败,腾讯云视频上传和播放尝试总结

    项目中需要用到腾讯云视频,做了一个完整的流程尝试,总结一下. 基本需求是通过后台管理页面上传视频,然后通过网页,Android和iOS播放视频. 腾讯视频分三大部分:视频上传,视频处理,视频播放,相应 ...

  8. springboot阿里云视频点播服务实现上传视频和删除功能

    视频播放参照地址:https://www.cnblogs.com/konglxblog/p/15116534.html 一.开通视频点播云平台 1.选择视频点播服务(收费) 阿里云地址:https:/ ...

  9. vue上传录音_vue实现移动端input上传视频、音频

    vue移动端input上传视频.音频,供大家参考,具体内容如下 html部分 现场视频 上传视频 现场音频频 上传音频 js部分 getVideo (ev, typer) { let taht = t ...

最新文章

  1. java 时间戳加密_加密PHP中的时间戳并用Java解密
  2. python编写的软件界面-用Python写一个带图形界面的文件压缩软件
  3. 5、kafka的操作
  4. python入门到精通自学_python入门到精通大型视频、自学者的福利
  5. ASP技巧实例:几行代码解决防止表单重复提交
  6. XCTF(攻防世界)—新手web题Write Up
  7. 基于正样本的表面缺陷检测
  8. C#异常解决:在调用OLE之前,必须将当前线程设置为单线程单单元(STA)模式。
  9. 鲲鹏服务器项目背景_华为鲲鹏产业生态加速算力升级,企业数字化转型在山西吹响号角...
  10. 一起学《Troubleshooting Oracle Performance》吧
  11. Java中四种遍历Map对象的方法
  12. DevExpress 创建EXCEL
  13. BIM知识 | BIM管线综合原则
  14. springboot+pagehelper踩坑,PageHelper.startPage没有生效问题
  15. 基于机会网络环境模拟器的命名数据容迟网络的设计与实现
  16. 【个税】2020年个人所得税计算规则
  17. position的属性(sticky属性)
  18. sdn网络搭建以及负载均衡
  19. 解决:outlook邮件内容过宽,打印不全
  20. MFC 视图-OpenGL场景-CDialogBar三个界面保存为图片

热门文章

  1. Tcl学习之--列表|字典
  2. StringUtils
  3. linux内核map图
  4. ASP.NET2.0轻松搞定统计图表【月儿原创】
  5. 关于 ulimit -SHn 65535
  6. Caffe源码中Pooling Layer文件分析
  7. 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作
  8. linux驱动:音频驱动(七)交叉编译alsa库及工具集alsa-utils
  9. travis-ci如何配置android
  10. c语言贝叶斯分类,基于朴素贝叶斯分类器的文本分类算法(C语言)