废话不多说,直接上转换代码
+ (NSURL *)jjMovConvert2Mp4:(NSURL *)movUrl
{
NSURL *mp4Url = nil;
AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:movUrl options:nil];
NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];
if ([compatiblePresets containsObject:AVAssetExportPresetHighestQuality]) {
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:avAsset
presetName:AVAssetExportPresetHighestQuality];
NSString *mp4Path = [NSString stringWithFormat:@"%@/%d%d.mp4", [self dataPath], (int)[[NSDate date] timeIntervalSince1970], arc4random() % 100000];
mp4Url = [NSURL fileURLWithPath:mp4Path];
exportSession.outputURL = mp4Url;
exportSession.shouldOptimizeForNetworkUse = YES;
exportSession.outputFileType = AVFileTypeMPEG4;
dispatch_semaphore_t wait = dispatch_semaphore_create(0l);
[exportSession exportAsynchronouslyWithCompletionHandler:^{
switch ([exportSession status]) {
case AVAssetExportSessionStatusFailed: {
NSLog(@"failed, error:%@.", exportSession.error);
} break;
case AVAssetExportSessionStatusCancelled: {
NSLog(@"cancelled.");
} break;
case AVAssetExportSessionStatusCompleted: {
NSLog(@"completed.");
} break;
default: {
NSLog(@"others.");
} break;
}
dispatch_semaphore_signal(wait);
}];
long timeout = dispatch_semaphore_wait(wait, DISPATCH_TIME_FOREVER);
if (timeout) {
NSLog(@"timeout.");
}
if (wait) {
//dispatch_release(wait);
wait = nil;
}
}
return mp4Url;
}
+ (NSString*)dataPath
{
NSString *dataPath = [NSString stringWithFormat:@"%@/Library/appdata/chatbuffer", NSHomeDirectory()];
NSFileManager *fm = [NSFileManager defaultManager];
if(![fm fileExistsAtPath:dataPath]){
[fm createDirectoryAtPath:dataPath
withIntermediateDirectories:YES
attributes:nil
error:nil];
}
return dataPath;
}
比如你是通过UIImagePickerController选择的视频文件,
在代理方法回调中:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info {
NSURL *url = info[@"UIImagePickerControllerMediaURL"];
//调用MOV转换成Mp4
NSString *filePath = [[NSURL jjMovConvert2Mp4:url] absoluteString];
NSData *data =[NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]];
NSString *storageFilePath = [self randomFilePathInTime:[filePath componentsSeparatedByString:@"."].lastObject];
BOOL isStorageState = [data writeToFile:storageFilePath atomically:YES];
if (isStorageState) {
success(storageFilePath,[filePath componentsSeparatedByString:@"/"].lastObject,data);
}
}