Ограничение битрейта при захвате экрана AVFoundation в OSX Lion - PullRequest
3 голосов
/ 29 сентября 2011

Я использую AVFoundation на OSX Lion для захвата экрана. Выполняется следующим образом:

    self->screenInput = [[AVCaptureScreenInput alloc] initWithDisplayID:self->screen];
    self->dataOutput = [[AVCaptureVideoDataOutput alloc] init];
    self->session = [[AVCaptureSession alloc] init];
    self->assetWriter = [[AVAssetWriter alloc] initWithURL:url
                                                  fileType:AVFileTypeQuickTimeMovie 
                                                     error:&error];
    self->writerInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
                                                           outputSettings:nil] retain];
    self->dataOutput.videoSettings=videosettings;

- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection
{

    if(!self->startedWriting)
    {
        [self->assetWriter startSessionAtSourceTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];
        self->startedWriting = YES;
    }

    if(self->writerInput.readyForMoreMediaData)
    {
        [self->writerInput appendSampleBuffer:sampleBuffer]
    }

}

Это приводит к частоте кадров примерно 1 Мбит / с -> 3 Мбит / с. Проблема в том, что в настройках видео я указал:

NSMutableDictionary * compressionSettings = [[[NSMutableDictionary alloc] initWithCapacity:1] autorelease];
[compressionSettings setObject:[NSNumber numberWithInt:512000] forKey:AVVideoAverageBitRateKey];
[videosettings setObject:compressionSettings forKey:AVVideoCompressionPropertiesKey];

предназначены для 512 КБ, а более высокий битрейт приводит к тому, что файлы становятся слишком большими (в конце концов, нам нужно загрузить эти файлы).

Когда я удаляю строку

    self->dataOutput.videoSettings=videosettings;

и вместо этого применить настройки видео к входу устройства записи через

self->writerInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
                                                       outputSettings:videosettings] retain];

Я получаю слишком низкую скорость передачи битов (обычно 100 Кбит / с => 300 Кбит / с). Я предполагаю, что это потому, что кодирование происходит с помощью программного обеспечения, а не аппаратного обеспечения (это происходит после того, как данные возвращаются из AVCaptureSession).

Что я могу сделать, чтобы скорость захвата снизилась с 1-3 Мбит / с до 512 КБ? Если это может пойти выше, я не могу вообразить, почему это не могло бы просто ограничить скорость, которую это использует.

Спасибо

-G

1 Ответ

1 голос
/ 01 октября 2011

Из документов для свойства AVCaptureVideoDataOutput videoSettings

Currently, the only supported key is kCVPixelBufferPixelFormatTypeKey. Supported pixel formats are
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange and kCVPixelFormatType_32BGRA,
except on iPhone 3G, where the supported pixel formats are kCVPixelFormatType_422YpCbCr8 and kCVPixelFormatType_32BGRA.

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

Хотя в реализации OS-X AVFoundaton определенно может быть ошибка, битрейт, который вы получаете, может быть правильным. Например, сколько движения в видео? Насколько сложна сцена? Также имейте в виду, что H264 / AVC не является кодеком с постоянным битрейтом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...