微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 汽车电子 > 基于PXA270与WinCE的分布式地铁车载系统开发

基于PXA270与WinCE的分布式地铁车载系统开发

时间:01-06 来源:3721RD 点击:

(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;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top