基于PXA270与WinCE的分布式地铁车载系统开发
(2)配置平台
此过程主要是添加相关组件,是整个定制车载多媒体系统过程中的重点。其中主要有Usb Activesync(File Sync)、USB Mass Storage、中文字体(Chinese[Simplifiled])、Fat File System、键盘驱动(用于按键触发)、网卡驱动(用于网络传输)、触摸屏驱动(用于多功能操作)、DirectShow组件以及mp3、MPEG-1的解码Filter(用于媒体播放)等。通过Platform Builder 5.0编译生成的NK.bin文件下载至开发平台。
(3)导出SDK
导出的车载多媒体系统SDK用于在PC宿主机上通过Visual Studio 2005开发车载广播中心端MyNetSend以及车载播放终端MyNetPlayer应用程序。首先Configure SDK对SDK进行相应的配置,之后Build SDK等待完成后将生成的SDK安装于PC宿主机。
2.2 软件工作流程
车载广播中心完成媒体文件的IP组播发送、播放列表制作、站点信息接收和按键触发报站功能。具体流程如图6所示。
MyNetSend发送端程序启动后首先进行页面的初始化、播放列表的加载,之后启动发送线程,将列表中的文件依次组播发送。当接收到到站信号后将发送线程挂起,之后调用进站信息发送函数,等待报站音频播放结束后恢复发送线程。当有按键按下时产生WM_KEYDOWN消息,再将发送线程挂起,之后调用离站信息发送函数,等待报站音频播放结束后恢复发送线程。如此往复循环。
车载播放终端负责媒体文件的接收与播放、语音报站以及到站与换乘信息提示。具体流程如图7所示。MyNetPlayer接收端程序启动后创建DirectShow的滤波器链表FilterGraph,启动接收线程,解析接收到的组播报的报头,如果是DATA_MEDIA则将数据报通过DirectShow技术解码播放;如果是ARRIVE**则向窗口类发送WM_ARRIVE**消息,窗口类接收到对应的到站消息后则调用对应的到站处理函数,即播放到站提示音频与显示到站与换乘提示信息;如果是LEAVE**则向窗口类发送WM_LEAVE**消息,窗口类接收到对应的出站消息后则调用相应的出站处理函数,即播放出站提示音频与下一站的换乘提示信息。
2.3 功能实现
2.3.1 媒体文件的IP组播与接收
IP组播是通过使用特定的IP组播地址,将IP数据报传输到一个组播群组,所有加入该组的网络接收者均可以收到这份数据,这样极大地减小了网络负载。媒体文件的组播是通过CMulticastAdmin类来实现的,具体过程如下:
(1)发送端
①创建组播组
mMulticaster->CreateMulticaster();
②获取媒体路径名
SourceFile=mProgramListCtrl.GetItemText(NowListNum,1);
③打开媒体文件
m_objFile.Open(m_strSourceFile,CFile::modeRead|CFile::typeBinary)
④读取媒体文件数据
nRead=m_objFile.Read(pBuf+sizeof(MSG_HEADER),MPEG1_PACK);
⑤设置数据报报头
pMsg->nMsgType=DATA_MEDIA;
⑥组播
Multicast(pBuf,nMsgSize);
(2)接收端
①开启接收线程
m_pReceiver->StartReceiving();
②接收数据
nret=Receive(buff,nMsgSize);
③解析报头
PMSG_HEADER pMsg=(PMSG_HEADER)buff;
nMsgType=pMsg->nMsgType;
2.3.2 DirectShow解码播放
DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM的流媒体处理的开发包[12]。DirectShow使用Filter Graph的模型来管理整个数据流的处理过程,各个Filter在Filter Graph中按一定的顺序连接成一条"流水线"协同工作。按照功能划分,Filter大致分为三类:Source Filters、Transform Filters和Rendering Filters。首先通过Source Filters负责取得网络组播数据,然后将数据往下传输,之后经Transform Filters进行数据的格式转换、传输,最后Rendering Filters将数据传送给显示与音频设备进行多媒体的演示。接收端MyNetPlayer进行解码播放的过程如下:
(1)创建滤波器链表管理器m_pGB
HRESULT hr=CoCreateInstance(CLSID_FilterGraph,
NULL,
CLSCTX_INPROC,
IID_IGraphBuilder,
(void**)&m_pGB);
(2)查询媒体控制接口
hr=m_pGB->QueryInterface(IID_IMediaControl,(void**)&m_pMC);
(3)添加自己制作的接收网络数据的SourceFilter
hr=m_pGB->AddFilter(m_pSourceReader, NULL);
(4)构建滤波器链表,渲染媒体文件
HRESULT hr=m_pGB->Render(m_pSourceReader->GetPin(0));
(5)进行播放
hr=m_pMC->Run();
2.3.3 自动报站
自动报站是通过向窗口类发送自定义的到站与离站消息来实现的。当窗口类接收到到站或离站消息后再调用相应的消息处理函数,从而实现自动报站。下面是WM_MESSAGE_ARRIVE1站点1的到站消息处理函数,其他消息处理函数与其类似。
LONG CMyNetPlayerDlg::OnMessageARRIVE1(WPARAM wParam, LPARAM lParam)
{
m_pGraph->m_pVW->put_Visible(OAFALSE);
//将视频画面屏蔽
InitMyGraph();
//初始化用于播放mp3音频文件的GraphFilter
bmp.LoadBitmap(IDB_BITMAP1);//加载到站位图
drawbitmap();//显示位图
m_StaText.SetWindowText(L"十三号街站到了");
//显示到站信息
HRESULT hr;
long evCode;
hr=pGraph->RenderFile(L"/硬盘/stationin/1.mp3",NULL);//构建滤波器链表,渲染报站音频文件
hr=pControl->Run();//播放
pEvent->WaitForCompletion(INFINITE,&evCode);
//等待音频播放完毕
pControl->Release();//释放资源
pEvent->Release();
pGraph->Release();
CoUninitialize();
bmp.DeleteObject();
m_pGraph->m_pVW->put_Visible(OATRUE);
//显示原视频画面
return 0;
}
pxa270 S3C2440A WinCE STC89C52 相关文章:
- GPS导航数据提取的设计与研究(01-25)
- 基于WinCE的智能车载仪表设计(01-28)