Каков наилучший способ рендеринга видеокадров? - PullRequest
12 голосов
/ 14 апреля 2011

Каков наилучший выбор для рендеринга видеокадров, полученных с декодера, встроенного в мое приложение (FFmpeg и т. Д.)?

Я бы, естественно, предпочел выбрать OpenGL, как упомянуто в Видеоплеер Android с использованием NDK, OpenGL ES и FFmpeg .

Но в OpenGL в Android для отображения видео , в комментарии отмечается, что OpenGLне лучший метод для рендеринга видео.

Что тогда?Родная библиотека jnigraphics?И не-GL SurfaceView?

Обратите внимание, что я хотел бы использовать собственный API для рендеринга кадров, такой как OpenGL или jnigraphics.Но Java-код для настройки SurfaceView и тому подобное.

PS: MediaPlayer здесь не имеет значения, я говорю о декодировании и отображении кадров самостоятельно.Я не могу полагаться на кодеки Android по умолчанию.

Ответы [ 3 ]

12 голосов
/ 08 октября 2011

Я попытаюсь уточнить и обобщить ответы здесь на основе моего собственного опыта.

Почему openGL

Когда люди думают о рендеринге видео сopenGL, Большинство пытаются использовать графический процессор для преобразования цветового пространства и альфа-смешения.

Например, преобразование видеокадров YV12 в RGB.Преобразования цветового пространства, такие как YV12 -> RGB, требуют, чтобы вы рассчитывали значение каждого пикселя в отдельности.Представьте для кадра 1280 x 720 пикселей, сколько операций в итоге получается.

То, что я только что описал, на самом деле предназначено для SIMD - выполнение одной и той же операции с несколькими частями данных параллельно.Графический процессор идеально подходит для преобразования цветового пространства.

Почему! OpenGL

Недостатком является процесс, с помощью которого вы получаете текстурные данные в графический процессор.Учтите, что для каждого кадра вам нужно загрузить данных текстуры в память (операция ЦП), а затем вам нужно скопировать этих данных текстуры в графический процессор (операция ЦП).Именно эту загрузку / копирование может сделать с использованием openGL медленнее, чем альтернативы.

Если вы воспроизводите видео с низким разрешением, то, я полагаю, возможно, вы не увидите разницу в скорости, потому что ваш процессорне будет узким местомОднако, если вы попробуете с HD, вы, скорее всего, добьетесь этого узкого места и заметите существенное снижение производительности.

Способ, которым это узкое место традиционно обходилось, заключается в использовании Pixel Buffer Objects (выделение памяти GPU для хранения текстурных загрузок).К сожалению, в GLES2 нет объектов Pixel Buffer.

Другие параметры

По указанным выше причинам многие решили использовать программное декодирование в сочетании с доступными расширениями ЦП, такими как NEON, для преобразования цветового пространства.Реализация YUV 2 RGB для NEON существует здесь .Средства, с помощью которых вы рисуете кадры, SDL против openGL не должны иметь значения для RGB, поскольку вы копируете одинаковое количество пикселей в обоих случаях.

Вы можете определить, поддерживает ли ваше целевое устройство улучшения NEON, запустив cat /proc/cpuinfo из оболочки adb и ищет NEON в выводе функций.

3 голосов
/ 14 апреля 2011

Я уже прошел путь FFmpeg / OpenGLES, и это не очень весело.

Вы можете попробовать портировать ffplay.c из проекта FFmpeg, что было сделано до использования порта Android SDL. Таким образом, вы не создаете свой декодер с нуля, и вам не придется сталкиваться с особенностями AudioTrack, который является уникальным аудио-API для Android.

В любом случае, неплохо бы как можно меньше разрабатывать NDK и полагаться на портирование, так как, на мой взгляд, опыт отладки ndk-gdb сейчас довольно паршивый.

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

1 голос
/ 27 июня 2011

На самом деле я развернул систему пользовательского видеоплеера, и почти вся моя работа была выполнена на стороне NDK. Мы получаем полнокадровое видео 720P и выше, включая нашу собственную систему DRM. OpenGL - это не ваш ответ, так как в Android не поддерживаются пиксельные буферы, поэтому вы существенно разрушаете свои текстуры в каждом кадре, и это портит систему кэширования OpenGLES. Откровенно говоря, вам нужно протолкнуть видеокадры через Native поддерживаемое растровое изображение на Froyo и выше. До Фройо твой шланг. Я также написал много встроенных функций NEON для преобразования цветов, масштабирования и т. Д. Для увеличения пропускной способности. Я могу протолкнуть 50-60 кадров через эту модель на HD Video.

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