这里做一个VLC的例子(在SOUI中使用VLC来播放一下本地文件和流)
Step1 使用向导建立一个工程,将需要包含的VLC文件包含进去
Step2 SOUI 界面的一些设置
Step3 编写代码 实现对应的功能
Step4 查看效果
思考:怎么减小VLC的体积 减小plugins的体积?
- Step1 使用向导建立工程 建立XML文件
主窗口
<SOUI name="mainWindow" title="@string/title" bigIcon="ICON_LOGO:32" smallIcon="ICON_LOGO:16" width="800" height="600" margin="5,5,5,5" resizable="0" wndType="appMain" appWnd="1" translucent="0">
<root skin="skin_1_jpg" cache="1">
<caption pos="0,0,-0,30" show="1" font="adding:0">
<text pos="5,5" colorText="#ffffffff" font="face:宋体,size:20">VLC demo</text>
<imgbtn name="btn_close" skin="_skin.sys.btn.close" pos="-45,0" tip="close" animate="1" />
</caption>
<window pos="5,[2,-5,-5">
<text pos="26,16,@-1,@24" colorText="#ffffff">播放路径:</text>
<edit pos="[10,{,-100,@24" colorBkgnd="#FFFFFF" cueText="" colorText="#000000" name="edit_playurl" colorBkgnd="RGBA(0,0,0,0)" margin="1,1,1,1" colorBorder="#F9E3F8" />
<button pos="[5,{,@60,@24" colorText="#FFFFFF" skin="skin_1_jpg" name="btn_play">播 放</button>
<window pos="26,[10,@730,@500">
<realwnd pos="10,10,-10,-10" name="wnd_play" wndclass="SRealWnd" id="" wndname="playwnd" margin="1,1,1,1" colorBorder="#F9E3F8" />
</window>
</window>
</root>
</SOUI>
子窗口
<?xml version="1.0"?>
<SOUI name="window" title="布局" bigIcon="ICON_LOGO:32" smallIcon="ICON_LOGO:16" width="400" height="300" margin="1,5,5,5" wndType="8" toolWindow="1">
<root cache="1">
<window pos="0,0,-0,-0" colorText="#ffffff" skin="skin_2_jpg" />
</root>
</SOUI>
- Step2 界面的设置
可以参照mfc.demo这个例子
这里直接抄过来 改一下对应的类
#pragma once
#include <unknown/obj-ref-impl.hpp>
namespace SOUI
{
class CSouiRealWndHandler :public TObjRefImpl2<IRealWndHandler,CSouiRealWndHandler>
{
public:
CSouiRealWndHandler(void);
~CSouiRealWndHandler(void);
/**
* SRealWnd::OnRealWndCreate
* @brief 创建真窗口
* @param SRealWnd * pRealWnd -- 窗口指针
* @return HWND -- 创建出来的真窗口句柄
* Describe
*/
virtual HWND OnRealWndCreate(SRealWnd *pRealWnd);
/**
* SRealWnd::OnRealWndDestroy
* @brief 销毁窗口
* @param SRealWnd *pRealWnd -- 窗口指针
*
* Describe 销毁窗口
*/
virtual void OnRealWndDestroy(SRealWnd *pRealWnd);
/**
* SRealWnd::OnRealWndInit
* @brief 初始化窗口
* @param SRealWnd *pRealWnd -- 窗口指针
*
* Describe 初始化窗口
*/
virtual BOOL OnRealWndInit(SRealWnd *pRealWnd);
/**
* SRealWnd::OnRealWndSize
* @brief 调整窗口大小
* @param SRealWnd *pRealWnd -- 窗口指针
* @return BOOL -- TRUE:用户管理窗口的移动;FALSE:交由SOUI自己管理。
* Describe 调整窗口大小, 从pRealWnd中获得窗口位置。
*/
virtual BOOL OnRealWndSize(SRealWnd *pRealWnd);
};
}
#include "StdAfx.h"
#include "SouiRealWndHandler.h"
#include "SPlayDlg.h"
namespace SOUI
{
CSouiRealWndHandler::CSouiRealWndHandler(void)
{
}
CSouiRealWndHandler::~CSouiRealWndHandler(void)
{
}
HWND CSouiRealWndHandler::OnRealWndCreate( SRealWnd *pRealWnd )
{
const SRealWndParam ¶m=pRealWnd->GetRealWndParam();
if(param.m_strClassName==_T("SRealWnd"))
{
SPlayDlg *pWnd = new SPlayDlg;
//mfc.demo中的例子 pbtn->Create(param.m_strWindowName,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,::CRect(0,0,0,0),CWnd::FromHandle(pRealWnd->GetContainer()->GetHostHwnd()),pRealWnd->GetID());
pWnd->Create(pRealWnd->GetContainer()->GetHostHwnd(), WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, 0);
pRealWnd->SetData(pWnd);
//返回成功创建后的窗口句柄
return pWnd->m_hWnd;
}else
{
return 0;
}
}
void CSouiRealWndHandler::OnRealWndDestroy( SRealWnd *pRealWnd )
{
const SRealWndParam ¶m=pRealWnd->GetRealWndParam();
if(param.m_strClassName==_T("SRealWnd"))
{//销毁真窗口,释放窗口占用的内存
SPlayDlg * pWnd = (SPlayDlg*) pRealWnd->GetData();
if(pWnd)
{
pWnd->DestroyWindow();
delete pWnd;
}
}
}
//不处理,返回FALSE
BOOL CSouiRealWndHandler::OnRealWndSize( SRealWnd *pRealWnd )
{
return FALSE;
}
//不处理,返回FALSE
BOOL CSouiRealWndHandler::OnRealWndInit( SRealWnd *pRealWnd )
{
return FALSE;
}
}
Step3 处理播放的逻辑
关于vlc怎么包含对应的文件 文末给出github上整个工程地址(这个后续增加)
void CMainDlg::OnPlay()
{
//SMessageBox(NULL, L"点击了播放", L"提示", MB_OK);
ReleaseVlc();
//处理播放的逻辑
SRealWnd* pWnd = (SRealWnd*)FindChildByName(L"wnd_play");
SASSERT(pWnd);
SStringT strPath = L"";
SEdit* pEdit = FindChildByName2<SEdit>(L"edit_playurl");
strPath = pEdit->GetWindowTextW();
//对路径进行一个编码的转换 转换成UTF8来进行调用
wchar_t* wchar = strPath.GetBuffer(strPath.GetLength());
strPath.ReleaseBuffer();
size_t len = wcslen(wchar) + 1;
size_t converted = 0;
char* format = (char*)malloc(len * sizeof(char));
wcstombs_s(&converted, format, len, wchar, _TRUNCATE);
//根据strPath判断播放的类型 如果是本地则使用本地的播放方法 区别 m_media 的创建方法
int type = strPath.Find(L"http");
m_media = strPath.Find(L"http") == -1 ? libvlc_media_new_path(m_inst, format) : libvlc_media_new_location(m_inst, format);
if (!m_media)
{
SMessageBox(NULL, L"输入文件名有误,请重新输入!\n正确输入例如:F:\\1.jpg", L"提示", MB_OK);
return;
}
m_player = libvlc_media_player_new_from_media(m_media);
libvlc_media_release(m_media);
libvlc_media_player_set_hwnd(m_player, (void*)pWnd->GetRealHwnd());
int ret = libvlc_media_player_play(m_player);
if (0 != ret)
{
SMessageBox(NULL,L"播放文件失败",L"提示",MB_OK);
}
free(format);
}
void CMainDlg::ReleaseVlc()
{
if (m_player != nullptr)
{
libvlc_media_player_stop(m_player);
libvlc_media_player_release(m_player);
}
m_player = nullptr;
}
Step4 效果图