使用AVFoundation组合视频时的色彩偏差

时间:2017-06-12 04:34:02

标签: avassetwriter

- (void)makeVideoWithImages:(NSArray *)images seconds:(CGFloat)seconds block:(void (^)(NSString *videopath)) block  {  
...

UIImage *source = [images objectAtIndex:0];  
CGSize size = CGSizeMake(source.size.width*source.scale, source.size.height*source.scale);  

videoSettings = @{AVVideoCodecKey : AVVideoCodecH264,  
                  AVVideoWidthKey : [NSNumber numberWithInt:size.width],  
                  AVVideoHeightKey : [NSNumber numberWithInt:size.height]};  
self.outputWriter = [[AVAssetWriter alloc] initWithURL:url  
                                              fileType:AVFileTypeQuickTimeMovie error:&error];  

self.outputWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo  
                                                            outputSettings:videoSettings];  
[self.outputWriter addInput:self.outputWriterInput];  
NSDictionary *bufferAttributes = [NSDictionary dictionaryWithObjectsAndKeys:  
                                  [NSNumber numberWithInt:kCVPixelFormatType_32RGBA], kCVPixelBufferPixelFormatTypeKey, nil];  
self.bufferAdapter = [[AVAssetWriterInputPixelBufferAdaptor alloc] initWithAssetWriterInput:self.outputWriterInput sourcePixelBufferAttributes:bufferAttributes];  
frameTime = CMTimeMake(seconds*600, 600);  

[self.outputWriter startWriting];  
[self.outputWriter startSessionAtSourceTime:kCMTimeZero];  

...  
}  

当我使用上述方法合成视频时,颜色会发生变化。

预览效果: preview

演示就在这里。 https://github.com/qdvictory/TestForSyncthesizeVideo

有人能告诉我原因是什么吗?

1 个答案:

答案 0 :(得分:0)

在设置视频设置时,videoSettingsAVVideoCodecKey设置为AVVideoCodecH264(根据AVFoundation Video Settings Docs这似乎已弃用),其中 - 作为名称暗示 - 使用H.264/MPEG-4 Advanced Video Codec或维基百科:

  

录制,压缩和分发视频内容最常用的格式之一。

我相信在使用这种格式时,AVAssetWriterInput和文档我会导致它正在压缩图像以适应所述格式:

  

先前提供的媒体数据被处理并写入输出

这让我相信无论原始格式如何,数据总是被压缩(处理)。

为了帮助巩固我的观点,如果您查看图像,您可以看到视频中的颜色在粒子周围“更亮”,而照片的主要焦点与黑暗的颜色形成鲜明对比背景是一个非常好的指标,表明存在有损压缩。

查看其他有损压缩格式,您可以看到发生类似的行为。例如JPEG,在其维基百科页面上有一个很好的例子,左边有一个压缩的图片,右边的压缩程度低(具有讽刺意味的是图片是.png格式,我无法把它贴在这里)。虽然图片显然显示出极端压缩,但我认为了解极端压缩的极端是有用的。值得注意的是,虽然这个例子是一个静止而不是一个视频,它仍然足够相似,可以看到发生了什么。

至于解决方案......我恐怕无法帮助,我的专业知识不在于Objective-C。但你应该问自己:颜色100%准确有多重要?普通用户是否会注意到甚至关注细节上的这种轻微损失?