#objective-c #cocoa #qtkit
#objective-c #cocoa #qtkit
Вопрос:
Я пишу простое приложение, похожее на видеомагнитофон, и поэтому мне нужно получить кадры некоторого компромиссного размера, чтобы они могли вписаться в доступную полосу пропускания и при этом не искажать захваченное изображение.
Для извлечения кадров я использую класс QTCaptureVideoPreviewOutput, и я успешно получаю кадры в обратном вызове didOutputVideoFrame. (мне нужны необработанные кадры — в основном потому, что я использую пользовательский кодировщик, поэтому я просто хотел бы получить «необработанные растровые изображения»).
Проблема в том, что для этих новых камер iSight я получаю буквально огромные кадры.
К счастью, эти классы для захвата необработанных кадров (QTCaptureVideoPreviewOutput) предоставляют метод setPixelBufferAttributes, который позволяет указать, какие кадры я хотел бы получить. Если мне повезет угадать некоторый размер кадра, который поддерживает камера, я могу указать его, и QTKit переключит камеру в указанный режим. Если мне не повезет — я получу размытое изображение (потому что оно было растянуто / сжато), и, скорее всего, непропорциональное.
Я искал корыто lists.apple.com, и stackoverflow.com ответ таков: «Apple в настоящее время не предоставляет функциональность для извлечения собственных размеров кадра камеры». Ну, с этим я ничего не могу поделать.
Может быть, мне следует указать в настройках наиболее распространенные размеры кадра, и пользователь должен попробовать их, чтобы увидеть, что ему подходит? Но каковы эти общие размеры кадра? Где я мог бы получить список размеров кадра, которые обычно генерируют камеры UVC?
Для тестирования моего приложения я использую камеру, совместимую с UVC, но не iSight. Я предполагаю, что не каждый пользователь также использует iSight, и я уверен, что даже у разных моделей камер iSight разные размеры кадра.
Или, может быть, мне следует переключить камеру в режим по умолчанию, сгенерировать несколько кадров, посмотреть, какие размеры она генерирует, и, по крайней мере, у меня будут какие-то пропорции? Это выглядит как настоящий взлом и не кажется естественным. И изображение, скорее всего, снова будет размытым.
Не могли бы вы, пожалуйста, помочь мне, как вы справились с этой проблемой? Я уверен, что я не первый, кто сталкивается с этим. Какой подход вы бы выбрали? Спасибо, Джеймс
Ответ №1:
Вы правы, камера iSight выдает огромные кадры. Однако я сомневаюсь, что вы сможете переключить камеру в другой режим, установив атрибуты пиксельного буфера. Скорее всего, вы задаете режим обработки кадров в выводе qtcapturevideopreviewout. Взгляните на вывод QTCaptureDecompressedVideoOutput, если вы этого еще не сделали. Мы также используем буфер выборки, чтобы получить размер кадра. Итак, я бы не сказал, что это взлом. Более естественным способом было бы создать свой собственный компонент Quicktime, который реализует ваш пользовательский алгоритм кодирования. В этом случае Quicktime смог бы использовать вывод внутри QTCaptureMovieFileOutput во время сеанса захвата. Это был бы правильный, но в то же время трудный способ.
Комментарии:
1. Я пробовал как QTCaptureVideoPreviewOutput, так и QTCaptureDecompressedVideoOutput. QTKit «мудро» выбирает режим камеры, по крайней мере, так говорят разработчики quick time в своем списке рассылки: он достаточно умен, чтобы установить этот режим камеры, который требует наименьшей мощности процессора для преобразования его в требуемый формат пикселей. Не могли бы вы, пожалуйста, объяснить эту идею «буфера выборки», которую вы используете? Как именно вы это делаете? Спасибо.
2. Вы можете получить доступ к отдельным кадрам видео или к пакетам аудиоданных. Посмотрите на документацию [QTCaptureFileOutput captureOutput:didOutputSampleBuffer:fromConnection:]. Мы используем его в основном для того, чтобы разрезать захваченное видео на куски.