2011-02-19 31 views
2

我试图创建一个简单的视频应用程序(从ios 4设备加载现有视频文件,使用直接像素访问进行编辑并以不同的名称进行保存)。iOS 4:基于AVAsset的应用程序的视频质量

我设法加载,编辑和保存我的电影文件在真实设备(ipod 4g)。我唯一的问题是与电影质量(原始与编辑之一)有关。我不知道我在做什么错,但输出文件的质量与输入文件相比非常糟糕。

下面你可以找到我怎么装我的电影:

// // *** tmp file *** 
NSURL *movieUrl = [info objectForKey:@"UIImagePickerControllerMediaURL"]; 
NSLog(@"picker controller movie url: %@", [movieUrl absoluteString]); 
## picker controller movie url: /private/var/mobile/Applications/6253D1-8C0-41-B780-638250817/tmp//trim.2q03uz.MOV 
AVURLAsset *movieAsset = [[AVURLAsset alloc] initWithURL:movieUrl options:nil]; 
CGSize size = [movieAsset naturalSize]; 
NSLog(@"movie asset natual size: size.width = %f size.height = %f", size.width, size.height); 
## movie asset natual size: size.width = 224.000000 size.height = 128.000000 

// *** ASSET READER *** 
AVAssetReader *assetReader = [[AVAssetReader alloc] initWithAsset:movieAsset error:&error]; 
NSArray* videoTracks = [movieAsset tracksWithMediaType:AVMediaTypeVideo]; 
// asset track 
AVAssetTrack* videoTrack = [videoTracks objectAtIndex:0]; 
NSDictionary* dictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] 
          forKey:(id)kCVPixelBufferPixelFormatTypeKey]; 
NSLog(@"video track %f %f %d", [videoTrack naturalSize].width, [videoTrack naturalSize].height, [videoTrack nominalFrameRate]); 
## video track 224.000000 128.000000 0 
/* 
also tried 
kCVPixelFormatType_32BGRA 
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange 
*/ 
// asset reader track output 
AVAssetReaderTrackOutput* assetReaderOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack 
               outputSettings:dictionary]; 
if(![assetReader canAddOutput:assetReaderOutput]) 
    NSLog(@"unable to add reader output"); 
else 
    [assetReader addOutput:assetReaderOutput]; 

// *** ASSET WRITER *** 
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:exportURL 
           fileType:AVFileTypeQuickTimeMovie error:&error]; 
NSParameterAssert(videoWriter); 
NSLog(@"asset writer %d %d", [videoWriter status], [error code]); 

NSDictionary *videoCompressionProps = [NSDictionary dictionaryWithObjectsAndKeys: 
             [NSNumber numberWithDouble:128.0*1024.0], AVVideoAverageBitRateKey, 
             nil]; 

NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
           AVVideoCodecH264, AVVideoCodecKey, 
           [NSNumber numberWithInt:size.width], AVVideoWidthKey, 
           [NSNumber numberWithInt:size.height], AVVideoHeightKey, 
           //videoCompressionProps, AVVideoCompressionPropertiesKey,<- no difference at all 
           nil]; 

AVAssetWriterInput* writerInput = [[AVAssetWriterInput 
            assetWriterInputWithMediaType:AVMediaTypeVideo 
            outputSettings:videoSettings] retain]; 

// set preffered transform for output video 
writerInput.transform = [videoTrack preferredTransform]; 

NSParameterAssert(writerInput); 
NSParameterAssert([videoWriter canAddInput:writerInput]); 
[videoWriter addInput:writerInput]; 

writerInput.expectsMediaDataInRealTime = NO; 

然后,我只是读取下一个样本缓冲区,修改像素数据,并用不同的名称保存它。这已经工作,但输出质量是如此糟糕......

请大家给我一些建议:-)。

+0

非常好的努力。\ –

回答

1

尝试设置:

imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;

选择电影之前。

1

它看起来像你使用UIImagePickerController。这会压缩我相信的视频,导致您获得的质量很差。

另外,您可能会考虑将expectMediaDataInRealTime设置为YES,以优化帧的丢弃。

+0

非常感谢!你是对的。我确定视频质量不好与我使用AVAsset的方式有关,而与UIImagePickerController本身没有关系......这是一个指向文档的链接:http://developer.apple.com/library/ios/#文档/ uikit/reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html – peter

+0

很高兴帮助。如果它适合你,请接受它作为答案。 – akaru

相关问题