Google TV/Android 3.2 API 似乎无法正确报告视频内容的显示尺寸。
int surfaceViewHeight = surfaceView.getHeight();
int surfaceViewWidth = surfaceView.getWidth();
float videoWidth = mediaPlayer.getVideoWidth();
float videoHeight = mediaPlayer.getVideoHeight();
float ratioWidth = surfaceViewWidth / videoWidth;
float ratioHeight = surfaceViewHeight / videoHeight;
float aspectRatio = videoWidth / videoHeight;
问题似乎是 mediaPayer.getVideoWidth() 和 getVideoHeight 调用。因为它们总是返回视频内容的物理存储大小,而不是那些支持它的容器的实际显示大小。我检查了一下,没有可用的 API 可以获取显示大小。您可以通过使用像 Plex Media Server 这样正确返回纵横比的外部源来接近,但除非返回显示大小,否则 ratioWidth 和 ratioHeight 计算总是会出错。
这似乎真的影响了 LG 谷歌电视,因为我从我的应用程序的这些用户那里收到了大部分错误报告。有没有办法获取容器中记录的实际显示大小(如果存在)?
更新:这是 Handbrake 中关于 Anamorphic 内容的一般基础。
https://trac.handbrake.fr/wiki/AnamorphicGuide
基本上,如果只返回视频的物理尺寸并用于计算纵横比,那么显示的视频将总是看起来被挤压或拉伸。当它可能不应该时,它也可能总是有黑条。编解码器应该返回一个显示宽度和高度,以通知视频播放器应该如何显示内容,以便在电视上看起来正确。
MKV 容器格式可以在 EBML 中报告正确的信息。看起来 Android api 只报告像素宽度和像素高度。请参阅以下 java 源代码(这可能是 MKV 的解决方法)。