Декодировать видеокадры на iPhone GPU - PullRequest
15 голосов
/ 17 февраля 2012

Я ищу самый быстрый способ декодировать локальные кадры видео mpeg-4 на iPhone. Меня просто интересуют значения яркости пикселей в каждом 10-м кадре. Мне не нужно никуда рендерить видео.

Я пробовал ffmpeg, AVAssetReader, ImageAssetGenerator, OpenCV и MPMoviePlayer, но все они слишком медленные. Самая высокая скорость, которую я могу получить, - ~ 2x (2 минуты видео сканируются за минуту). Я хотел бы что-то ближе к 10x.

Предполагая, что мои попытки выше не использовали GPU, есть ли способ достичь моей цели с помощью чего-то, что работает на GPU? OpenGL, кажется, в основном для рендеринга вывода, но я видел, что он используется в качестве фильтров для входящего видео. Может быть, это вариант?

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 26 февраля 2012

Если вы хотите использовать решение только для iOS 5, взгляните на пример приложения ChromaKey из сеанса WWDC 2011 года на AVCaputureSession.

Эта демонстрация захватывает 30 кадров в секунду видео со встроенной камеры и передает каждый кадр в OpenGL в качестве текстуры. Затем он использует OpenGL для манипулирования кадром и при необходимости записывает результат в выходной видеофайл.

В коде используется серьезная низкоуровневая магия для привязки пиксельного буфера Core Video от AVCaptureSession к OpenGL, чтобы они разделяли память в графическом оборудовании.

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

Возможно, вы могли бы настроить сеанс для доставки кадров в виде Y / UV, а не RGB, где компонент Y - это яркость. В противном случае было бы довольно просто написать шейдер, который бы преобразовывал значения RGB для каждого пикселя в значения яркости.

Вы должны иметь возможность делать все это на ВСЕХ кадрах, а не только на каждом 10-м кадре.

0 голосов
/ 26 февраля 2012

Предполагая, что узким местом вашего приложения является код, который преобразует видеокадры в отображаемый формат (например, RGB), вас может заинтересовать код, которым я поделился, который использовался для преобразования одного кадра .mp4 (закодированный как YV12) в RGB, используя Qt и OpenGL . Это приложение загружает кадр в графический процессор и активирует фрагментный шейдер GLSL , чтобы выполнить преобразование из YV12 в RGB, чтобы оно могло отображаться в QImage.

static const char *p_s_fragment_shader =
    "#extension GL_ARB_texture_rectangle : enable\n"
    "uniform sampler2DRect tex;"
    "uniform float ImgHeight, chromaHeight_Half, chromaWidth;"
    "void main()"
    "{"
    "    vec2 t = gl_TexCoord[0].xy;" // get texcoord from fixed-function pipeline
    "    float CbY = ImgHeight + floor(t.y / 4.0);"
    "    float CrY = ImgHeight + chromaHeight_Half + floor(t.y / 4.0);"
    "    float CbCrX = floor(t.x / 2.0) + chromaWidth * floor(mod(t.y, 2.0));"
    "    float Cb = texture2DRect(tex, vec2(CbCrX, CbY)).x - .5;"
    "    float Cr = texture2DRect(tex, vec2(CbCrX, CrY)).x - .5;"
    "    float y = texture2DRect(tex, t).x;" // redundant texture read optimized away by texture cache
    "    float r = y + 1.28033 * Cr;"
    "    float g = y - .21482 * Cb - .38059 * Cr;"
    "    float b = y + 2.12798 * Cb;"
    "    gl_FragColor = vec4(r, g, b, 1.0);"
    "}"
0 голосов
/ 20 февраля 2012

Казалось бы, vImage может быть уместным, при условии, что вы можете использовать iOS 5. Кажется, что каждый 10-й кадр находится в пределах разумного для использования платформы, такой как vImage. Однако любой тип фактической обработки в реальном времени почти наверняка потребует OpenGL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...