欢迎光临外链购买平台,轻松为你获得外链购买的成功案例,友链相关事宜咨询:18978701720,黄经理

外链购买,专注打造匠心好平台

一个好的外链购买,可以为你轻松解决获客难题

IOS开发中音视频的采集、压缩和上传

作者:jcmp      发布时间:2021-05-08      浏览量:4
随着市场直播的发展,媒体流在市场中的重要

随着市场直播的发展,媒体流在市场中的重要性越来越受到开发者的重视。在最后一个项目的开发中,这个菜鸟也遇到了非常尴尬的视频流和音频流处理、上传。它也有很多漏洞,因为原来的项目是一个社会服务项目,它要求用户能够上传视频、语音等,因此涉及到音频和视频的处理。

时间过得很快,2016年很快过去,最近相对空闲。所有以有限的时间总结出一些更有趣的知识点,在过去的一年左右与大家分享,我希望所有伟大的神给出更多的建议,不喜欢喷雾。谢谢。这个菜鸟还会再打。

本文分享了菜鸟对视频的一些处理,并且在音频之后有时间互相分享。

视频采集和上传
1:直接拍摄,压缩上传到服务器
2:从相册中选择现有视频,压缩上传到服务器。

第一种方法容易处理,拍摄后直接获取视频流和路径也不困难。第二种方法是
,在执行项目时,我遇到了很多漏洞(该项目与超过7.0的项目兼容)。当我得到视频流时,8.0以上和8.0以下的方法是不同的,并且被困住了。

下面直接发布代码,并解释说,我希望我遇到的朋友能够互相鼓励。这位新秀也是个菜鸟,他的表现不太好。

视频Picker.SourceType=UIImagePickerControllerSourceTypeCamera;NSArray*mediaTypes=[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];visual Picker.visual Quality=UIImagePickerControllerQualityTypeMedium;视频Picker.visual MaximumDuration=1200.0f;//1200秒20分钟本项目只允许最长时间//visual Picker.mediaTypes=mediaTypes;视频Picker.mediaTypes=[NSarrayWithject:@“public。移动“;[自呈现ViewViewController:animated:YEScompletion:Nil];_BAR_=alloc]initWithTitle:@”设备不支持photography“message:nildelegate:nilcancelButtonTitle:@。”OtherButtonTitles:No Nil;Show];}#实用型video-(void)imagePickerController:(UIimagePickerControllerdidFinishPickingMediaWithInfo:(NSDictionary*)如何完成video-(void)imagePickerController:(UIimagePickerControllerdidFinishPickingMediaWithInfo:(NSDictionary*)信息{NSURL*视频URL*=[info]objectForKey:UIimagePickerControllerMediaURL];//视频path*beforeVideoData=[NSData]dataWithContentsOfURL:Video URL];//未压缩视频流//这是视频流处理的方法--这是一个解释。*视频服务器=ALLOC](用谷歌翻译)Init;NSString==References=ExternalLinks=@“只需给视频命名。”//当然,你的项目不是这么说的。这里要解释的是,[视频Server]CompressVideo:VideoURLAndVideoName:Random是一个随机保存:YES:YES您在做什么?^(NSData)*ResultData){//这是视频流压缩后调用的方式。如果压缩失败,我将未压缩的视频流直接上传到服务器[Self postFormData:Previor VideoData AndName:[NSString WithFormat:@“%@@”,随机名称,@“.mp4”]}{/成功压缩的视频流被上传到服务器[Self postFormData:ResultData AndName:[NSString string WithFormat:@%@@“,随机名称,@”mp4“]]}{/成功压缩的视频流被上传到服务器[Self postFormData:ResultData AndName:[NSString string WithFormat:@%@@”,随机名称@“.mp4”}/在这里我发现压缩前拍摄的视频在压缩后大小大致相同,难道苹果已经在拍摄后完成了处理吗?[选择者解雇视图控件动画:是,完成:零];

-2:从相册中选择视频,上传服务器-

#实用化标记用户在这里选择视频,这里的项目要求使用第三方选择照片和视频“TZImagePickerController”,感谢作者,但也遇到错误时使用无法满足项目的需要,我做了一些修改,感谢作者分享了所选的照片和视频-(Void)ImagePickerController:(TZImagePickerController*)-TZImagePickerController*(TZImagePickerController*)视频流路径实际上是不同的,IOS 8之上和下面的视频流由if([UIDevicecurrentDevice]处理。FloatValue>;=8。(F){//如果是IOS 8以上PHAsset*myAsset*myAsset;PHVideoRequestOptions*Options=[[PHVideoRequestOptions alloc]init];[[PHImageManager defaultManager]requestAVAssetForVideo:myAsset Options:Options RestHandler:^(AVAsset*_Nullable资产,AVAudioMix*_Nullable AuoMix,NSDicary*_Nullable info){NSURL*fileL=[Asset value eForKey:@“URL”];NSData*FronoData=[NSData dataWithWithConsOfURL:RUfileL];//未压缩的视频流VideoSERVER*VideoSERVER=[[VideoSERVER alloc]init];[VideoSERVER压缩视频:fileRUL和VideoName:随机名称和保存:no接续Compress:^(NSData*ResultData){if(ResultData==nil_x\xtData.ength==0){[Self postFormData:[NSString WithFormatat:@,随机名称,“.mp4”]];[Self postFormData:[NSString WithFormat:@“,随机名称,”.mp4“];}°{[Self postFormData:ResultData AndName:[NSString string WithFormat:@“%@%@”,随机名称,@“。MP4“];}};};}{/如果低于IOS 8,则获取视频流ALAssetPresation*REP=[资产违约代表];//视频流路径VideoSERVER*VideoSERVER=[[VideoSERVER alloc]init][VideoSERVER压缩视频:rep.url和VideoName:随机名称和保存:无成功压缩:^(nsdata*ResultData){if(ResultData==nsdata=nsdtData.length=0){//IOS 8以下压缩失败直接获取未压缩的视频流ALAssetPresation*REP=[资产默认表示];字节*Buffer=(Byte*)malloc(rep.size);NSUInteger Buffed=[REPgetBytes:BufferfromOffset:0.0 Length:rep.size Error:nil];NSData*visual Data=[NSData dataWithBytesNoCopy:缓冲区长度:Buffed FreeWhenDone:YES];[Self postFormData:visual PostFormData:[NSString string WFormat:@%@@“,随机名称,@”。MP4“}”{//如果压缩成功,请使用压缩上载服务器,但请注意,如果这里不需要异步,则在上载否则会挂调度_异步(调度_get_main_Queue(),^{[Self postFormData:ResultData AndName:[NSStringStringStringWithFormat:@“%@@”,随机名称,@.mp4“]时,程序必须在//IOS 8下面加入此请求);}

