Estoy tratando de comprimir video de alta calidad en un tamaño menor y puedo reducir el tamaño del video que he comprimido usando el siguiente código de objetivo-c:
- (BOOL)convertMovieToMP4:(NSString ) originalMovPath andStoragePath:(NSString ) compMovPath
{
NSURL *tmpSourceUrl = [NSURL fileURLWithPath:originalMovPath];
compMovPath = [compMovPath stringByReplacingOccurrencesOfString:[compMovPath pathExtension] withString:@"mp4"];
NSURL *tmpDestUrl = [NSURL fileURLWithPath:compMovPath];
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:tmpSourceUrl options:nil];
AVMutableComposition* mixComposition = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVAssetTrack *clipVideoTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
ofTrack:clipVideoTrack
atTime:kCMTimeZero error:nil];
[compositionVideoTrack setPreferredTransform:[[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] preferredTransform]];
CGSize videoSize = [[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize];
CATextLayer *titleLayer = [CATextLayer layer];
titleLayer.string = @"Ojatro";
titleLayer.font = (_bridge CFTypeRef Nullable)(@"Helvetica");
titleLayer.fontSize = videoSize.height / 8;
titleLayer.shadowOpacity = 0.2;
titleLayer.alignmentMode = kCAAlignmentCenter;
titleLayer.bounds = CGRectMake(0, 0, videoSize.width, videoSize.height / 6);
titleLayer.position=CGPointMake(videoSize.width/2, videoSize.height/2);
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height);
videoLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height);
[parentLayer addSublayer:videoLayer];
[parentLayer addSublayer:titleLayer];
AVMutableVideoComposition* videoComp = [AVMutableVideoComposition videoComposition];
videoComp.renderSize = videoSize;
videoComp.frameDuration = CMTimeMake(1, 30);
videoComp.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [mixComposition duration]);
AVAssetTrack *videoTrack = [[mixComposition tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVMutableVideoCompositionLayerInstruction* layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction];
videoComp.instructions = [NSArray arrayWithObject: instruction];
AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetMediumQuality];//AVAssetExportPresetPasst
_assetExport.videoComposition = videoComp;
//NSString* videoName = @"mynewwatermarkedvideo.mov";
NSString *tmpDirPath = [compMovPath stringByReplacingOccurrencesOfString:[compMovPath lastPathComponent] withString:@""];
if ([Utility makeDirectoryAtPath:tmpDirPath])
{
NSLog(@"Directory Created");
}
//exportPath=[exportPath stringByAppendingString:videoName];
NSURL *exportUrl = tmpDestUrl;
if ([[NSFileManager defaultManager] fileExistsAtPath:compMovPath])
{
[[NSFileManager defaultManager] removeItemAtPath:compMovPath error:nil];
}
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;
_assetExport.outputFileType = AVFileTypeMPEG4;
//[strRecordedFilename setString: exportPath];
[_assetExport exportAsynchronouslyWithCompletionHandler:
^(void ) {
switch (_assetExport.status)
{
case AVAssetExportSessionStatusUnknown:
NSLog(@"Export Status Unknown");
break;
case AVAssetExportSessionStatusWaiting:
NSLog(@"Export Waiting");
break;
case AVAssetExportSessionStatusExporting:
NSLog(@"Export Status");
break;
case AVAssetExportSessionStatusCompleted:
NSLog(@"Export Completed");
totalFilesCopied++;
[self startProgressBar];
break;
case AVAssetExportSessionStatusFailed:
NSLog(@"Export failed");
break;
case AVAssetExportSessionStatusCancelled:
NSLog(@"Export canceled");
break;
}
}
];
return NO;
}
Pero mi problema principal es que cuando comprimo el archivo de video de 500 MB (es decir, video promedio) y tarda aproximadamente 20 a 30 minutos. Reduce el tamaño del video a aproximadamente 130 MB. Estoy usando la Biblioteca AVFoundation nativa para comprimir el video para reducir su tamaño.
Necesito comprimir el tamaño del video muy rápido al igual que la aplicación Apple Compressor, comprime el archivo de 500 MB en solo 30 segundos ...
https://itunes.apple.com/en/app/compressor/id424390742?mt=12
También he usado la biblioteca FFMPEG para eso, pero eso también es lento. Ya no encontré esa biblioteca útil.
También intenté encontrar la solución usando otros lenguajes como, java, python. pero no encontró ninguna solución fue encontrada.
Si alguien tiene la solución para este problema en particular, o tiene algunas bibliotecas (es decir, biblioteca de pago o biblioteca de código abierto) que pueden hacer la compresión con menos tiempo al menos 1 minuto ... Por favor, comparta conmigo. O alguna otra pieza de código que pueda superar el problema del tiempo de compresión de 20 a 30 minutos a al menos 1 minuto.
Gracias...
Aquí hay un documento, que contiene algo de RnD en compresión de video: https://drive.google.com/file/d/0BySTUFVtfzJmM3pYeVRiWmxSLVU/view
También contiene un código de muestra para la compresión rápida de videos en Objective-C. Se utiliza AVAssetExportSession
para comprimir videos.
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras