Поворот матрицы (кадров) видео в реализации GlSurfaceView.Renderer - PullRequest
1 голос
/ 17 апреля 2020

Я использую библиотеку GPUVideo- android для применения фильтров к видео, поддерживаемому ExoPlayer. Я использую фильтры, такие как яркость, контрастность, пикселизация и т. Д. c.

См. Сноски для контекста или справочной информации.

При использовании GPUPlayerView из этой библиотеки воспроизводимое / воспроизводимое видео не поворачивается в соответствии с метаданными видео.

Это связано с тем, что GPUPlayerView использует GPUPlayerRenderer для визуализации кадров на SurfaceView. Итак, этот рендерер не может проверить ориентацию видео.

Если я создал метод, подобный renderer.setRotation(Int), что будет телом этого метода? У меня нет опыта работы с OpenGl / EGL. Я хочу узнать больше об этом (чтобы продолжить дальнейшее развитие), но у меня нет времени в настоящее время.

Я пытался применить решение из этого ответа , которое говорит мне добавить :

Matrix.rotateM(mTmpMatrix, 0, 90, 0, 0, 1);
Matrix.translateM(mTmpMatrix, 0, 0, -1, 0);

Я добавил вышеуказанный код перед номером строки 154 , где я заменил mTmpMatrix на MVPMatrix в onDrawFrame(). Но я не был успешным. Я также пытался написать фрагмент ниже номер строки 156 .

Я также пытался создать tempMatrix из float[16]. И затем, сделайте это в onDrawFrame():

GLES20.glClear(GL_COLOR_BUFFER_BIT);

tempMatrix = MVMMatrix.clone();

Matrix.rotateM(tempMatrix, 0, 90, 0, 0, 1);
Matrix.translateM(tempMatrix, 0, 0, -1, 0);

Matrix.multiplyMM(tempMatrix, 0, VMatrix, 0, MMatrix, 0);
Matrix.multiplyMM(tempMatrix, 0, ProjMatrix, 0, MVPMatrix, 0);

previewFilter.draw(texName, tempMatrix, STMatrix, aspectRatio);

Но я не добился успеха.

Итак, как мне написать такой метод, как renderer.setRotation(Int)?


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

Я также нашел некоторый соответствующий код в iOS версии аналогичной библиотеки, но это мне не помогает.

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

Если я добавлю Matrix.rotateM(MMatrix, 0, 90, 0, 0, 1); в конце строки номер 134 , кадр рендеринга поворачивается. Но это становится квадратным. Итак, если видео было 720x1280, оно становится 720x720, оставляя черное пространство над и под кадрами после добавления этой строки.


Сноски / Контекст:

Когда я записываю видео с моего Устройство сохраняется с ориентацией поворота на 90 градусов. Я проверил это с помощью MediaMetadataRetriever

val extractedRotation = retriever.extractMetadata(
    MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION
).toIntOrNull()

Если вращение составляет 90 или 270, я меняю ширину и высоту, чтобы мой макет отображал правильное соотношение сторон видео.

val (correctedWidth, correctedHeight) = when (extractedRotation) {
    90, 270 -> arrayOf(extractedHeight, extractedWidth)
    else -> arrayOf(extractedWidth, extractedHeight)
}

Если разрешение видео составляет 1280x720 с поворотом на 90, исправленное разрешение становится 720x1280.

Когда я воспроизводю это видео в ExoPlayer PlayerView, видео воспроизводится правильно. Я думаю, что ExoPlayer учитывает метаданные ориентации видео.

...