Добавление аудиовхода и поддержки камеры DV

Если Вы работали через последовательность шагов, обрисованных в общих чертах в предыдущей главе, Вы теперь готовы расширить функциональность своего приложения устройства записи QTKit.

В этой главе Вы добавляете возможность аудиовхода к своему приложению устройства записи, а также поддержку ввода от камер DV. Это выполняется только с дюжиной строк кода Objective C с включенной обработкой ошибок.

Добавьте код для расширения класса MyRecorderController

Добавьте возможность аудиовхода и видеовход от камер DV:

  1. Xcode 3.2 запуска и открытый Ваш проект MyRecorder.

    • Щелкните MyRecorderController.h файл объявления.

    • Замените mCaptureDeviceInput переменная экземпляра с этими переменными экземпляра.

      QTCaptureDeviceInput        *mCaptureVideoDeviceInput;
      QTCaptureDeviceInput        *mCaptureAudioDeviceInput;

      Это переменные аудиоустройства и устройства ввода видеосигнала, позволяющие Вам записать аудио, а также видео от внешних камер DV.

    В этой точке Ваш код должен быть похожим на это:

    #import <Cocoa/Cocoa.h>
    #import <QTKit/QTKit.h>
     
    @interface MyRecorderController : NSObject {
        IBOutlet QTCaptureView      *mCaptureView;
     
        QTCaptureSession            *mCaptureSession;
        QTCaptureMovieFileOutput    *mCaptureMovieFileOutput;
        QTCaptureDeviceInput        *mCaptureVideoDeviceInput;
        QTCaptureDeviceInput        *mCaptureAudioDeviceInput;
    }
    - (IBAction)startRecording:(id)sender;
    - (IBAction)stopRecording:(id)sender;
     
    @end

Измените методы в реализации

Теперь откройте Ваш MyRecorderController.m файл реализации.

  1. Прокрутите вниз к начинающемуся блоку кода QTCaptureDevice *videoDevice.

    • Найдите устройство ввода видеосигнала, такое как iSight камера, и откройте ее.

    QTCaptureDevice *videoDevice = [QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeVideo];
    success = [videoDevice open:&error];
  2. Если Вы не можете найти или открыть устройство ввода видеосигнала, попытайтесь найти и открыть мультиплексированное устройство ввода видеосигнала, такое как камера DV.

    Обратите внимание на то, что в мультиплексированном видео, аудиотреки и видеотреки смешаны вместе.

        if (!success) {
            videoDevice = [QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeMuxed];
            success = [videoDevice open:&error];
    }
    if (!success) {
       [videoDevice = nil;
    }
    if (videoDevice) {
  3. Добавьте поддержку аудио от устройства аудиовхода до сеанса получения.

    Обратите внимание на то, что Вы добавили аудио тип QTMediaTypeSound к видеоустройству для обработки работы по дому получения аудиопотока в сеансе получения.

            mCaptureVideoDeviceInput = [[QTCaptureDeviceInput alloc] initWithDevice:videoDevice];
            success = [mCaptureSession addInput:mCaptureVideoDeviceInput error:&error];
            if (!success) {
            }
     
            if (![videoDevice hasMediaType:QTMediaTypeSound] && ![videoDevice hasMediaType:QTMediaTypeMuxed]) {
     
                QTCaptureDevice *audioDevice = [QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeSound];
                success = [audioDevice open:&error];
     
                if (!success) {
                    audioDevice = nil;
                }
     
                if (audioDevice) {
                    mCaptureAudioDeviceInput = [[QTCaptureDeviceInput alloc] initWithDevice:audioDevice];
     
                    success = [mCaptureSession addInput:mCaptureAudioDeviceInput error:&error];
                    if (!success) {
                    }
                }
            }
  4. Создайте вывод файла ролика и добавьте его к сеансу.

            mCaptureMovieFileOutput = [[QTCaptureMovieFileOutput alloc] init];
            success = [mCaptureSession addOutput:mCaptureMovieFileOutput error:&error];
            if (!success) {
            }
  5. Свяжите представление получения в UI с сеансом.

            [mCaptureView setCaptureSession:mCaptureSession];
     
            [mCaptureSession startRunning];
        }
     
    }
  6. Окно дескриптора заключительные уведомления для Вашего устройства вводится.

    - (void)windowWillClose:(NSNotification *)notification
    {
        [mCaptureSession stopRunning];
        if ([[mCaptureVideoDeviceInput device] isOpen])
            [[mCaptureVideoDeviceInput device] close];
        if ([[mCaptureAudioDeviceInput device] isOpen])
            [[mCaptureAudioDeviceInput device] close];
    }
  7. Освободите память для своих объектов получения.

    - (void)dealloc
    {
        [mCaptureSession release];
        [mCaptureVideoDeviceInput release];
        [mCaptureAudioDeviceInput release];
        [mCaptureMovieFileOutput release];
     
        [super dealloc];
    }
  8. Добавьте, что они запускают и прекращают записывать действия.

    - (IBAction)startRecording:(id)sender
    .
    .
    .
    - (IBAction)stopRecording:(id)sender
    }
  9. Укажите выходное место назначения для своих носителей с записанными данными, в этом случае, фильма в формате QuickTime.

    • Вставьте блок кода в IB startRecording: и stopRecording: действия на предыдущем шаге.

    {
        [mCaptureMovieFileOutput recordToOutputFileURL:[NSURL fileURLWithPath:@"/Users/Shared/My Recorded Movie.mov"]];
    }
    {
        [mCaptureMovieFileOutput recordToOutputFileURL:nil];
    - (void)captureOutput:(QTCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL forConnections:(NSArray *)connections dueToError:(NSError *)error
    {
        [[NSWorkspace sharedWorkspace] openURL:outputFileURL];
    }
     
    @end

Теперь создайте и скомпилируйте свое расширенное приложение устройства записи QTKit. После запуска приложения можно начать получать аудио от iSight камеры или аудио/видео от камеры DV. Вывод снова зарегистрирован как фильм в формате QuickTime и затем автоматически открыт в QuickTime Player на Вашем рабочем столе.