- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
如何才能从应用程序中专门驱动 HDMI 输出,而不允许操作系统自动将其配置为显示输出?
例如,使用标准 DVI/VGA 作为主显示器,但使用设备文件将 Mplayer 视频输出发送到 HDMI。
这是一个很难通过 Google 回答的问题。几乎每个结果都与通过 HDMI 处理音频有关。
(在这里编辑)
下面的评论提到使用单独的 Xorg 服务器。虽然这是一个有用的想法,但它没有回答我提出的一个问题,也没有回答我暗示的一个问题:
1) 如果控制台在另一个显示器之前加载,或者如果它是唯一的显示器(当仅使用 SSH 登录时),我如何阻止 Linux 将控制台放在该显示器上?2)如果没有X怎么办?我想直接将图形驱动到适配器。我是否可以使用标准功能从代码中执行此操作,而不直接与驱动程序交互(可能已过时,但使用 SVGALib 或其他一些非 X 图形层)?
(在这里编辑)
我查看了 SVGALib(旧的)和 SDL。后者在 X 内部和外部均可工作,甚至提供对 OpenGL 的访问。我通过某处的论坛链接找到了 1.3 版,但网站和 FTP 似乎只有 1.2 版。总的来说,SDL 是一个很好的解决方案,但它有以下两个具体的缺点:
1) 一般的 create-device 调用接受设备索引,但完全忽略它:
(src/video/bwindow/SDL_bvideo.cc)
BE_CreateDevice(int devindex)
特定于驱动程序的调用似乎具有相同的缺陷。例如,DirectFB(我假设它在控制台下提供图形):
(src/video/directfb/SDL_DirectFB_video.c)
DirectFB_CreateDevice(int devindex)
这些函数的主体似乎都没有现成的位置来设置设备索引...毫无疑问是因为它们所构建的标准接口(interface)缺乏支持。
2) 无论何时选择适配器,SDL 似乎都会自动将所有显示器连接在一起。示例“testsprite2.c”(随库提供)接受“--display”参数,该参数在“common.c”(所有示例的通用功能)中处理。您可以看到,它对“--display”参数所做的一切都是在一个大的组合 Canvas 中计算该屏幕的 X/Y 坐标:
if (SDL_strcasecmp(argv[index], "--display") == 0) {
++index;
if (!argv[index]) {
return -1;
}
state->display = SDL_atoi(argv[index]);
if (SDL_WINDOWPOS_ISUNDEFINED(state->window_x)) {
state->window_x = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);
state->window_y = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);
}
if (SDL_WINDOWPOS_ISCENTERED(state->window_x)) {
state->window_x = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);
state->window_y = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);
}
return 2;
}
因此,如果一个显示器位于同一个适配器上,则无法将它们与另一个显示器隔离开来。 SDL 将不起作用。
除非有与 SDL 相当的解决方案,否则事实证明将特定设备 (devindex) 设置在适当的位置是微不足道的(这可能不是这种情况,因此,这可能是它的原因未实现),似乎独占和完全专用屏幕的最佳选择是在分配给您的第二个设备的单独 Xorg 实例下编写您自己的窗口管理器。
最佳答案
您可以直接写入帧缓冲设备/dev/fb(假设您的控制台默认使用一个)。为了防止控制台显示在上面,只需禁用所有虚拟终端(然后您将只能远程登录)。如果你有多个适配器,你应该得到一个以上的帧缓冲设备(这需要确认)。
在帧缓冲区上绘制矩形的 C 示例如下:
Paint Pixels to Screen via Linux FrameBuffer
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
int main()
{
int fbfd = 0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long int screensize = 0;
char *fbp = 0;
int x = 0, y = 0;
long int location = 0;
// Open the file for reading and writing
fbfd = open("/dev/fb0", O_RDWR);
if (fbfd == -1) {
perror("Error: cannot open framebuffer device");
exit(1);
}
printf("The framebuffer device was opened successfully.\n");
// Get fixed screen information
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) {
perror("Error reading fixed information");
exit(2);
}
// Get variable screen information
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
perror("Error reading variable information");
exit(3);
}
printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);
// Figure out the size of the screen in bytes
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
// Map the device to memory
fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);
if ((int)fbp == -1) {
perror("Error: failed to map framebuffer device to memory");
exit(4);
}
printf("The framebuffer device was mapped to memory successfully.\n");
x = 100; y = 100; // Where we are going to put the pixel
// Figure out where in memory to put the pixel
for (y = 100; y < 300; y++)
for (x = 100; x < 300; x++) {
location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +
(y+vinfo.yoffset) * finfo.line_length;
if (vinfo.bits_per_pixel == 32) {
*(fbp + location) = 100; // Some blue
*(fbp + location + 1) = 15+(x-100)/2; // A little green
*(fbp + location + 2) = 200-(y-100)/5; // A lot of red
*(fbp + location + 3) = 0; // No transparency
//location += 4;
} else { //assume 16bpp
int b = 10;
int g = (x-100)/6; // A little green
int r = 31-(y-100)/16; // A lot of red
unsigned short int t = r<<11 | g << 5 | b;
*((unsigned short int*)(fbp + location)) = t;
}
}
munmap(fbp, screensize);
close(fbfd);
return 0;
}
只要您拥有可用的构建工具以及适用于您系统的头文件,它就应该可以编译。如果想刺激一下,请从 SSH 运行它并在您尚未登录的物理屏幕上观看它绘制。
应该注意的是,在 X11 之外,有许多工具可以处理帧缓冲区,但它们不会直接访问帧缓冲区。相反,它们通过称为 DirectFB 的附加抽象层工作。 DirectFB 将允许相同的应用程序在 X11 内外运行...包括 MPlayer、GStreamer、任何包含 SDL(称为 DirectFB)的应用程序,以及一个轻量级、流行的假 X11 容器,称为 XDirectFB(我相信它应该运行 X11 应用程序,但不会像典型的窗口管理器那样负担过重)。
关于python - 在 Linux 上开发 HDMI 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14718147/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5 天前关闭。 Improve th
我的目标是发送 HDMI 输入视频到 Raspberry Pi,然后更改输入 HDMI(通过 C/C++ 或 Java 进行图像处理)并将其发送回 HDMI 输出端口 . 问题是树莓派只有HDMI输出
如何在 Android 应用程序中获取连接的 HDMI 设备的版本? DisplayInfo 中没有任何帮助。 最佳答案 没有 API 可以为您提供这些;发件人应用程序甚至不知道该信息。 关于andr
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我的一个 Android 项目需要不时地在 2 个 HDMI 输入之间切换,可能一分钟一次。一个 HDMI 输入来自 Android 设备的 HDMI 输出,一个来自外部不可控源。 我发现了一个 HD
所以,我正在尝试通过 HDMI 端口将 NES mini 连接到我在 linux mint 20 上运行的笔记本电脑。我正在使用 $ xrandr --output HDMI-1但它似乎没有任何效果。
我正在使用联想ideapad 320s。我可以看到在 xrandr 中连接了 HDMI1 但没有图片。是不是硬件太新了?我应该转向 debian 测试看看它是否有效吗?在 xfce4 gui 显示应用
我正在创建一个应用程序,通过 HDMI 电缆将 Android 设备连接到电视来在电视中播放视频。我想使用 HDMI 电缆检测电视是否关闭。我也尝试了此链接中提到的方法,但它没有在职的。 How to
我有一台装有 NVIDIA GT555M GPU 的笔记本电脑(华硕 N55SF),安装了 Elementary OS(基于 Ubuntu)。 我安装了带有 NVIDIA 驱动程序的 Bumblebe
我的 Android 应用使用 videoView 在应用内播放视频。使用 HDMI 将平板电脑连接到电视时,我可以在电视上看到我的平板电脑屏幕。 一切似乎都运行良好,但在我的应用程序中,我的 vid
如何检测设备是否插入或拔下了 HDMI 线缆?是否有发送的 Intent ,我可以用广播接收器拦截。或者是否有隐藏的 api 来检测 HDMI 的安装?只要将 hdmi 插入设备,我就想开始一项 Ac
我有一个客户要求一款应用程序可以将视频从平板电脑播放到连接的 HDMI 屏幕。我想知道是否可以在 HDMI 屏幕上显示与平板电脑本身不同的输出?这是因为我想添加一个菜单(平板电脑屏幕顶部的层),客户端
出于法律原因,我们需要阻止用户在外部屏幕(电视、显示器)上播放我们应用程序中的视频,我知道如何停止 airplay 输出,但我们也需要停止 HDMI 输出,有人知道我们是否可以这样做或者我们可以检测到
开发人员在使用 iDevices Lightning/HDMI 适配器在外部显示器上设置自定义 UIWindow 及其 rootViewController 时遇到的一个众所周知的问题是,电视显示的
我有一个 root 的 HiSense GoogleTV,它有 HDMI 输入和输出端口。 我想做的是从 HDMI IN(来自机顶盒)录制大约 10 秒的音频。我是新手,所以请多多包涵。 是否可以在已
非常简单,当我按下切换器上的开关以从我的 PC 显示器切换到它上方的电视时,我只想运行 XBMC。我对语言不太挑剔,但更好奇是否有我可以订阅的事件来执行此操作(也许在 Win32 API 中)。如果没
当连接到电视时,我的 ADT-1 无法通过 HDMI 播放声音。 在那台特定的电视上,我必须在 Raspberry PI 上强制使用 HDMI 音频,所以我也试图在 ADT-1 上强制使用它。 我尝试
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
所以我可以使用“tvservice -o”关闭树莓派上的 HDMI,然后使用“tvservice -p”将其重新打开。将其重新打开后,我显然需要执行“fbset -depth 8 && fbset -
我有一个带有 HDMI 输出端口的 Evo。照片库和视频应用程序可以将屏幕内容发送出去。 我希望它也能在所有情况下发送屏幕 - 例如,查看主屏幕仍会流式传输到 hdmi。这是行不通的。 是否可以将其添
我是一名优秀的程序员,十分优秀!