使用库或算法压缩视频大小的最快方法
Posted
技术标签:
【中文标题】使用库或算法压缩视频大小的最快方法【英文标题】:Fastest Way to Compress Video Size Using Library or Algo 【发布时间】:2016-12-08 11:07:16 【问题描述】:我正在尝试将高质量视频压缩成更小的尺寸,并且我可以使用以下 Objective-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;
但我的主要问题是,当我压缩 500MB 视频(即平均视频)文件时,大约需要 20 到 30 多分钟。它将视频大小减少到大约 130MB。我正在使用 Native AVFoundation 库来压缩视频以减小其大小。
我需要像 Apple Compressor 应用程序一样快速压缩视频大小,它仅在 30 秒内压缩 500MB 文件...
https://itunes.apple.com/en/app/compressor/id424390742?mt=12
我也为此使用了 FFMPEG 库,但这也很慢,我发现该库不再有用。
我还尝试使用其他语言(如 java、python)找到解决方案。但没有找到任何解决方案。
如果有人有这个特定问题的解决方案,或者有一些库(即付费库或开源库)可以在至少 1 分钟的时间内完成压缩......请与我分享。或者其他一些可以将压缩时间问题从 20 到 30 分钟缩短到至少 1 分钟的代码。
谢谢...
【问题讨论】:
【参考方案1】:这是一个文档,其中包含一些关于视频压缩的 RnD: https://drive.google.com/file/d/0BySTUFVtfzJmM3pYeVRiWmxSLVU/view
它还包含一个示例代码,用于在 Objective-C 中快速压缩视频。
它使用AVAssetExportSession
来压缩视频。
【讨论】:
以上是关于使用库或算法压缩视频大小的最快方法的主要内容,如果未能解决你的问题,请参考以下文章