我想根据设备和应用程序中的设置,将视频转码为特定的视频格式。例如,如果用户使用iPhone 4S并在我的应用程序中选择了中等设置,我希望在开始处理之前将视频转换为540p。如果他选择高,那么我想转码到720p。
我可以一帧一帧地读取视频,调整大小并保存到光盘,但这似乎不是很有效。我可以将视频转码到我的视频处理库中,最简单、最快的方法是什么?
我试过在我的UIImagePickerController上使用videoQuality设置,但似乎不起作用,因为即使我将其设置为UIImagePickerControllerQualityTypeIFrame960x540,我的视频也会显示为720p (640x480可以工作,但我需要更精细)。
发布于 2012-03-14 22:22:51
您可能想看看AVAssetExportSession,它使重新编码视频变得相当简单。我认为它在可能的情况下也是硬件支持的,就像AVFoundation的其余部分一样:
请注意,它永远不会使视频变得更大,因此不能保证您能获得所需的输出大小。假设您有一个ALAsset实例,下面的代码可能是您想要的东西的起点:
- (void)transcodeLibraryVideo:(ALAsset *)libraryAsset
toURL:(NSURL *)fileURL
withQuality:(NSString *quality) {
// get a video asset for the original video file
AVAsset *asset = [AVAsset assetWithURL:
[NSURL URLWithString:
[NSString stringWithFormat:@"%@",
[[libraryAsset defaultRepresentation] url]]]];
// see if it's possible to export at the requested quality
NSArray *compatiblePresets = [AVAssetExportSession
exportPresetsCompatibleWithAsset:asset];
if ([compatiblePresets containsObject:quality]) {
// set up the export
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]
initWithAsset:asset presetName:quality];
exportSession.outputURL = fileURL;
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
// run the export
[exportSession exportAsynchronouslyWithCompletionHandler:^{
switch ([exportSession status]) {
case AVAssetExportSessionStatusFailed:
//TODO: warn of failure
break;
case AVAssetExportSessionStatusCancelled:
//TODO: warn of cancellation
break;
default:
//TODO: do whatever is next
break;
}
[exportSession release];
}];
}
else {
//TODO: warn that the requested quality is not available
}
}例如,您可能希望为540p传递AVAssetExportPreset960x540质量,为720p传递AVAssetExportPreset1280x720质量。
https://stackoverflow.com/questions/9349022
复制相似问题