我想通过JS尽可能获得最高的视频分辨率navigator.getUserMedia.我知道约束,但在我的情况下不知道如何正确选择.
问题似乎是没有办法说"我想要一个最大分辨率的视频".所以相反,我试图说"我希望视频不低于非常大的分辨率".
当我尝试时minWidth: 1600,Chrome会返回1280×720视频(我认为我的相机可能最高).但是,如果用户拥有更高分辨率的相机呢?所以我要求minWidth: 2048视频,Chrome只返回640×480.
var constraints = {
video: {
optional: [
{minWidth: 2048}
]
}
};
Run Code Online (Sandbox Code Playgroud)
这是在线示例:http://jsbin.com/kibeza/1/watch?js,output
并且存在实际问题:Chrome不懂数学.它认为1600大于2048.我不能要求视频"不低于100500",因为在这种情况下我将得到标准的低分辨率.我不能问视频"不低于一些合理的小分辨率",因为可能有更高分辨率的用户,我想获得更高的分辨率.
我比较熟悉虚拟内存的工作原理.所有进程内存分为页面,虚拟内存的每个页面映射到实际内存中的页面或交换文件中的页面,或者它可以是新页面,这意味着仍未分配物理页面.操作系统会根据需要将新页面映射到实际内存,而不是在应用程序请求内存时malloc,而是仅在应用程序实际访问分配的内存中的每个页面时.但我还有疑问.
当我用linux perf工具分析我的应用程序时,我注意到了这一点.
有时间的20%左右了内核函数:clear_page_orig,__do_page_fault和get_page_from_free_list.这比我预期的任务要多得多,我做了一些研究.
让我们从一些小例子开始:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define SIZE 1 * 1024 * 1024
int main(int argc, char *argv[]) {
int i;
int sum = 0;
int *p = (int *) malloc(SIZE);
for (i = 0; i < 10000; i ++) {
memset(p, 0, SIZE);
sum += p[512];
}
free(p);
printf("sum %d\n", sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
假设这memset只是一些内存绑定处理.在这种情况下,我们一次分配一小块内存并一次又一次地重复使用.我会像这样运行这个程序:
$ gcc -O1 ./mem.c && time ./a.out
Run Code Online (Sandbox Code Playgroud)
-O1 …
我注意到我的代码在64位Linux上运行比在32位Linux或64位Window或64位Mac上慢得多.这是最小的测试用例.
#include <stdlib.h>
typedef unsigned char UINT8;
void
stretch(UINT8 * lineOut, UINT8 * lineIn, int xsize, float *kk)
{
int xx, x;
for (xx = 0; xx < xsize; xx++) {
float ss = 0.0;
for (x = 0; x < xsize; x++) {
ss += lineIn[x] * kk[x];
}
lineOut[xx] = (UINT8) ss;
}
}
int
main( int argc, char** argv )
{
int i;
int xsize = 2048;
UINT8 *lineIn = calloc(xsize, sizeof(UINT8));
UINT8 *lineOut = calloc(xsize, sizeof(UINT8)); …Run Code Online (Sandbox Code Playgroud) c ×2
64-bit ×1
gcc ×1
html5 ×1
javascript ×1
linux-kernel ×1
performance ×1
video ×1
webrtc ×1