2011-10-05 94 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協議嵌入窗口,所以我不能用它進行一些後處理。這不是我所期待的(就像我在問題中寫的) –

相關問題