Я использую библиотеку 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 учитывает метаданные ориентации видео.