我正在Linux上编写一个视频播放器,我想把它分成两个过程:

一个。解码过程 B. GUI

通过这种方式,我可以使用不同的编程语言,当问题发生时,更容易知道问题出在哪里。

问题是,可以直接处理A渲染解码图像到B的表面吗?我不想使用某些IPC来发送B这些解码数据,因为这可能是非常低效的。

有帮助吗?

解决方案

您可以使用 XEmbed 规范将一个X11窗口嵌入另一个窗口,它们可能来自不同的进程。这就是其他媒体播放器通常所做的事情。

GTK和 Qt 都支持XEmbed。

其他提示

IPC(尤其是Unix管道)比你想象的要高效得多,它可能是正确的使用机制。

但是,既然你问过如何在没有IPC的情况下做到这一点(我将其解析为没有上下文切换和副本),你可以简单地在两个进程之间创建一个共享内存段:

fd = shm_open("/my_shmem", O_RDWR| O_CREAT, S_IWUSR);
if(fd == -1) abort(); 
ftruncate(fd, SHMEM_SIZE); 
p = mmap(NULL, SHMEM_SIZE, PROT_WRITE |  PROT_READ, MAP_SHARED, fd, 0); 
if(p == MAP_FAILED) abort()

现在p具有两个(或更多)进程共享的共享内存段的地址。

警告! p(内存的虚拟地址)的数值在进程之间可能不同,因此如果要将链表放在共享内存中,则必须使用偏移量。

干杯, GBY

看看如何实现mplayer和smplayer。 mplayer解码并显示视频,而smplayer是(可选)GUI。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top