热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

iOS视频压缩存储至本地并上传至服务器实例代码

最近做了一个项目,我把其中的核心功能拿出来和大家分享一下,重点还是自己梳理一下。 这里关于视频转码存储我整理了两个方法,这两个方法都是针对

最近做了一个项目,我把其中的核心功能拿出来和大家分享一下,重点还是自己梳理一下。

这里关于视频转码存储我整理了两个方法,这两个方法都是针对相册内视频进行处理的。

1、该方法没有对视频进行压缩,只是将视频原封不动地从相册拿出来放到沙盒路径下,目的是拿到视频的NSData以便上传

这里我传了一个URL,这个URL有点特别,是相册文件URL,所以我说过只针对相册视频进行处理

  //将原始视频的URL转化为NSData数据,写入沙盒
  + (void)videoWithUrl:(NSString *)url withFileName:(NSString *)fileName
  {
     ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
      if (url) {
       [assetLibrary assetForURL:[NSURL URLWithString:url] resultBlock:^(ALAsset *asset) {
      ALAssetRepresentation *rep = [asset defaultRepresentation];
      NSString *pathDocuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
      NSString *imagePath = [NSString stringWithFormat:@"%@/Image", pathDocuments];
      NSString *dbFilePath = [imagePath stringByAppendingPathComponent:fileName];
      char const *cvideoPath = [dbFilePath UTF8String];
      FILE *file = fopen(cvideoPath, "a+");
      if (file) {
        const int bufferSize = 11024 * 1024;
        // 初始化一个1M的buffer
        Byte *buffer = (Byte*)malloc(bufferSize);
        NSUInteger read = 0, offset = 0, written = 0;
        NSError* err = nil;
        if (rep.size != 0)
        {
          do {
            read = [rep getBytes:buffer fromOffset:offset length:bufferSize error:&err];
            written = fwrite(buffer, sizeof(char), read, file);
            offset += read;
          } while (read != 0 && !err);//没到结尾,没出错,ok继续
        }
        // 释放缓冲区,关闭文件
        free(buffer);
        buffer = NULL;
        fclose(file);
        file = NULL;
      }
    } failureBlock:nil];
  }
});
}

2、推荐使用该方法,该方法对视频进行压缩处理,压缩的程度可调

这里我传的是模型过去,将我的URL带过去的,然后压缩完毕用模型把NSData带出来,数据大家根据自己需求自由发挥

+ (void) convertVideoWithModel:(RZProjectFileModel *) model
{
  model.filename = [NSString stringWithFormat:@"%ld.mp4",RandomNum];
  //保存至沙盒路径
  NSString *pathDocuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
  NSString *videoPath = [NSString stringWithFormat:@"%@/Image", pathDocuments];
  model.sandBoxFilePath = [videoPath stringByAppendingPathComponent:model.filename];

  //转码配置
  AVURLAsset *asset = [AVURLAsset URLAssetWithURL:model.assetFilePath options:nil];
  AVAssetExportSession *exportSession= [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];
  exportSession.shouldOptimizeForNetworkUse = YES;
  exportSession.outputURL = [NSURL fileURLWithPath:model.sandBoxFilePath];
  exportSession.outputFileType = AVFileTypeMPEG4;
  [exportSession exportAsynchronouslyWithCompletionHandler:^{
     int exportStatus = exportSession.status;
    RZLog(@"%d",exportStatus);
    switch (exportStatus)
    {
      case AVAssetExportSessionStatusFailed:
      {
        // log error to text view
        NSError *exportError = exportSession.error;
        NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError);
        break;
      }
      case AVAssetExportSessionStatusCompleted:
      {
        RZLog(@"视频转码成功");
        NSData *data = [NSData dataWithContentsOfFile:model.sandBoxFilePath];
        model.fileData = data;
      }
    }
    }];

}

在这里你可以修改压缩比例,苹果官方都封装好了,根据需求调整

AVAssetExportSession *exportSession= [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];

在这里修改输出类型,正常情况下选MP4不会有什么问题的

exportSession.outputFileType = AVFileTypeMPEG4;

Mark一下图片压缩用这个,image是图片,0.4是比例,大小可调

