SDL+Nano-X實現Mplayer窗口播放

SDL+Nano-X實現Mplayer窗口播放

關鍵字:SDL Microwindows Nano-X Mplayer

一般做將Mplayer移植到嵌入式設備都是通過直接寫Framebuffer來顯示視頻,因爲這樣是最快的。但是某些情況我們需要視頻只在特定的窗口播放,而非全屏,這是直接用Framebuffer來實現就很困難。這裏提供了一種方法,通過SDL+Microwindows(Nano-X)+Mplayer實現窗口播放視頻。其實SDL也支持直接寫Framebuffer,但是我們需要SDL通過Nano-X提供的繪圖函數來繪製視頻圖片。SDL的最新版本已經包含了Nano-X的補丁,下面分別介紹在X11下和直接用Nano-X寫Framebuffer的兩種編譯設置。

X11: 首先要將Nano-X編譯成X11模式,並開啓共享內存減少傳輸,提高性能。即編輯microwin/src下的config文件,修改下面參數 SCREEN_PIXTYPE = MWPF_TRUECOLOR0888 HAVE_SHAREDMEM_SUPPORT = Y

然後根據SDL目錄下的README.NanoX文件配置編譯SDL ./configure --disable-video-x11 --disable-video-fbcon --enable-video-nanox --enable-nanox-

share-memory --with-nanox-pixel-type=0888

最後根據網上教程編譯Mplayer

---------------------------http://hi.baidu.com/chenzhuoyou-----------------------------------------------------------

FrameBuffer: 將Nano-X編譯成Framebuffer模式,同樣開啓共享內存支持,具體編譯過程請參考網上例子。

SDL: ./configure --disable-video-x11 --disable-video-fbcon --enable-video-nanox --enable-nanox-

direct-fb --enable-nanox-share-memory --with-nanox-pixel-type=0888 注意--with-nanox-pixel-type應與你的LCD屏的類型對應!

---------------------------http://hi.baidu.com/chenzhuoyou-----------------------------------------------------------

編譯完後先啓動Nano-X服務器,然後在調用Mplayer播放程序 mplayer -vo sdl filename

如果一切順利,應該看到Mplayer以全屏顯示而非窗口顯示,那怎樣才能使Mplayer利用Nano-X的窗口播放視頻?通過閱讀SDL的Nano-X部分的代碼,我們發現結構體SDL_PrivateVideoData裏有SDL_Window和FSWindow兩個GR_WINDOW_ID成員,一個是普通窗口,一個是全屏窗口,通過讀取環境變量SDL_WINDOWID來決定使用指定的窗口還是創建一個全屏窗口。因此我們只要設置SDL_WINDOWID,將Nano-X裏的一個窗口ID

付給SDL_WINDOWID就可以了,如: export SDL_WINDOWID=1

在同一終端再次啓動Mplayer,視頻就會只顯示在窗口裏。

---------------------------http://hi.baidu.com/chenzhuoyou-----------------------------------------------------------

但你可能會發現視頻很慢,丟幀很嚴重。這是由於SDL驅動沒有硬件減速器,在播放視頻時通過軟件實現縮放。而且你還會發現,視頻大小跟Nano-X的根窗口大小有關,而與你指定的窗口無關,即假如你指定的窗口小於跟窗口,那隻會顯示視頻的一部分。

在閱讀Mplayer的源代碼時我們發現,在libvo/vo_sdl.c裏有config函數,播放時視頻顯示大小就是從這裏設置的。我們發現無論怎樣在播放時都是全屏模式,因爲其中一個判斷:

        else {                   if((strcmp(priv->driver, "x11") == 0)                   ||(strcmp(priv->driver, "windib") == 0)                 ||(strcmp(priv->driver, "directx") == 0)                 ||(strcmp(priv->driver, "Quartz") == 0)                   ||(strcmp(priv->driver, "cgx") == 0)                   ||(strcmp(priv->driver, "os4video") == 0)                   ||((strcmp(priv->driver, "aalib") == 0) && priv->X)){                if( mp_msg_test(MSGT_VO,MSGL_V) ) {                      mp_msg(MSGT_VO,MSGL_V, "SDL: setting windowed mode/n"); }                 set_video_mode(priv->dstwidth, priv->dstheight, priv->bpp, priv->sdlflags);    }

並沒有SDL的驅動,所以最終這個函數會調用set_fullmode(priv->fullmode)根據Nano-X根窗口大小(即Nano-X屏幕)來設置視頻大小。因此只要加入 ||(strcmp(priv->driver, "nanox") == 0), 就可以進入窗口模式,而我們可以通過啓動Mplayer時設置視頻大小,即 Mplayer -vo sdl -x 320 -y 240 filename

最後介紹一下SDL+Nano-X播放Mplayer視頻的原理,SDL原本可以直接寫屏,即Blit一段圖像指針到Framebuffer,Mplayer會將每一幀圖像的指針傳給SDL。採用Nano-X後,如果沒開啓Framebuffer,就會採用GrArea來更新視頻圖像,而開啓Framebuffer後其實還是直接Blit寫屏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章