Преобразование необработанных данных в отображаемое видео для iOS

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

Кто-нибудь имел опыт преобразования необработанного потока байтов (разделенных на пиксельную информацию, но не стандартного формата видео) в видеопоток с низким разрешением? Я полагаю, что могу отобразить данные в значение RGB на пиксельные байты, поскольку значения цвета, которые соответствуют значению в необработанных данных, будут определены нами. Я не уверен, куда идти, или какой формат RGB должен быть на пиксель.

Я посмотрел на FFMPeg, но его документация огромна, и я не знаю, с чего начать.

У меня есть конкретные вопросы: возможно ли создать CVPixelBuffer с этими данными пикселей? Если бы я сделал это, в какой формат данных на пиксель мне нужно было бы конвертировать?

Кроме того, я должен смотреть глубже в OpenGL, и если так, то где лучше всего искать информацию по этой теме?

Как насчет CGBitmapContextCreate? Например, если я пошел, я пошел с чем-то вроде этого, как должен выглядеть типичный пиксельный байт? Будет ли это достаточно быстро, чтобы поддерживать частоту кадров выше 20 кадров в секунду?

РЕДАКТИРОВАТЬ:

Я думаю, что с превосходной помощью вас двоих и еще нескольких собственных исследований я составил план того, как создать необработанные данные RGBA, затем создать CGImage из этих данных, в свою очередь, создать CVPixelBuffer из этого CGImage. отсюда CVPixelBuffer из CGImage.

Однако, чтобы потом играть вживую, когда поступают данные, я не уверен, какой FPS я бы посмотрел. Я рисую их в CALayer, или есть какой-то класс, похожий на AVAssetWriter, который я мог бы использовать для его воспроизведения при добавлении CVPixelBuffers. У меня есть опыт использования AVAssetWriter для экспорта созданных иерархий CoreAnimation в видео, поэтому видео всегда создаются до начала воспроизведения, а не отображаются как живое видео.

2 ответа

Решение

Я делал это раньше, и я знаю, что вы нашли мой проект GPUImage некоторое время назад. Как я уже ответил на вопросы, GPUImageRawDataInput - то, что вам нужно для этого, поскольку он выполняет быструю загрузку данных RGBA, BGRA или RGB непосредственно в текстуру OpenGL ES. Оттуда данные кадра могут быть отфильтрованы, отображены на экране или записаны в файл фильма.

Предлагаемый вами путь прохождения CGImage к CVPixelBuffer не даст очень хороших результатов, исходя из моего личного опыта. Слишком много накладных расходов при прохождении через Core Graphics для видео в реальном времени. Вы хотите перейти непосредственно к OpenGL ES для максимальной скорости отображения здесь.

Я мог бы даже улучшить свой код, чтобы сделать его быстрее, чем сейчас. Я сейчас пользуюсь glTexImage2D() обновлять данные текстуры из локальных байтов, но, вероятно, было бы еще быстрее использовать кэши текстур, представленные в iOS 5.0, для ускорения обновления данных в текстуре, которая сохраняет свой размер. Существуют некоторые накладные расходы при настройке кэшей, что делает их немного медленнее для разовых загрузок, но быстрое обновление данных должно быть быстрее с ними.

Мои 2 цента:

Я сделал игру opengl, которая позволяет пользователю записывать трехмерную сцену. Воспроизведение осуществлялось путем воспроизведения сцены (вместо воспроизведения видео, потому что кодирование в реальном времени не давало удобного FPS).

Есть методика, которая может помочь, к сожалению, у меня не было времени на ее реализацию: http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/

Этот метод должен сократить время возврата пикселей из openGL. Вы можете получить приемлемую скорость кодирования видео.

Другие вопросы по тегам