Я использую 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