Создавание простого приложения устройства записи QTKit

В этой главе Вы создаете простое приложение устройства записи QTKit. Когда завершено, Ваше устройство записи QTKit позволит Вам получать видеопоток и записывать вывод того потока к фильму в формате QuickTime. Для реализации этого устройства записи Вы будете удивлены тем, как немного строк кода Objective C необходимо записать.

Ваше приложение устройства записи будет иметь простой запуск и кнопки остановки, позволяющие Вам выводить и отображать свои полученные файлы в QuickTime Player. Для этого проекта Вы нуждаетесь в iSight камере, или встроенной, или включили Ваш Mac.

В создавании Вашего приложения устройства записи QTKit, как описано в этом учебном руководстве, Вы работаете по существу со следующими тремя объектами получения QTKit:

Моделируйте устройство записи

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

Prototype sketch of QTKit recorder application

В этом прототипе Вы используете три простых объекта Какао: представление получения QuickTime и две кнопки управления, чтобы запуститься и остановить фактический процесс записи. Это стандартные блоки для Вашего приложения. После того, как Вы изобразили схематически их, можно начать думать, как поднять трубку их в Интерфейсном Разработчике и что кодирует Вас потребность в Вашем проекте XCode заставить это произойти.

Создайте проект Используя Xcode 3.2

Выполните те же шаги, которые Вы выполнили, когда Вы создали и создали MyMediaPlayer приложение, описанное в Создавании Простого Приложения Медиапроигрывателя QTKit.

Создать проект:

  1. Xcode 3.2 запуска и выбирает File> New Project.

  2. Когда новое окно проекта появится, выберите Cocoa Application и нажмите Choose.

  3. Назовите MyRecorder проекта и перейдите к расположению, где Вы хотите, чтобы приложение XCode создало папку проекта. Окно проекта XCode появляется, как показано здесь.

    The Xcode project window for MyRecorderThe Xcode project window for MyRecorder
  4. Добавьте платформу QTKit к своему проекту MyRecorder.

    • Из Меню действий в Вашем проекте XCode выберите Add> Add to Existing Frameworks.

    • В /System/Library/Frameworks каталог, выбрать QTKit.framework.

    • Нажмите панель Target «MyMediaPlayer» Info и проверьте, что Вы соединились с QTKit.framework и Типом Required выбран.

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

Назовите файлы проекта и импортируйте заголовки QTKit

Теперь, когда Вы уже моделировали свое приложение устройства записи QTKit, по крайней мере в грубой форме с ясно определенной моделью данных, можно определить, какие действия и выходы должны быть реализованы. В этом случае у Вас есть a QTCaptureView объект, который является подклассом NSView, и две простых кнопки, чтобы запуститься и остановить запись Вашего полученного мультимедийного контента.

  1. Выберите File> New File. В панели прокрутите вниз и выберите Cocoa> класс Objective-C, включающий <Cocoa/Cocoa.h> заголовочные файлы.

  2. Назовите свой файл реализации MyRecorderController.m. Проверьте элемент в поле ниже для именования файла объявления MyRecorderController.h.

  3. В Вашем MyRecorderController.h файл, добавляет необходимый оператор импорта QTKit.

    #import <QTKit/QTKit.h>

Определите действия и выходы, которые Вы хотите

Теперь начните добавлять выходы и действия.

  1. В Вашем MyRecorderController.h файл, добавляет переменная экземпляра mCaptureView, который указывает на QTCaptureView возразите как выход.

    IBOutlet QTCaptureView *mCaptureView;
  2. Определите два действия, чтобы запустить и прекратить записывать.

    - (IBAction)startRecording:(id)sender;
    - (IBAction)stopRecording:(id)sender;

    В этой точке, коде в Вашем MyRecorderController.h файл должен быть похожим на это:

    #import <Cocoa/Cocoa.h>
    #import <QTKit/QTKit.h>
     
    @interface MyRecorderController : NSObject {
        IBOutlet QTCaptureView *mCaptureView;
    }
    - (IBAction)startRecording:(id)sender;
    - (IBAction)stopRecording:(id)sender;
     
    @end
  3. Откройтесь MyRecorderController.m файл и добавляет следующие действия, вместе с необходимыми фигурными скобками.

    - (IBAction)startRecording:(id)sender
    {
    }
    - (IBAction)stopRecording:(id)sender
    {
    }
  4. Спасите обоих Ваш MyRecorderController.h и MyRecorderController.m файлы. Иначе, когда Вы идете для работы в Интерфейсном Разработчике, приложение не будет знать о MyRecorderController класс.

