首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

,WINCE视频播放

2012-02-03 
求助,WINCE视频播放我在at91sam9261-EK评估板上试验视频播放,系统是WINCE6.0,无论系统自带的播放器还是DSH

求助,WINCE视频播放
我在at91sam9261-EK评估板上试验视频播放,系统是WINCE   6.0   ,无论系统自带的播放器还是DSHOW开发的,都能够播放出wmv格式的文件,但是都不流畅,效果很不好,有哪位大哥做过这个吗,指点指点该怎么做,谢谢了。要求是只要能流畅播放出视频就行了。

[解决办法]
上网找一下开源的TCPMP,播放的很流畅
[解决办法]
/******************************************************************************
* 定义宏模块 *
******************************************************************************/
#define MEDIAPLAYDLL_API _declspec(dllexport)

/******************************************************************************
* 头文件加载模块(头文件的加载顺序不能改变) *
******************************************************************************/
#include "stdafx.h "

#include <streams.h>

#include <commdlg.h>

#include <assert.h>


#include "MediaPlay.h "

#include "macdefine.h "

/******************************************************************************
* 全局变量定义模块 *
******************************************************************************/

// 当前播放状态
enum PLAYSTATE { psRUNNING, psPAUSED, psSTOPPED};

// Filter Graph组件接口
IGraphBuilder* ipGraBuilder = NULL;

// 播放控制接口
IMediaControl* ipMedControl = NULL;

// 随机定位接口
IMediaEventEx* ipMedEventEx = NULL;

// 视频相关接口
IVideoWindow* ipVidWindow = NULL;
IBasicVideo* ipBasVideo = NULL;

// 音频相关接口
IBasicAudio* ipBasAudio = NULL;

// IMediaEventEx接口,让应用程序及时处理Filter Graph Manager发出的事件
IMediaSeeking* ipMedSeeking = NULL;


// 播放的媒体文件是否仅有音频,初始化为否
bool g_bAudioOnly = false;

// 当前媒体文件的播放状态,初始化为 "停止 "
PLAYSTATE g_psCurrent=psSTOPPED;

// 增加 减少 音量时的基准音量,初始化为最大音量
int g_iBenchSound = MAX_SOUND;

/******************************************************************************
* 主函数实现模块 *
******************************************************************************/

/******************************************************************************
* 函数名称: DllMain() *
* 功能描述: 动态链接库的入口函数 *
* 输入参数: hModule 动态链接库的句柄 *
* ul_reason_for_call 动态链接库被调用的原因 *
* lpReserved 动态链接库初始化和释放的标记 *
* 输出参数: 无 *
* 返 回 值: true 成功 *
* false 失败 *
******************************************************************************/
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
// 初始化COM库
if(FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))
{
RETAILMSG(1, (TEXT( "CoInitialize Failed!\r\n ")));
return false;
}

}
if (ul_reason_for_call == DLL_PROCESS_DETACH)
{


// 卸载COM库
CoUninitialize();
}
return true;
}

/******************************************************************************
* 导出函数实现模块 *
******************************************************************************/

/******************************************************************************
* 函数名称: InitInterface() *
* 功能描述: 使用DirectShow播放媒体文件第一步:初始化DirectShow媒体播放接口 *
* 输入参数: lpFile 媒体文件的全路径( 包括扩展名) *
* 输出参数: 无 *
* 返 回 值: S_OK 初始化成功 *
* 非S_OK 初始化失败,无法播放此文件 *
******************************************************************************/
HRESULT InitInterface(LPTSTR lpFile)
{
int iFileLen = _tcslen(lpFile);
// 媒体文件路径不能为空
assert(iFileLen!=0);

TCHAR wFile[MAX_PATH];
HRESULT hr;

#ifndef UNICODE
MultiByteToWideChar(CP_ACP, 0, lpFile, -1, wFile, MAX_PATH);
#else
if (iFileLen < MAX_PATH)
{
lstrcpy(wFile, lpFile);
}
else
{
return E_FAIL;
}
#endif

// 创建一个Filter Graph组件
JIF(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void **)&ipGraBuilder));

if (SUCCEEDED(hr))
{
// 使用智能链接构建Filter Graph
JIF(ipGraBuilder-> RenderFile(wFile, NULL));

// 得到播放控制接口和随机定位接口
JIF(ipGraBuilder-> QueryInterface(IID_IMediaControl, (void **)&ipMedControl));
JIF(ipGraBuilder-> QueryInterface(IID_IMediaEventEx, (void **)&ipMedEventEx));

// 得到IMediaEventEx接口,以便让应用程序及时处理Filter Graph Manager发出的事件
JIF(ipGraBuilder-> QueryInterface(IID_IMediaSeeking, (void **)&ipMedSeeking));

// 得到视频相关接口
JIF(ipGraBuilder-> QueryInterface(IID_IVideoWindow, (void **)&ipVidWindow));
JIF(ipGraBuilder-> QueryInterface(IID_IBasicVideo, (void **)&ipBasVideo));

// 得到音频相关接口
JIF(ipGraBuilder-> QueryInterface(IID_IBasicAudio, (void **)&ipBasAudio));

}

return hr;
}


[解决办法]
WINCE下WMV解码的性能不是很好,建议采用DIVX或XVID等格式的文件,用TCPMP解码播放。此外显示方法也很重要,WMP基本上是用GDI方法因而显示很耗时导致整体播放速度欠佳。而TCPMP会针对不同的硬件平台尽量采用直接访问framebuffer,显示速度快。

热点排行