计算变形视频的显示宽高比

时间:2013-02-13 15:37:07

标签: android google-tv

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;

probem似乎是mediaPayer.getVideoWidth()和getVideoHeight调用。因为它们总是返回视频内容的物理存储大小,而不是那些支持它的实际显示大小的容器。我查了一下,没有可用的API来获取显示尺寸。您可以通过使用Plex Media Server等外部源来正确返回宽高比,但除非返回显示大小,否则ratioWidth和ratioHeight计算总是会出错。

这似乎影响了LG谷歌电视,因为我从我的应用程序的用户那里得到了大部分错误报告。有没有办法让容器中记录的实际显示尺寸存在?

更新:这是Handbrake的Anamorphic Content的一般原型。

https://trac.handbrake.fr/wiki/AnamorphicGuide

基本上,如果只返回视频的物理大小并用于计算宽高比,那么显示的视频将始终看起来被压扁或拉伸。当它可能不应该时,它也可能总是有黑条。编解码器应返回显示宽度和高度,以通知视频播放器应如何显示内容,使其在电视上看起来正确。

MKV容器格式可以在EBML中报告正确的信息。看来Android api只报告像素宽度和像素高度。请参阅以下java源代码(可能是MKV的解决方法)。

http://matroska.svn.sourceforge.net/viewvc/matroska/trunk/JEBML/src/org/ebml/matroska/MatroskaFileTrack.java?revision=874&view=markup

0 个答案:

没有答案