Это завершает второй этап Вашего проекта. Теперь используйте Интерфейсного Разработчика 3.2 для построения пользовательского интерфейса для проекта.

Создайте пользовательский интерфейс

Теперь Вы создаете и реализуете различные элементы пользовательского интерфейса в своем проекте.

  1. Разработчик интерфейса запуска 3.2.

  2. В Вашем окне проекта XCode откройтесь MainMenu.xib файл.

  3. В Интерфейсном Разработчике 3.2, найдите библиотеку объектов.

  4. Установите окно предварительного просмотра.

    • Прокрутите вниз, пока Вы не найдете объект Представления Получения QuickTime.

      QuickTime Capture View control in the library

      QTCaptureView объект предоставляет Вам экземпляр подкласса представления для отображения предварительного просмотра видеовыхода, полученного сеансом получения.

    • Перетащите QTCaptureView возразите в свое окно и измените размеры объекта соответствовать окну, предусматривание пространства для этих двух Запускается и Кнопки остановки в Вашем устройстве записи QTKit.

    • Щелкните по объекту в окне.

      The resized QTCaptureView object and its class Identity defined in the Identity InspectorThe resized QTCaptureView object and its class Identity defined in the Identity Inspector
    • Установите автокалибровку для объекта в панели Capture View Size, как проиллюстрировано ниже.

      Setting the autosizing for your QTCaptureView object
  5. Определите атрибуты окна своего Окна MyRecorder.

    • Проверьте средства управления, появление, поведение, и элементы памяти проверяются, как показано на иллюстрации.

      Window attributes defined in the Inspector
    • Создайте Запуск и Кнопки остановки для Окна MyRecorder.

    • В Библиотеке выберите Кнопочное управление и перетащите его к Окну.

      ../Art/myrecorder_win_buttons.jpg../Art/myrecorder_win_buttons.jpg
    • Введите текст Start и копируйте кнопку для создания другой кнопки как Stop.

  6. Установите автокалибровку для своих кнопок (как показано на иллюстрации) путем нажатия кнопки и щелчка по Button Size Inspector.

    Setting up the autosizing for the Start and Stop buttons
  7. Добавьте контроллер и назовите его.

    • В Библиотеке прокрутите вниз и выберите синее управление кубом, которое является объектом (NSObject) можно инстанцировать как контроллер.

    • Перетащите объект в Ваш MainMenu.xib окно.

    • Выберите объект и введите его имя как My Recorder Controller. Тогда щелкните по информационному значку в Инспекторе.

    • При щелчке по полю Class Identity введите первые несколько букв имени класса в текстовое поле. Интерфейсный Разработчик автоматически заполняет его для Вас.

    MyRecorderController объект появляется. Если Вы сохранили и свое объявление и файлы реализации, как указано в, Определяют Действия и Выходы, которые Вы Хотите, Интерфейсный Разработчик автоматически обновляет MyRecorderController класс указан в Вашем файле реализации XCode. Чтобы проверить и подтвердить это, обновление произошло, нажмите Return. Если идентифицировать поле автоматически не обновляется, Вы, возможно, должны указать вручную, что это - a MyRecorderController объект.

Установите предварительный просмотр полученного видеовыхода

