Размеры изображения AVCaptureSession (с GPUImage)

Я пытаюсь реализовать запись видео в iOS поверх GPUImage.

У меня есть GPUImageVideoCamera, и я пытаюсь настроить запись следующим образом:

-(void)toggleVideoRecording {
if (!self.recording) {
    self.recording = true;
    GPUImageMovieWriter * mw = [self createMovieWriter: self.filter1];

    [self.filter1 addTarget:mw];
    mw.shouldPassthroughAudio = YES;
    [mw startRecording];
}
else {
    self.recording = false;
    [self finishWritingMovie];
}

}

-(GPUImageMovieWriter *) createMovieWriter:(GPUImageFilter *) forFilter {
    NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/CurrentMovie.m4v"];
    unlink([pathToMovie UTF8String]);
    NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];

    GPUImageMovieWriter * mw = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:forFilter->currentFilterSize];
    self.movieWriter = mw;
    self.movieURL = movieURL;

    return mw;
}

Это на самом деле в основном работает. Однако MoviewWriter нуждается в CGSize носителя ввода, и я не знаю, как вытащить его из VideoCamera. Во-первых, размер меняется, потому что камера использует sessionPreset: AVCaptureSessionPresetHigh, то есть зависит от возможностей устройства. А во-вторых, ориентация меняет соответствующий CGSize. Если пользователь начинает запись в ландшафтном режиме, я хочу изменить размеры.

Для тех, кто знает, как это сделать с помощью vanilla CoreVideo, я могу вытащить AVCaptureSession из моей GPUImageVideoCamera. (Но я прочитал API для AVCaptureSession, и ничего не выглядело многообещающим).

Было бы очень полезно даже сослаться на пример проекта, который занимается этим.


person masonk    schedule 01.09.2013    source источник


Ответы (1)


Действительно, можно вытащить измерения из сеанса захвата. Вот как:

// self.videoCamera is a GPUImageVideoCamera

AVCaptureVideoDataOutput *output = [[[self.videoCamera captureSession] outputs] lastObject];
NSDictionary* outputSettings = [output videoSettings];

long width  = [[outputSettings objectForKey:@"Width"]  longValue]; 
long height = [[outputSettings objectForKey:@"Height"] longValue];

if (UIInterfaceOrientationIsPortrait([self.videoCamera outputImageOrientation])) {
    long buf = width;
    width = height;
    height = buf;
}

GPUImageMovieWriter * mw = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(width, height)];
person masonk    schedule 09.09.2013
comment
Спасибо за ваш ответ, мне очень помог. Здесь используется Xamarin, поэтому код немного отличается, поскольку привязки обертывают AVCapureVideoOutput.videoSettings. Пример кода для справки: `Вывод AVCaptureVideoDataOutput = camera.CaptureSession.Outputs.OfType‹AVCaptureVideoDataOutput›().Last(); int h = output.UncompressedVideoSetting.Height ?? 0; int w = output.UncompressedVideoSetting.Width ?? 0; if (h == 0 || w == 0) выдать новое исключение InvalidOperationException (не удалось получить размер вывода видео из сеанса захвата);` - person Johannes Rudolph; 08.04.2014