如何在 Raspberry Pi 上 disable/enable HDMI?

How to disable/enable HDMI on Raspberry Pi?

所以我可以使用 "tvservice -o" 关闭 raspberry Pi 上的 HDMI,然后 "tvservice -p" 将其重新打开。重新打开后,我显然需要做 "fbset -depth 8 && fbset -depth 16" 来重新启用帧缓冲区,然后强制 X11 重绘。

我的问题是,如何在 C 中执行此操作?我有一个 X11 应用程序,我可以毫无问题地管理 X11 重绘,但是我如何 disable/re-enable C 中的 HDMI,以及如何在重新启用 HDMI 后重新启用帧缓冲区?

作为背景,我有一个无头应用程序 运行 作为一种媒体服务器,由 Android 应用程序控制。目前我在超时后永久禁用 HDMI 的关闭。但是为了节省能源,我想在应用程序不使用时禁用 HDMI,然后重新打开它并使用 libcec 在屏幕上显示 RPi 应用程序以确定电视何时使用 RPi 的 HDMI 连接打开 HDMI 和关闭。

您可以使用 system() 命令来使用您描述的那些命令。

int main(){

   //some code before disable hdmi
   system("tvservice -o");

   //do somethings when HDMI is disabled

   //turn HDMI back on
   system("tvservice -p");
   system("fbset -depth 8 && fbset -depth 16");

   return 0;

}

如果您想使用纯 C,请查看 tvservice 的源代码,这是一个 C 程序。可以找到at github。它似乎正在使用 #include "interface/vmcs_host/vc_tvservice.h"

中定义的 vc_tv_hdmi_power_on_preferred(); 函数

如果您决定像@moffeltje 的回答中那样调用 tvservice 程序,您可以使用 execl() 它更安全一些 - 您必须提供二进制文件的完整路径。 (使用 execlp 还可以控制环境变量):

pid_t pid;


pid = fork();
if (0 == pid) {
    execl("/opt/vc/bin/tvservice", "-p", NULL);
}
if (-1 == pid) {
    // Handle error here, close program?
}

我找到了

xset dpms force on

在执行 tvservice -o 并使用 tvservice -p 将其恢复后刷新 xorg 内容。 fbset 方式对我来说效果不是很好。

我用 cec-client 获得了最好的结果。

sudo apt install cec-utils

关闭显示器:

echo "standby 0" | cec-client -s -d 1

打开显示器:

echo "on 0" | cec-client -s -d 1

https://gist.github.com/AGWA/9874925我发现了chvt的用处。所以我建议调用 shell 命令

hdmioff() { tvservice -o; }
hdmion() { tvservice -p; sudo chvt 1; sudo chvt 7; }

使用系统()。