2016-01-25 5 views
2

Я делаю проект по обработке изображений. Я получаю необработанный видеопоток h264 в реальном времени и декодирую его с помощью MediaCodec. Я успешно показал декодированное видео на TextureView или SurfaceView. Теперь я хочу обработать каждый фрейм, сделать что-то с ним с помощью OpenCV4Android и показать обновленный видеокадр на экране. Я знаю, что OpenCV имеет примерный проект, демонстрирующий, как обрабатывать видеофрагменты с камеры телефона, но мне интересно, как это сделать, если у меня есть другой источник видео.Обработка фреймов с выхода Mediacodec и обновление фреймов на Android

Также у меня есть некоторые вопросы по TextureView:

  1. Что делает onSurfaceTextureUpdated() из SurfaceTextureListener делать? Если я вызываю getBitmap() в этой функции, значит, это означает, что я получаю каждый кадр видео? А как насчет SurfaceTexture.onFrameAvailableListener?

  2. Можно ли использовать скрытый TextureView в качестве промежуточного элемента, извлечь его кадры для обработки и вернуть его на другую поверхность, скажем, текстуру OpenGL ES для отображения?

ответ

2

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

Если вы хотите работать с рамкой видео в программном обеспечении, а не на графическом процессоре, все становится сложнее. Вы либо должны получить фрейм на поверхности, и скопировать его в буфер памяти, возможно, с помощью преобразования цвета RGB-YUV в процессе, или вам нужно получить выходной буфер YUV из MediaCodec. Последнее сложно, потому что возможны несколько разных форматов, в том числе фирменный формат Qualcomm.

Что касается TextureView:

  1. onSurfaceTextureUpdated() вызывается всякий раз, когда TextureView получает новый кадр. Вы можете использовать getBitmap(), чтобы получить каждый кадр видео, но вам нужно пошаговое воспроизведение видео в соответствии со скоростью вашего фильтра. TextureView отбросит кадры, если вы отстанете.

  2. Вы можете создать «скрытый TextureView», добавив другие элементы View поверх него, но это было бы глупо. TextureView использует SurfaceTexture для преобразования видеокадров в текстуры OpenGL ES, а затем отображает их как часть рисования интерфейса представления. Данные растрового изображения извлекаются с помощью glReadPixels(). Вы можете просто использовать эти элементы напрямую. Это демонстрирует большой флэш-диск ExtractMpegFramesTest.

+0

спасибо, что сэр. –