-以下是视频压缩的方法和获取视频的第一个帧缩略图的类-

#import<;Foundation/Foundation.h>;@Interface VideoSERVER:NSObject/视频名字@Property(非原子的、强的)NSString*视频名称;/压缩视频-(Void)压缩视频:(NSURL*)路径和视频名称:(NSString*)名称和保存:(Bool)SaveState Acceppress:(void(^)(nSData*))成功Compress;//获取视频的首帧缩略图-(UIImage*)ImageWithVideoURL:(nsURL*)url;@end>#import“VideoSERVER。H“#import<;Photos/Photos.h>;#import<;AssetsLibrary/AssetsLibrary.h>;@implementation VideoSERVER//压缩视频-(Void)压缩视频:(NSURL*)路径和视频名称:(NSString*)名称和保存:(Bool)SaveState继任Compress:(void(^)(nSData*))连续压缩//SaveState是否保存视频到相册{sel.visual Name=name;AVURLAsset*avAsset=[[avLAsset*]initWithURL:path Options:nil];NSArray*兼容预置=[AVAssetExportSession exportPresetsCompatbleWithAsset:avAsset];if([兼容预置预置containsObject:AVAssetExportPresetLowQuality]){AVAssetExportSession*exportSession*exportSession=[[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPreset640x480];exportSession.outputURL=[设置压缩后视频流导出的路径exportSessionURL];//设置压缩后视频流导出的路径exportSession.hidOptimizeForNetworkUse=true;//转换后的格式exportSession。OutputFileType=AVFileTypeMPEG4;//异步导出[exportSession exportAchronouslyWithCompletionHandler:^/如果导出状态是完成if([exportSession状态]==AVAssetExportSessionStatusCompleted){//NSlog(@“视频压缩成功,压缩大小%fMB”,[自文件大小:[自压缩URL]])如果(SaveState){[自保存视频:[自压缩URL]];//保存视频到相册}//压缩成功的视频流返回成功的Compress([NSData dataWContentsOfURL:[自压缩URL]])。长度>;0?[nsdata dataithContentsOfURL:[Self压缩URL]]:nil;}ell{//压缩失败的回调连续压缩压缩器(Nil);}}#务实标记保存压缩-(nsURL*)压缩url{返回[nsurl压缩失败的回调NSUserDomainMask,true)lastObject]ByAppendingPathComponent:[NSStringWFormat:@“%@.mp4”,Self。}#务实标记计算视频大小-(Cfloat)文件大小:(nsURL*)路径{返回[[nsdata dataithContentsOfurl:path]长度]/1024.00/1024。}#将视频保存到相册-(Void)SaveVideo:(NsURL)*)outputFileURL{ALAssetsLibrary*library=[[ALAssetsLibraryAlloc](与google translate)Init];[librarywriteVideoAtPathToSavedPhotosAlbum:OutputFileURLcompletionBlock:^(NSURLNsernon*Error)翻译){if(错误){//(@“未能保存视频:%@”错误);}{//NSLog(@“将视频保存到相册的成功”)}/*通过视频获取视频缩略图*@parurlvisual URL*@返回第一帧缩略图*/#MamarkGet视频的第一个缩略图-(UIImage*)ImageWithVideoURL:(NsURL)url{NSDictionary*opts=[NSDictionarydictionaryWithObject:numberWithBool:No]No]forKey:AVURLAssetPreferPreciseDurationAndTimingKey];*urlAsset=URLAssetWithURL:urloptions:opts];/根据资产=References=/设置缩略图的方向/如果不设置它,当视频旋转90°180°270°时,可能是视频旋转90°180°270°时。获得的缩略图不为正(您自己的understanding)generator.AppliesPreferredTrackTransform=YES;//设置最大大小(分辨率)生成器)。MaximumSize=CGSizeMake(600,450);NSError*Error=nil;/根据时间,得到帧N的图片//CMTimeMake(a,b)可理解为获取帧CGImageRefIMG=[生成器复制CGImageAtTime:CMTimeMake(010000)实际错误:NULL:&Error];UIImage*Image=[UIImageWithCGIMG:IMG];返回图片}@end

总结一些
这个菜鸟的一些总结,当然,分享与自己的项目做了适当的改变,目的是分享共同的鼓励,我希望伟大的神不会给出更多的建议,如果它能对你有好处的话,菜鸟会满意的。
获取视频的第一帧缩略图,因为菜鸟项目的需要,服务器需要客户端上传一张视频图片,以便显示在下面的页面上。