C++ 如何使用mplayer播放到内存

C++ 如何使用mplayer播放到内存,c++,c,linux,mplayer,C++,C,Linux,Mplayer,我需要在我的程序(C++)中嵌入一个视频播放器,但我不能使用XEmbed,因为我必须做一些后处理。 是否可以像使用ffmpeg一样将输出作为原始RGB写入内存缓冲区?不幸的是,mplayer不能作为库运行,但如果您愿意对mplayer代码进行一些更改,可能会有一些黑客解决方案。这也适用于Windows和MacOSX,但需要进行一些调整 下载mplayer源代码并查找/libvo/vo_png.c文件。您可以将此文件用作模板并创建自己的(比方说)/libvo/vo_shm.c-有一个函数可以获取原

我需要在我的程序(C++)中嵌入一个视频播放器,但我不能使用XEmbed,因为我必须做一些后处理。
是否可以像使用ffmpeg一样将输出作为原始RGB写入内存缓冲区?

不幸的是,mplayer不能作为库运行,但如果您愿意对mplayer代码进行一些更改,可能会有一些黑客解决方案。这也适用于Windows和MacOSX,但需要进行一些调整

下载mplayer源代码并查找
/libvo/vo_png.c
文件。您可以将此文件用作模板并创建自己的(比方说)
/libvo/vo_shm.c
-有一个函数可以获取原始像素。其思想是创建一个共享内存对象(
manshmget
)。稍后,您可以使用相同的键和
shmget
调用另一个将显示像素缓冲区的进程来引用此内存。请注意,您可能应该创建至少两个内存缓冲区,以便一次只有一个进程使用一个缓冲区。也许甚至三个或更多的缓冲区都是最佳选择

另外,不要忘记更改
static const vo_info_t info
struct初始化以将视频输出设备注册为不同的名称。据我所知,可以将新的
vou shm.c
添加到
config.mak
文件中的构建系统中


祝你好运。

很多Linux程序都嵌入了mplayer播放器(IIRC:gimp gap、k9copy等)

我认为常用的方法是将mplayer中的子窗口嵌入到X父窗口中。显然,在X11体系结构上比在windows上更容易实现这一点:)

显示:

-wid

您可以(例如,使用Qt应用程序)简单地使用

 mplayer -wid mywidget->winId();
所以你只需要

  • mplayer上的安装依赖项
  • 男执行官/男员工

  • 此外,还需要一个信号量IPC来管理对这些缓冲区的访问,可能还有一些共享控制寄存器。我知道这一点,因为我们在项目中已经在mplayer的基础上实现了框架。他需要做后处理,他可能会将其添加到mplayer中,但这不会很优雅。@RushPL:哦,很抱歉,我错过了Xembed可能引用我的方法的事实……这个解决方案只是使用Xembed协议嵌入窗口,所以我不能用它做一些后处理。这不是我想要的(就像我在问题中写的那样)。最后,我修改了ffplay(不是mplayer)以写入共享内存。所以我有一个强大的播放器,可以渲染到共享内存。()
     This tells the GUI to also use an X11 window 
     and stick itself to the bottom of the video, 
     which is useful to embed a mini-GUI in a browser 
     (with the mplayerplug-in for instance).
    
     This tells MPlayer to use a X11 window, which is useful 
     to embed MPlayer in a browser (with the plugger extension 
     for instance).
    
     mplayer -wid mywidget->winId();