В следующей фазе Вашего проекта Вы продолжаете работать с Интерфейсным Разработчиком и XCode, чтобы создать и реализовать различные элементы в Вашем проекте. Из-за бесшовной интеграции между Интерфейсным Разработчиком и XCode, Ваш код будет работать более эффективно и с меньше наверху.

  1. В Интерфейсном Разработчике поднимите трубку MyRecorderController возразите против QTCaptureView объект.

    • Перетащите управление от MyRecorderController возразите в своем файле пера против QTCaptureView объект.

    • Прозрачная панель появляется, выводя на экран IBOutlet переменная экземпляра, mCaptureView, то, что Вы указали в своем файле объявления.

    The mCaptureView instance variable wired as an outlet for the MyRecorderController object
  2. Щелкните по Интерфейсному выходу Разработчика mCaptureView обеспечить электричеством два объекта.

Соедините проводом запуск и кнопки остановки

Теперь Вы готовы добавить свои кнопки Start и Stop и обеспечить электричеством их в Вашем окне MainMenu.nib.

  1. Перетащите управление каждый Запуск и Кнопки остановки от окна до MyRecorderController объект.

    • Щелкните startRecording: метод в прозрачной панели Received Actions для соединения Кнопки запуска.

    • Аналогично, щелкните stopRecording: метод в панели Received Actions для соединения Кнопки остановки.

    Wiring the recording buttons to the MyRecorderController object
  2. Теперь поднимите трубку окно и MyRecorderController возразите как делегат.

    Перетащите управление соединение от окна до MyRecorderController возразите и щелкните по выходу, соединив два объекта.

    Connecting the window to the MyRecorderController object as the delegate outlet
  3. Чтобы проверить корректное обеспечение электричеством объекта окна к объекту делегата выберите Window и щелкните по значку Window Connections Inspector.

    The window object wired up correctly to the delegate objectThe window object wired up correctly to the delegate object
  4. Проверьте, что Вы правильно обеспечили электричеством свои выходы и получили действия.

    Выберите Мой Контроллер Устройства записи, возражают и щелкают по значку My Recorder Controller Connections.

    My Recorder controller object and buttons wired up correctly
  5. Проверьте панель My Recorder Controller Identity Inspector для подтверждения выходов класса и групповых исков.

    Class actions and outlets specified in the identity inspector
  6. Щелкните MainMenu.xib файл, чтобы проверить, что Интерфейсный Разработчик и XCode сотрудничали для синхронизации действий и выходов, которые Вы указали.

    Маленький зеленый свет появляется в левом нижнем углу MainMenu.xib файл рядом с MyRecorder.xcodeproj подтвердить эту синхронизацию.

    The green light indicating synchronization between Xcode and Interface Builder
  7. Сохраните свой файл пера.

  8. Проверьте, что Ваше приложение QTKit MyRecorder появляется как показано на иллюстрации ниже.

    ../Art/myrecorder_with_buttons.jpg

Вы теперь завершили свою работу в Интерфейсном Разработчике 3.2. В этой следующей последовательности шагов Вы возвращаетесь к своему проекту XCode и добавляете несколько строк кода и в Вашем объявлении и в файлах реализации, чтобы создать и скомпилировать приложение.

Завершите реализацию класса MyRecorderController

