我正在创建一个同时显示多个视频的应用程序(比方说2-10个视频)。我基本上在寻找一种可以帮助在屏幕上放置视频的算法。我面临的问题是每个视频可能有不同的宽高比,我显然需要调整视频大小以使它们全部适合屏幕。但我希望调整大小并使其适应我最大化屏幕使用的方式(并最小化纵横比失真)。此外,我希望用户能够增加一个或多个视频的大小,以便在屏幕上占用更多空间。因此,算法应该是稳定的,因为扩大一个视频不会使所有的放置都跳转。
我用语言无关的方式问这个问题,我使用视频的事实无关紧要,这个问题同样适用于静止图像。
所有人都知道放置算法吗?
这里有一个例子来帮助澄清。我有三个视频,大小如下。我希望第一个视频占据屏幕的大约50%,最后两个视频占据屏幕的大约25%。
(464, 336) 50%
(624, 480) 25%
(608, 336) 25%
如何将它们放在屏幕上(1024x800)才能实现这一目标?我想我会先将屏幕分成两半,最适合上半部分的第一个视频。然后我将下半部分分成两部分,尽可能地适应剩下的两部分视频。
提前致谢
答案 0 :(得分:4)
答案 1 :(得分:2)
这是垃圾箱包装问题的一个版本 http://en.wikipedia.org/wiki/Bin_packing_problem 这是NP难的,所以你要选择一些合理的启发式算法。如果您不希望视频在调整大小时跳转,则需要留下一堆额外的死区或自动缩小其他空间。
除非你有充分的理由允许它,否则我建议要求宽高比保持不变。
建议:首先修复所有视频的高度,然后使用贪婪的第一个拟合算法将它们打包。初始高度将是总屏幕高度的整数分数。如果有人调整视频大小,其他所有内容都会按相同的分数值收缩,然后转移到适应范围。
答案 2 :(得分:0)
基于舍入的平方根+逻辑。如果sqrt的剩余部分是< 0.5,向下舍入结果,将结果用作行/列,并将行或列数加1;如果sqrt的余数为> = 0.5,则向上舍入结果并将其用作行/列数。
10 videos = 4x3 (3.16; rounded down, so add 1 row or col)
9 videos = 3x3 (3; abs)
8 videos = 3x3 (2.82; round up)
7 videos = 3x3 (2.64; round up)
6 videos = 3x2 (2.44; round down, so add 1 row or col)
5 videos = 3x2 (2.23; round down, so add 1 row or col)
4 videos = 2x2 (2; abs)
3 videos = 2x2 (1.73; round up)
2 videos = split screen in half vertically or horizontally (however you'd like)
1 video = full screen
现在这是为了使所有视频“正方形”,并且可能是最好的选择,因为你真的不能轻易地考虑到那里存在的不同分辨率/比率(除非它对你来说是静态的)。
因此,根据显示分辨率与视频分辨率的比率,网格周围会有填充空间,因此您需要将网格居中。也就是说,一个选项是让你获取“填充”空间并将其除以行数(或列),并将其用作视频之间的缓冲区。
获得行/列数并假设所有视频的大小相同后,您只需将屏幕宽度除以cols和高度除以行,即可获得视频尺寸。
然后,将视频平铺到屏幕上 - 显然,在相同的情况下,网格上的某些点可能是空的。您可以检测网格上空间覆盖的行和列,并将视频集中在该特定行上。
如果您希望“最大化”视频,请提前确定“最大化”空间的含义。然后,在计算其他视频的大小之前,从屏幕分辨率中减去该像素足迹。如果最大化意味着50%的屏幕,则从网格中的视频数量中减去该视频,并从显示分辨率中减去50%的像素空间。