C++ 如何使用mplayer播放到内存
我需要在我的程序(C++)中嵌入一个视频播放器,但我不能使用XEmbed,因为我必须做一些后处理。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-有一个函数可以获取原
是否可以像使用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();
所以你只需要
此外,还需要一个信号量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();