我需要在我的程序中嵌入一个视频播放器(C ++),但我不能使用XEmbed,因为我必须进行一些后期处理。 是否可以将输出作为原始RGB写入内存缓冲区,就像使用ffmpeg一样?
答案 0 :(得分:5)
不幸的是,mplayer无法作为库运行,但如果您愿意对mplayer代码进行一些更改,可能会有一些hacky解决方案。这也适用于Windows和MacOSX,但需要进行一些调整。
下载mplayer来源并查找./libvo/vo_png.c
文件。您可以将此文件用作模板并创建自己的文件(比方说)./libvo/vo_shm.c
- 有一个获取原始像素的函数。我们的想法是创建一个共享内存对象(man shmget
)。您可以稍后通过在将要显示像素缓冲区的其他进程中使用相同的键和shmget
调用来引用此内存。请注意,您应该创建至少两个内存缓冲区,以便一次只有一个进程使用一个缓冲区。也许甚至三个或更多缓冲区也是最佳的。
另外,请不要忘记更改static const vo_info_t info
struct initialization以将视频输出设备注册为其他名称。据我所知,您的新vo_shm.c
可以添加到config.mak
文件中的构建系统中。
答案 1 :(得分:0)
许多Linux程序嵌入了mplayer播放器(IIRC:gimp-gap,k9copy等)
我认为常见的方法是在你的X父窗口内嵌入一个来自mplayer的子窗口。显然,在X11架构上比在Windows上更容易实现:)
man mplayer显示:
mplayer -wid <windowId>
-guiwid <window id>
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).
-wid <window id>
This tells MPlayer to use a X11 window, which is useful to embed MPlayer in a browser (with the plugger extension for instance).
你可以(例如使用Qt应用程序)简单地使用
mplayer -wid mywidget->winId();
所以你需要的只是