美文网首页
视频切片上传与转码

视频切片上传与转码

作者: 星桥似海 | 来源:发表于2017-07-24 09:11 被阅读1167次

一、视频切片上传

1、获取视频数据的总片数

NSURL *fileURL = [NSURL fileURLWithPath:_mp4FilePath];
NSInteger fileSize = [NSData dataWithContentsOfURL:fileURL].length;
//    总片数的获取方法:
NSInteger chunks = (_fileSize%1024==0)?((int)(_fileSize/1024*1024)):((int)(_fileSize/(1024*1024) + 1));

2、获取每一片视频数据

 -(NSData *)readDataWithChunk:(NSInteger)chunk{

  //    将文件分片,读取每一片的数据:
NSData* data;
NSFileHandle *readHandle = [NSFileHandle fileHandleForReadingAtPath:_mp4FilePath];
int offset =1024*1024;//(每一片的大小是1M)
[readHandle seekToFileOffset:offset * chunk];
data = [readHandle readDataOfLength:offset];
return data;
}

3、上传每一片的数据

-(void)uploadData{
dispatch_group_t group = dispatch_group_create();
NSInteger chunk = 0;
for (NSData *data in self.fileArr) {
    if ([self.fileArr[chunk] isKindOfClass:[NSData class]]) {
        dispatch_group_enter(group);
        NSMutableDictionary *params = [NSMutableDictionary dictionary];
        [params setObject:_randomStr forKey:@"r"];
        [params setObject:@(_chunks) forKey:@"chunks"];
        [params setObject:@(chunk) forKey:@"chunk"];
        [XYNetworking uploadWithURL:@"oUpload.php" params:params fileData:data name:@"file" fileName:_fileName mimeType:@"video/*" success:^(id responseObject) {
            dispatch_group_leave(group);
            [self.fileArr replaceObjectAtIndex:chunk withObject:@"finish"];
        } failure:^(NSError *error) {
            dispatch_group_leave(group);
        }];
    }
    chunk++;
}

dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSLog(@"上传成功!");
});

}

二、视频转码

-(void)movFileTransformToMP4WithSourceUrl:(NSURL *)sourceUrl completion:(void(^)(NSString *Mp4FilePath))comepleteBlock
{
/**
 *  mov格式转mp4格式
 */
AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:sourceUrl options:nil];

NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];

NSLog(@"%@",compatiblePresets);

if ([compatiblePresets containsObject:AVAssetExportPresetHighestQuality]) {
    
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPresetMediumQuality];
    
    
    NSDate *date = [NSDate date];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyyMMddHHmmss"];
    NSString *uniqueName = [NSString stringWithFormat:@"%@.mp4",[formatter stringFromDate:date]];
    NSString *document = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    NSString * resultPath = [document stringByAppendingPathComponent:uniqueName];//PATH_OF_DOCUMENT为documents路径
    
    NSLog(@"output File Path : %@",resultPath);
    
    exportSession.outputURL = [NSURL fileURLWithPath:resultPath];
    
    exportSession.outputFileType = AVFileTypeMPEG4;//可以配置多种输出文件格式
    
    exportSession.shouldOptimizeForNetworkUse = YES;
    
    [exportSession exportAsynchronouslyWithCompletionHandler:^(void)
     
     {
         
         switch (exportSession.status) {
                 
             case AVAssetExportSessionStatusUnknown:
                 
                 NSLog(@"视频格式转换出错Unknown");
                 
                 break;
                 
             case AVAssetExportSessionStatusWaiting:
                 
                  NSLog(@"视频格式转换出错Waiting");

                 break;
                 
             case AVAssetExportSessionStatusExporting:
                 
                  NSLog(@"视频格式转换出错Exporting");

                 break;
                 
             case AVAssetExportSessionStatusCompleted:
             {
                 
                 NSLog(@"AVAssetExportSessionStatusCompleted");
                 NSLog(@"mp4 file size:%lf MB",[NSData dataWithContentsOfURL:exportSession.outputURL].length/1024.f/1024.f);
                 comepleteBlock(resultPath);
                 
             }
                 break;
                 
             case AVAssetExportSessionStatusFailed:
                 
                NSLog(@"视频格式转换出错Unknown");
                
                 break;
                 
             case AVAssetExportSessionStatusCancelled:
                 
                NSLog(@"视频格式转换出错Cancelled");

                 break;
         }
         
     }];
    
}
}

三、获取视频某一帧的图片

 /**
 获取视频缩略图
 */

+ (UIImage *)get_videoThumbImage:(NSURL *)videoURL
{
NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:videoURL options:opts];
AVAssetImageGenerator *generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset];
generator.appliesPreferredTrackTransform = YES;
CMTime actualTime;
NSError *error = nil;
CGImageRef img = [generator copyCGImageAtTime:CMTimeMake(0, 600) actualTime:&actualTime error:&error];
if (error) {
    return nil;
}
return [UIImage imageWithCGImage:img];
}

相关文章

  • 视频切片上传与转码

    一、视频切片上传 1、获取视频数据的总片数 2、获取每一片视频数据 3、上传每一片的数据 二、视频转码 三、获取视...

  • SpringBoot之@Async异步调用

    场景说明,最近需要开发视频转码,前端上传视频到后端,保存视频,转码,切片,加密,水印,最后上传到云存储,这一系列操...

  • 【华栖云】如何下载vms里面的视频

    VMS里面视频包含转码前的视频(上传的原始视频)和转码后的视频。 1、转码前视频下载方式: 找到相应视频,点击后面...

  • PHP七彩云转码CMS系统源码

    PHP七彩云转码CMS系统源码,非常实用的视频切片、云盘转码服务系统 更新日志1、增加多线程转码(使用多线程转码提...

  • LiveQing实现的多码率视频点播功能说明

    LiveQing云端流媒体,有一块的云直播和视频转码功能,其中,视频转码功能主要包含:上传、转码、分发。云直播功能...

  • LiveQing对数据库Sqlite3和MySQL的支持说明

    LiveQing云端流媒体,有一块的云直播和视频转码功能,其中,视频转码功能主要包含:上传、转码、分发。云直播功能...

  • LiveQing配置存储路径及正式部署建议

    LiveQing云端流媒体,有一块的云直播和视频转码功能,其中,视频转码功能主要包含:上传、转码、分发。云直播功能...

  • 视频切片上传

    主要用于大视频的切片上传 主要实现步骤: 声明变量 获取视频信息的工具类 视频切片 分配文件名:目前只做了mp4格...

  • 直播技术栈

    直播技术栈 总体需求 上传/汇聚 视频编码 视频推流 URL拉取 API上传 上传加速 实时美颜 视频转码 实时转...

  • iOS上传视频到服务器题

    iOS上传视频到服务器 这里介绍用AFN上传本地拍摄的视频到服务端 //视频转换为MP4 //转码操作... _h...

网友评论

      本文标题:视频切片上传与转码

      本文链接:https://www.haomeiwen.com/subject/cbbvkxtx.html