2011-10-05 88 views
2

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

+0

过于广泛.. –

+0

最后,我修改了ffplay(不是mplayer)来写入共享内存。所以我有一个强大的玩家可以渲染共享内存。 (http://ffmpeg.org/ffplay.html) –

回答

5

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

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

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

祝你好运。

+1

此外,还需要一个信号量IPC来管理对这些缓冲区的访问+可能是一些共享控制寄存器。我知道,因为我们已经在mplayer的基础上在我们的项目中实现了框架。 – pmod

0

大量的Linux程序的嵌入的mplayer播放器(IIRC:GIMP间隙,等等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(); 

因此,所有你需要的是

  1. 上mplayer的一个安装相关性
  2. 人的execve /人的mplayer
+0

他需要做后期处理,他可能会添加到mplayer,但它不会很优雅。 – RushPL

+0

@RushPL:哦对不起,我错过了Xembed可能提及我的方法的事实...... – sehe

+0

这个解决方案只是使用xembed协议嵌入窗口,所以我不能用它进行一些后处理。这不是我所期待的(就像我在问题中写的) –

相关问题