Обработка кадров из вывода Mediacodec и обновление кадров на Android

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

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

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

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


person Vitt Volt    schedule 25.01.2016    source источник


Ответы (1)


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

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

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

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

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

person fadden    schedule 25.01.2016
comment
Большое спасибо, сэр. - person Vitt Volt; 26.01.2016