[iOS]录制或从相册选择视频

2024-08-20 22:58
文章标签 视频 选择 ios 录制 相册

本文主要是介绍[iOS]录制或从相册选择视频,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写一个“添加视频”的功能
内容:
1.从相册选择视频
2.录制视频
3.将mov格式视频转为mp4
4.使用封装的SLPlayer播放器播放视频

GitHub:https://github.com/Gamin-fzym/GAVideoRecordDemo
Demo:https://download.csdn.net/download/u012881779/12116007

示意图:

详见demo,这里放部分代码水一下。

#import "HomeViewController.h"
#import "GSRecordVideoController.h"
#import "GSRecordEngine.h"
#import <CoreServices/CoreServices.h>
#import "UIViewController+NoSlideBack.h"
#import "GSPSVideoModel.h"@interface HomeViewController () <UITableViewDelegate, UITableViewDataSource, GSPSVideoCellDelegate, GSRecordVideoControllerDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate>@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (strong, nonatomic) UIImagePickerController *moviePicker; // 视频选择器
@property (strong, nonatomic) GSRecordEngine *recordEngine;
@property (strong, nonatomic) GSPSVideoModel *videoModel;@end@implementation HomeViewController- (void)viewDidLoad {[super viewDidLoad];self.tableView.estimatedRowHeight = 100;self.tableView.rowHeight = UITableViewAutomaticDimension;[self.tableView registerNib:[UINib nibWithNibName:GSPSVideoCellIdentifier bundle:nil] forCellReuseIdentifier:GSPSVideoCellIdentifier];}- (IBAction)tapAddVideoAction:(id)sender {UIAlertController *alertCtrl = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];[alertCtrl addAction:[UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {[self presentViewController:self.moviePicker animated:YES completion:nil];}]];[alertCtrl addAction:[UIAlertAction actionWithTitle:@"拍摄" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {GSRecordVideoController *con = GSRecordVideoController.new;con.hidesBottomBarWhenPushed = YES;con.delegate = self;[self presentViewController:con animated:YES completion:nil];}]];[alertCtrl addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];[self presentViewController:alertCtrl animated:YES completion:nil];
}#pragma mark - 懒加载
- (GSRecordEngine *)recordEngine {if (_recordEngine == nil) {_recordEngine = [[GSRecordEngine alloc] init];}return _recordEngine;
}- (UIImagePickerController *)moviePicker {if (_moviePicker == nil) {_moviePicker = [[UIImagePickerController alloc] init];_moviePicker.delegate = self;[_moviePicker configNoSlideBack];_moviePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;_moviePicker.mediaTypes = @[(NSString *)kUTTypeMovie];_moviePicker.allowsEditing = YES;_moviePicker.videoMaximumDuration = GS_Video_Limit_Seconds;}return _moviePicker;
}#pragma mark - UITableViewDelegate, UITableViewDataSource- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return 1;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {GSPSVideoCell *videoCell = [tableView dequeueReusableCellWithIdentifier:GSPSVideoCellIdentifier forIndexPath:indexPath];videoCell.videoModel = self.videoModel;videoCell.delegate = self;return videoCell;
}#pragma mark - GSPSVideoCellDelegate- (void)GSPSVideoCell_PlayClickWithPath:(NSString *)playPath {}#pragma mark - GSRecordVideoControllerDelegate
// 录像
- (void)handleWithRecordPath:(NSString *)recordPath withFirstImage:(UIImage *)firstImage withTotalTimeFormat:(NSString *)totalTimeFormat {GSPSVideoModel *videoModel = GSPSVideoModel.new;videoModel.videoLocalPath = recordPath;videoModel.videoFirstImg = firstImage;videoModel.videoTimeFormat = totalTimeFormat;self.videoModel = videoModel;[self.tableView reloadData];
}#pragma mark - UIImagePickerControllerDelegate
// 选择视频
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {if ([[info objectForKey:UIImagePickerControllerMediaType] isEqualToString:(NSString*)kUTTypeMovie]) {// 获取视频的名称NSString *videoPath = [NSString stringWithFormat:@"%@",[info objectForKey:UIImagePickerControllerMediaURL]];// 如果视频是mov格式的则转为MP4的if ([videoPath containsString:@".MOV"]) {NSURL *videoUrl = [info objectForKey:UIImagePickerControllerMediaURL];CGFloat timeSecs = [self getVideoDuration:videoUrl];NSString *timeFormat = [self Timeformat2FromSeconds:timeSecs];WEAKSELF[self.recordEngine changeMovToMp4:videoUrl dataBlock:^(UIImage *movieImage) {[weakSelf.moviePicker dismissViewControllerAnimated:YES completion:^{[self handleWithRecordPath:weakSelf.recordEngine.videoPath withFirstImage:movieImage withTotalTimeFormat:timeFormat];}];}];}}
}- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {[picker.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}#pragma mark - 其它
// 获取视频时间
- (CGFloat)getVideoDuration:(NSURL *)URL {NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO]forKey:AVURLAssetPreferPreciseDurationAndTimingKey];AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:URL options:opts];float second = 0;second = urlAsset.duration.value/urlAsset.duration.timescale;return second;
}// 获取视频 大小
- (NSInteger)getFileSize:(NSString *)path {NSFileManager * filemanager = [[NSFileManager alloc]init];if([filemanager fileExistsAtPath:path]){NSDictionary * attributes = [filemanager attributesOfItemAtPath:path error:nil];NSNumber *theFileSize;if ( (theFileSize = [attributes objectForKey:NSFileSize]) ) {return  [theFileSize intValue]/1024;} else {return -1;}} else {return -1;}
}// 秒数格式化
- (NSString *)Timeformat2FromSeconds:(NSInteger)seconds {//format of hourNSString *str_hour = [NSString stringWithFormat:@"%02ld",seconds/3600];//format of minuteNSString *str_minute = [NSString stringWithFormat:@"%02ld",(seconds%3600)/60];//format of secondNSString *str_second = [NSString stringWithFormat:@"%02ld",seconds%60];//format of timeNSString *format_time;if ([str_hour isEqualToString:@"00"]) {format_time = [NSString stringWithFormat:@"%@:%@",str_minute,str_second];} else {format_time = [NSString stringWithFormat:@"%@:%@:%@",str_hour,str_minute,str_second];}return format_time;
}@end

 

这篇关于[iOS]录制或从相册选择视频的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091413

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序