Качество настроек AVAssetWriterInput и размер файла

Вот довольно конкретный вопрос, который поставил меня в тупик. Я пишу программное обеспечение для записи видео, которое записывает видеоданные с веб-камеры в 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];

Эта проблема с качеством является большим камнем преткновения в моем программном обеспечении, и мне отчаянно нужна ваша помощь. Я буду рад опубликовать любой другой код, который вам может понадобиться, и протестировать изменения, которые, по вашему мнению, будут иметь значение.

Спасибо за уделенное время.


person Ari Black    schedule 29.10.2014    source источник
comment
Прокомментировал AVVideoProfileLevelKey в соответствии с stackoverflow.com /вопросы/18505140/   -  person Ari Black    schedule 29.10.2014