AVAssetWriterInput设置质量与文件大小

时间:2014-10-29 19:23:50

标签: objective-c avfoundation osx-lion video-capture videoquality

这是一个相当具体的问题,让我感到难过。我正在编写一个视频录制软件,可以将视频数据从网络摄像头捕获到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];

这个质量问题是我软件的一大绊脚石,我迫切需要你的帮助。我很乐意发布您可能需要查看的任何其他代码,并测试您认为会产生影响的更改。

感谢您的时间。

0 个答案:

没有答案