model.fileData = UIImageJPEGRepresentation(image, 0.4);

这样你就很愉快地拿到转码过后的NSData了,然后播放一下试试

 MPMoviePlayerViewController* playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:sandBoxFilePath]];
[superVC presentViewController:playerView animated:YES completion:nil];

备注一下

可以发现我这里使用了沙盒存储,在下一节我整理一下用代码管理应用沙盒。

更新

最近发现好多人联系我,问我要Demo,最近我也整理了一下,目前挂在github上,望大神们指正。

https://github.com/Snoopy008/SelectVideoAndConvert

2017-3-23

偶然间帮一位好友看代码,发现了一个更简单的获取本地视频的NSData的方法,大家自己看,我就不解释了。代码放在github上https://github.com/Snoopy008/videoData

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Python安全实践:Web安全与SQL注入防御
    本文旨在介绍Web安全的基础知识,特别是如何使用Python和相关工具来识别和防止SQL注入攻击。通过实际案例分析,帮助读者理解SQL注入的危害,并掌握有效的防御策略。 ... [详细]
  • Web3隐私协议Manta Network与区块链互操作性平台Axelar达成战略合作,共同推进跨链资产的隐私保护。 ... [详细]
  • 本文详细介绍了如何利用go-zero框架从需求分析到最终部署至Kubernetes的全过程,特别聚焦于微服务架构中的网关设计与实现。项目采用了go-zero及其生态组件,涵盖了从API设计到RPC调用,再到生产环境下的监控与维护等多方面内容。 ... [详细]
  • 深入解析 Git 代码提交流程及常见问题处理
    本文详细阐述了使用 Git 进行代码提交的具体步骤,并提供了遇到常见问题时的解决方案,旨在帮助开发者更加高效地管理代码。 ... [详细]
  • 本文介绍了如何使用 Git 命令来忽略那些已经提交或者从远程仓库拉取但在本地进行了修改的文件,避免这些文件在不必要的时候被再次提交。 ... [详细]
  • 本文介绍了如何通过源码编译和PECL命令来升级Swoole扩展,详细记录了可能遇到的问题及解决方案。 ... [详细]
  • 图神经网络模型综述
    本文综述了图神经网络(Graph Neural Networks, GNN)的发展,从传统的数据存储模型转向图和动态模型,探讨了模型中的显性和隐性结构,并详细介绍了GNN的关键组件及其应用。 ... [详细]
  • 本文提供了详细的步骤,指导用户如何下载并安装 Git 的中文语言包,以提升用户体验。 ... [详细]
  • 贝叶斯方法的核心理念
    在探索概率深度学习的过程中,理解贝叶斯方法是至关重要的一步。本文旨在深入探讨贝叶斯方法的基本理念及其在深度学习中的应用,通过实例解析贝叶斯公式的内涵。 ... [详细]
  • 在使用Hibernate Validator时,遇到HV000030错误提示,这通常与验证注解的选择和使用不当有关。本文将详细介绍@NotNull、@NotEmpty和@NotBlank这三个注解的区别及其正确应用场景。 ... [详细]
  • 解决IntelliJ IDEA编辑配置选项消失问题
    本文介绍如何在IntelliJ IDEA中恢复意外消失的编辑配置选项,适用于2020.3.4版本用户遇到的相关问题。 ... [详细]
  • 本文详细介绍了在Windows 8操作系统上安装MindManager过程中遇到的问题及解决策略,特别是针对Visual C++ 2005 Redistributable安装错误的处理方法。 ... [详细]
  • 本文介绍了如何在现有Ceph集群中添加新节点以扩展存储容量,并确保在不中断服务的情况下完成这一操作。文章详细描述了新节点的安装配置步骤及数据重新平衡的方法。 ... [详细]
  • 本文详细介绍了LeetCode第791题“自定义字符串排序”的解决方案,包括两种不同的实现方法及其背后的逻辑。 ... [详细]
  • VSCode中实现大型项目函数跳转的方法
    在处理大型代码项目时,简单的C/C++插件往往无法满足需求。本文介绍如何通过配置GNU Global等工具,在VSCode中实现高效的函数跳转。 ... [详细]
author-avatar
mobiledu2502860217
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有