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