这是一个相当具体的问题,让我感到难过。我正在编写一个视频录制软件,可以将视频数据从网络摄像头捕获到MP4。我的软件将替换已经存在的脚本,该脚本触发QuickTime Player执行相同操作但输出到MOV。
我正在使用AVFoundation进行捕获和保存,但经过反复调整和测试后,我发现已经存在的脚本始终会创建更高的MOV文件视频质量和文件大小比我的软件。
以下是两个示例的链接,一个由现场脚本创建的MOV和一个由我的软件创建的MP4:https://www.dropbox.com/sh/1qnn5afmrquwfcr/AADQvDMWkbYJwVNlio9_vbeNa?dl=0
MOV是由同事创建的,是我试图与我的软件匹配的质量和文件大小。 MP4正在我的办公室录制,显然是一种不同的照明情况,但使用的是现场使用的相机。
比较两个视频,我可以看到它们具有相同的尺寸,持续时间和视频编解码器,但文件大小和质量都不同。
以下是我设置AVAssetWriter和AVAssetWriter输入的代码:
NSDictionary *settings = nil;
settings = [NSDictionary dictionaryWithObjectsAndKeys:
// Specify H264 (MPEG4) as the codec
AVVideoCodecH264, AVVideoCodecKey,
// Specify the video width and height
[NSNumber numberWithInt:self.recordSize.width], AVVideoWidthKey,
[NSNumber numberWithInt:self.recordSize.height], AVVideoHeightKey,
// Specify the video compression
[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInteger:2500000], AVVideoAverageBitRateKey,
[NSNumber numberWithInt:1], AVVideoMaxKeyFrameIntervalKey,
//AVVideoProfileLevelH264Baseline30, AVVideoProfileLevelKey, Not available on 10.7
nil], AVVideoCompressionPropertiesKey,
// Specify the HD output color
[NSDictionary dictionaryWithObjectsAndKeys:
AVVideoColorPrimaries_ITU_R_709_2, AVVideoColorPrimariesKey,
AVVideoTransferFunction_ITU_R_709_2, AVVideoTransferFunctionKey,
AVVideoYCbCrMatrix_ITU_R_709_2, AVVideoYCbCrMatrixKey, nil], AVVideoColorPropertiesKey,
nil];
self.assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:settings];// sourceFormatHint:self.formatHint];
/*self.pixelBufferAdaptor = [[AVAssetWriterInputPixelBufferAdaptor alloc]
initWithAssetWriterInput:self.assetWriterInput
sourcePixelBufferAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange],//kCVPixelFormatType_32BGRA],
kCVPixelBufferPixelFormatTypeKey,
nil]];*/
NSError *error;
self.videoFile = [NSURL fileURLWithPath:file];
//[self.movieFileOutput startRecordingToOutputFileURL:self.videoFile recordingDelegate:self];
self.assetWriter = [[AVAssetWriter alloc]
initWithURL:self.videoFile
fileType:AVFileTypeMPEG4//AVFileTypeQuickTimeMovie//
error:&error];
if (self.assetWriter){
[self.assetWriter addInput:self.assetWriterInput];
self.assetWriterInput.expectsMediaDataInRealTime = YES;
我设置AVCaptureVideoDataOutput并将其添加到捕获会话的代码:
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
output.alwaysDiscardsLateVideoFrames = NO;
output.videoSettings = nil;
self.videoQueue = dispatch_queue_create("ca.blackboxsoftware.avcapturequeue", NULL);
[output setSampleBufferDelegate:self queue:self.videoQueue];
[self.session addOutput:output];
这个质量问题是我软件的一大绊脚石,我迫切需要你的帮助。我很乐意发布您可能需要查看的任何其他代码,并测试您认为会产生影响的更改。
感谢您的时间。