QTKit, захватывайте видео для прямой трансляции - PullRequest
1 голос
/ 12 октября 2011

Я пытаюсь создать приложение для Mac, которое будет создавать потоковое видео в реальном времени. Я знаю о VLC и других решениях, но все же.

С этой целью я пытаюсь записать видео из iSight с помощью QTKit и непрерывно сохранять его как серию крошечных видеофайлов. Однако запись получается не совсем непрерывной, с промежутками между файлами.

По сути, я просто устанавливаю таймер, который начинает запись в новый файл через определенные промежутки времени, тем самым останавливая старую запись. Я также попытался установить максимальную длину записи и использовать метод делегата ... didFinishRecording ... и ... willFinishRecording ..., но с тем же результатом (я не могу реально оценить разницу между пропусками в этих случаях ).

Пожалуйста, помогите мне, если вы знаете, как это сделать.

Вот мой текущий код:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { QTCaptureSession *session = [[QTCaptureSession alloc] init]; QTCaptureDevice *iSight = [QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeVideo]; [iSight open:nil]; QTCaptureDeviceInput *myInput = [QTCaptureDeviceInput deviceInputWithDevice:iSight]; output = [[QTCaptureMovieFileOutput alloc] init] ; //ivar, QTCaptureFileOutput [output setDelegate:self]; a = 0; //ivar, int fileName = @"/Users/dtv/filerecording_"; //ivar, NSString [session addOutput:output error:nil]; [session addInput:myInput error:nil]; [capview setCaptureSession:session]; //IBOutlet [session startRunning]; [output setCompressionOptions:[QTCompressionOptions compressionOptionsWithIdentifier:@"QTCompressionOptionsSD480SizeH264Video"] forConnection:[[output connections] objectAtIndex:0]]; [output recordToOutputFileURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%i.mov", fileName, a]] bufferDestination:QTCaptureFileOutputBufferDestinationOldFile]; NSTimer *tmr = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(getMovieLength:) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:tmr forMode:NSDefaultRunLoopMode]; }</p> <p>&dash; (void) getMovieLength:(NSTimer *) t { a++; [output recordToOutputFileURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%i.mov", fileName, a]] bufferDestination:QTCaptureFileOutputBufferDestinationOldFile]; }</p> <p>

1 Ответ

2 голосов
/ 17 октября 2011

Существует встроенный механизм, который разбивает захваченный фильм на куски.Используйте

[QTCaptureFileOutput setMaximumRecordedDuration:]

, чтобы указать продолжительность фрагмента, или

[QTCaptureFileOutput setMaximumRecordedFileSize:]

, чтобы указать ограничение размера файла.

Когда предел будет достигнут, метод делегата будетsaid:

[QTCaptureFileOutput_Delegate captureOutput: shouldChangeOutputFileAtURL: forConnections: dueToError:]

В этом методе вы можете установить новое имя файла:

[QTCaptureFileOutput recordToOutputFileURL:]

Это позволит вам довольно точно вырезать фрагменты записанного фильма.

Обратите внимание, что [QTCaptureFileOutput_Delegate captureOutput: didFinishRecordingToOutputFileAtURL: forConnections: dueToError:] будет вызван чуть позже после того, как запись в файл была фактически завершена.Если вы используете этот метод для установки нового файла, у вас будут пробелы в финальном видео.Это не значит, что вам не нужно использовать этот метод.Этот метод будет показан, когда фрагмент фильма будет готов к использованию.

Если вам нужна еще более точная обрезка, вы можете использовать

[QTCaptureFileOutput captureOutput: didOutputSampleBuffer: fromConnection:]

, чтобы указать точный кадр фильма, когда начинатьзапись в новый кусок.Однако для работы с методом вам понадобятся более конкретные знания.

...