不正确提取视频以在 Huawei nova 上渲染到表面
Not correct extract video for render to surface on Huawei nova
我创建了一个小应用程序来展示我的问题。
https://github.com/Anton111111/MediaExtractorTest
此应用包含两个视频:
- https://github.com/Anton111111/MediaExtractorTest/blob/master/app/src/main/res/raw/v1440_720.mp4
- https://github.com/Anton111111/MediaExtractorTest/blob/master/app/src/main/res/raw/v2160_1080.mp4
这些是不同分辨率(1440x720 和 2160x1080)的相同视频。
然后我尝试使用 MediaExtractor 提取此视频并将其渲染到文件中。
您可以在内存的根目录中找到结果(两个文件 v1440_720.png 和 v2160_1080.png)。
但是对于分辨率为 2160x1080 的视频,我看到它在底部提取了绿色伪像。而且这个神器我只在华为nova上看到过
请问是不是只有华为有问题phone?以及如何修复它?
您可以在链接中看到来自 Huawei nova 的结果:
https://github.com/Anton111111/MediaExtractorTest/blob/master/result/v1440_720.png
https://github.com/Anton111111/MediaExtractorTest/blob/master/result/v2160_1080.png
我是如何提取的,你可以在文件中看到:
https://github.com/Anton111111/MediaExtractorTest/blob/master/app/src/main/java/com/mediaextractortest/ExtractorMpeg.java
我想我找到了解决办法。
这是视频播放器如何处理视频纹理的问题。当 Android 创建 Surface 来解码视频时,某些设备创建的 Surface 比实际视频稍大。然后他们在 Surface 上设置了一个矩阵,暴露在 SurfaceTexture.getTransformMatrix.
我在代码中添加更改以在顶点中使用变换矩阵来解决此问题。它有效。
这是新的顶点着色器:
vec4 textureCoord = aTextureCoord;
textureCoord.y = 1.0 - textureCoord.y;
vTextureCoord = (uSTMatrix * textureCoord).xy;
我创建了一个小应用程序来展示我的问题。 https://github.com/Anton111111/MediaExtractorTest
此应用包含两个视频:
- https://github.com/Anton111111/MediaExtractorTest/blob/master/app/src/main/res/raw/v1440_720.mp4
- https://github.com/Anton111111/MediaExtractorTest/blob/master/app/src/main/res/raw/v2160_1080.mp4
这些是不同分辨率(1440x720 和 2160x1080)的相同视频。
然后我尝试使用 MediaExtractor 提取此视频并将其渲染到文件中。 您可以在内存的根目录中找到结果(两个文件 v1440_720.png 和 v2160_1080.png)。
但是对于分辨率为 2160x1080 的视频,我看到它在底部提取了绿色伪像。而且这个神器我只在华为nova上看到过
请问是不是只有华为有问题phone?以及如何修复它?
您可以在链接中看到来自 Huawei nova 的结果:
我是如何提取的,你可以在文件中看到: https://github.com/Anton111111/MediaExtractorTest/blob/master/app/src/main/java/com/mediaextractortest/ExtractorMpeg.java
我想我找到了解决办法。 这是视频播放器如何处理视频纹理的问题。当 Android 创建 Surface 来解码视频时,某些设备创建的 Surface 比实际视频稍大。然后他们在 Surface 上设置了一个矩阵,暴露在 SurfaceTexture.getTransformMatrix.
我在代码中添加更改以在顶点中使用变换矩阵来解决此问题。它有效。 这是新的顶点着色器:
vec4 textureCoord = aTextureCoord;
textureCoord.y = 1.0 - textureCoord.y;
vTextureCoord = (uSTMatrix * textureCoord).xy;