Завершать реализацию MyRecorderController класс, необходимо определить переменные экземпляра, указывающие на сеанс получения, а также на объекты ввода и вывода. В Вашем проекте XCode Вы добавляете переменные экземпляра к объявлению интерфейса.

  1. Обновите Ваш MyRecorderController.h файл объявления:

    @interface MyRecorderController : NSObject {
    QTCaptureSession           *mCaptureSession;
    QTCaptureMovieFileOutput   *mCaptureMovieFileOutput;
    QTCaptureDeviceInput       *mCaptureDeviceInput;

    Полный код для Вашего файла объявления должен быть похожим на это:

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

    На остающихся шагах Вы изменяете MyRecorderController.m файл реализации. Эти шаги располагаются в логическом, хотя не обязательно твердый, упорядочить.

  2. Создайте сеанс получения.

    - (void)awakeFromNib
    {
        mCaptureSession = [[QTCaptureSession alloc] init];
  3. Подключите вводы и выводы к сеансу.

        BOOL success = NO;
        NSError *error;
  4. Найдите устройство и создайте ввод устройства. Тогда добавьте его к сеансу.

    QTCaptureDevice *device = [QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeVideo];
        if (device) {
            success = [device open:&error];
            if (!success) {
            }
            mCaptureDeviceInput = [[QTCaptureDeviceInput alloc] initWithDevice:device];
            success = [mCaptureSession addInput:mCaptureDeviceInput error:&error];
            if (!success) {
                // Handle error
            }
  5. Создайте вывод файла ролика и добавьте его к сеансу.

        mCaptureMovieFileOutput = [[QTCaptureMovieFileOutput alloc] init];
        success = [mCaptureSession addOutput:mCaptureMovieFileOutput error:&error];
        if (!success) {
        }
        [mCaptureMovieFileOutput setDelegate:self];
  6. Укажите опции сжатия с идентификатором с размером для видео и качеством для аудио.

    NSEnumerator *connectionEnumerator = [[mCaptureMovieFileOutput connections] objectEnumerator];
            QTCaptureConnection *connection;
     
            while ((connection = [connectionEnumerator nextObject])) {
                NSString *mediaType = [connection mediaType];
                QTCompressionOptions *compressionOptions = nil;
                if ([mediaType isEqualToString:QTMediaTypeVideo]) {
                    compressionOptions = [QTCompressionOptions compressionOptionsWithIdentifier:@"QTCompressionOptions240SizeH264Video"];
                } else if ([mediaType isEqualToString:QTMediaTypeSound]) {
                    compressionOptions = [QTCompressionOptions compressionOptionsWithIdentifier:@"QTCompressionOptionsHighQualityAACAudio"];
                }
     
                [mCaptureMovieFileOutput setCompressionOptions:compressionOptions forConnection:connection];
  7. Свяжите представление получения в пользовательском интерфейсе с сеансом.

        [mCaptureView setCaptureSession:mCaptureSession];
        }
  8. Запустите выполнение сеанса получения.

        [mCaptureSession startRunning];
    }
  9. Обработайте закрытие окна и уведомьте для Вашего устройства ввода данных, и затем остановите сеанс получения.

    - (void)windowWillClose:(NSNotification *)notification
    {
        [mCaptureSession stopRunning];
        [[mCaptureDeviceInput device] close];
    }
  10. Освободите память.

     - (void)dealloc
    {
        [mCaptureSession release];
        [mCaptureDeviceInput release];
        [mCaptureMovieFileOutput release];
     
        [super dealloc];
    }
  11. Реализация запускает и останавливает действия и указывает выходное место назначения для Ваших носителей с записанными данными, в этом случае фильм в формате QuickTime (.mov) в Вашем /Users/Shared папка.

     
    - (IBAction)startRecording:(id)sender
    {
        [mCaptureMovieFileOutput recordToOutputFileURL:[NSURL fileURLWithPath:@"/Users/Shared/My Recorded Movie.mov"]];
    }
     
    - (IBAction)stopRecording:(id)sender
    {
        [mCaptureMovieFileOutput recordToOutputFileURL:nil];
    }
  12. Закончите записывать и затем запустите свою запись как фильм в формате QuickTime на Вашем Рабочем столе.

     
    - (void)captureOutput:(QTCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL forConnections:(NSArray *)connections dueToError:(NSError *)error
    {
        [[NSWorkspace sharedWorkspace] openURL:outputFileURL];
    }

Создайте и скомпилируйте свое приложение устройства записи

После сохранения проекта нажмите Build и Go. После компиляции щелкните по Кнопке запуска для записи, и Кнопка остановки, чтобы прекратить записывать. Вывод Вашего полученного сеанса сохраняется как фильм в формате QuickTime по пути, который Вы указали в этом примере кода.

Используя простую iSight камеру, у Вас теперь есть возможность получения и носителей записи в определенном размере и качестве звука и затем выводе Вашей записи к фильму в формате QuickTime.

MyRecorder with Start and Stop buttons

Сводка

В этой главе, как программист, Вы фокусировались на создании приложения устройства записи с помощью трех объектов получения: QTCaptureSession, QTCaptureMovieFileOutput и QTCaptureDeviceInput. Они были существенными стандартными блоками для Вашего проекта. Вы учились как: