10988|21

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助,WINCE视频播放 [复制链接]

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

最新回复

我们有同事将TCPMP的解码器移植到了我们的媒体播放器上了,三星2440, WCE4.2平台主频400M, 播放各种格式效果都很流畅,不会卡,且兼容大多数视频音频,图片格式,有需要可联系QQ:408554849,  详情 回复 发表于 2007-11-29 14:51
点赞 关注
 

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
上网找一下开源的TCPMP,播放的很流畅
此帖出自WindowsCE论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我的开发环境是Windows Mobiles 5.0, 我是调用Windows Media ActiveX控件进行播放视频的。
应该和系统自带的播放器效果差不多。
我想请教楼主用DShow怎么开发播放WMV的程序,能给我一个程序片断吗?
email: ustc_yky@hotmail.com
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
我也想要楼主用DSHOW开发的播放器,不知道能不能提供。
91program@163.com
此帖出自WindowsCE论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
我也在找这个,我去找找TCPMP,看能找到不
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
连系统自带的播放器都不流畅,你的板子的速度多少,速度不够当然不流畅了,程序问题的可能性很小。
此帖出自WindowsCE论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

7
 
/******************************************************************************
*                             定义宏模块                                      *
******************************************************************************/
#define MEDIAPLAYDLL_API _declspec(dllexport)

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

#include

#include

#include



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

此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
/******************************************************************************
* 函数名称: SetPlayAgain()                                                   *
* 功能描述: 使用DirectShow播放媒体文件第二步(可选):设置播放状态为反复进行    *
* 输入参数: hWnd  播放的窗口句柄(响应重新播放消息Msg的窗口句柄)              *
*            Msg   接收重新播放的消息(用户自定义)                             *
* 输出参数: 无                                                               *
* 返 回 值: S_OK    设置成功                                                 *
*            非S_OK  设置失败                                                 *
******************************************************************************/
HRESULT SetPlayAgain(HWND hWnd,UINT Msg)
{
        // 断言 窗口句柄和消息不能为null
        assert(hWnd!=NULL && Msg!=0);

        // 如果是无效窗口,返回S_FALSE
        if(!IsWindow(hWnd))
        {
                return S_FALSE;
        }

        HRESULT hr;

        // 注册接收消息响应的窗口
        JIF(ipMedEventEx->SetNotifyWindow((OAHWND)hWnd, (long)Msg, 0));

        return hr;
}

/******************************************************************************
* 函数名称: PlayAgain()                                                      *
* 功能描述: 使用DirectShow播放媒体文件第三步(可选):反复播放                  *
*            (在第二步的设置的消息响应里调用)                                 *
* 输入参数: 无                                                               *
* 输出参数: 无                                                               *
* 返 回 值: S_OK    开始重复播放                                             *
*            非S_OK  无法开始重复播放                                         *
******************************************************************************/
HRESULT PlayAgain(void)
{
        LONG evCode, evParam1, evParam2;
    HRESULT hr;

        // 当IMediaEventEx接口释放后,就不需要访问IMediaEventEx接口了
        if(!ipMedEventEx)
        {
                return S_FALSE;
        }
       
        // 一次while循环处理事件队列中的所有事件
    while(SUCCEEDED(ipMedEventEx->GetEvent(&evCode, &evParam1, &evParam2, 0)))
    {
                // 当媒体播放完成,重新开始播放
        if(EC_COMPLETE == evCode)
        {
            LONGLONG pos=0;

                        // 定位到文件头
            hr = ipMedSeeking->SetPositions(&pos, AM_SEEKING_AbsolutePositioning ,
                                   NULL, AM_SEEKING_NoPositioning);
            if (FAILED(hr))
            {
                                // 有少数的filter不支持IMediaSeeking接口 ,则通过先停止后播放来实现重新播放
                                if(StopMedia()!=S_OK)
                                {
                                        hr = S_FALSE;
                                        break;
                                }
                                if(PlayMedia()!=S_OK)
                                {
                                        hr = S_FALSE;
                                        break;
                                }
            }
        }
                // Filter Graph 运行过程中发生了错误
                else if(EC_ERRORABORT == evCode)
                {
                        if(StopMedia()!=S_OK)
                        {
                                hr = S_FALSE;
                                break;
                        }
                        hr = (HRESULT)evParam1;
                        break;
                }
    }

        // 释放回调期间相关的内存
        if (FAILED(hr = ipMedEventEx->FreeEventParams(evCode, evParam1, evParam2)))
        {
                CloseMedia();
        }

    return hr;
}

/******************************************************************************
* 函数名称: CheckMediaType()                                                 *
* 功能描述: 检查播放媒体类型                                                 *
* 输入参数: 无                                                               *
* 输出参数: 无                                                               *
* 返 回 值: 1        表示视频                                                *
*            0        表示音频                                                *
*            -1       表示未知                                                *
******************************************************************************/
int CheckMediaType(void)
{
        long lVisible;
    HRESULT hr;

    g_bAudioOnly = false;

        // 播放纯音频文件的Filter Graph不会实现IVideoWindow和IBasicVideo接口
    if (!ipVidWindow || !ipBasVideo)
    {
        g_bAudioOnly = true;
        return 0;
    }

        // 另一种情况,媒体文件包含视频内容,系统没有相应的解码Filter,则下面这句话将调用失败
    hr = ipVidWindow->get_Visible(&lVisible);
    if (FAILED(hr))
    {
        if (hr == E_NOINTERFACE)
        {
            g_bAudioOnly = true;
                        return 0;
        }
                else
                {
                        return -1;
                }
    }
        return 1;
}

/******************************************************************************
* 函数名称: GetMediaLength()                                                 *
* 功能描述: 获取播放媒体总长度                                               *
* 输入参数: llMediaLength  (in)   媒体文件总长度                             *
* 输出参数: llMediaLength  (out)  媒体文件总长度(为-1表示获取失败)           *
* 返 回 值: S_OK                                                             *
******************************************************************************/
HRESULT GetMediaLength(LONGLONG& llMediaLength)
{
        // 如果没有实现IMediaSeeking接口,或IMediaSeeking接口已经释放,则llMediaLength = -1
        if(ipMedSeeking)
        {
                ipMedSeeking->GetDuration(&llMediaLength);
        }
        else
        {
                llMediaLength = -1;
        }

        return S_OK;
}
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 
/******************************************************************************
* 函数名称: GetMediaCurrPos()                                                *
* 功能描述: 获取当前播放媒体位置                                             *
* 输入参数: llMediaLength  (in)   媒体文件当前位置                           *
* 输出参数: llMediaLength  (out)  媒体文件当前位置(为-1表示获取失败)         *
* 返 回 值: S_OK                                                             *
******************************************************************************/
HRESULT GetMediaCurrPos(LONGLONG& llMediaLength)
{
        // 如果没有实现IMediaSeeking接口,或IMediaSeeking接口已经释放,则llMediaLength = -1
        if(ipMedSeeking)
        {
                ipMedSeeking->GetCurrentPosition(&llMediaLength);
        }
        else
        {
                llMediaLength = -1;
        }
       
        return S_OK;
}

/******************************************************************************
* 函数名称: PlayMedia()                                                      *
* 功能描述: 开始播放媒体文件                                                 *
* 输入参数: 无                                                               *
* 输出参数: 无                                                               *
* 返 回 值: S_OK      成功开始播放                                           *
*            S_FALSE   无法开始播放                                           *
******************************************************************************/
HRESULT PlayMedia(void)
{  
        HRESULT hr;
        OAFilterState fs;

        // 开始播放
        hr = ipMedControl->Run();
        // 已开始播放
        if(hr == S_OK)
        {
                g_psCurrent = psRUNNING;
                return S_OK;
        }
        // 准备开始播放
        else if(hr == S_FALSE)
        {
                // 等待其为:已开始播放
            do
                {
                        ipMedControl->GetState(50,&fs);
                } while(fs!=State_Running);
                g_psCurrent = psRUNNING;
                return S_OK;
        }
        // 无法开始播放
        else
        {
                return S_FALSE;
        }
}

/******************************************************************************
* 函数名称: PauseMedia()                                                     *
* 功能描述: 暂停播放媒体文件                                                 *
* 输入参数: 无                                                               *
* 输出参数: 无                                                               *
* 返 回 值: S_OK      成功暂停播放                                           *
*            S_FALSE   无法暂停播放                                           *
******************************************************************************/
HRESULT PauseMedia(void)
{
        HRESULT hr=S_OK;
        OAFilterState fs;

        // 暂停
        hr = ipMedControl->Pause();

        // 已实际暂停
        if(hr == S_OK)
        {
                g_psCurrent = psPAUSED;
                return S_OK;
        }
        // 准备暂停
        else if(hr == S_FALSE)
        {
                // 等待其为:实际暂停
            do
                {
                        ipMedControl->GetState(50,&fs);
                } while(fs!=State_Paused);
                g_psCurrent = psPAUSED;
                return S_OK;
        }
        // 无法暂停
        else
        {
                return S_FALSE;
        }
}

/******************************************************************************
* 函数名称: StopMedia()                                                      *
* 功能描述: 停止播放媒体文件                                                 *
* 输入参数: 无                                                               *
* 输出参数: 无                                                               *
* 返 回 值: S_OK      成功停止播放                                           *
*            S_FALSE   无法停止播放                                           *
******************************************************************************/
HRESULT StopMedia(void)
{
        HRESULT hr=S_OK;
        LONGLONG pos = 0;
        OAFilterState fs;

        // 停止播放
        hr = ipMedControl->Stop();

        // 实际已停止
        if(hr == S_OK)
        {
                g_psCurrent = psSTOPPED;
        }
        // 准备停止
        else if(hr == S_FALSE)
        {
                // 等待其为 :实际停止
            do
                {
                        ipMedControl->GetState(50,&fs);
                } while(fs!=State_Stopped);
                g_psCurrent = psSTOPPED;
                hr = S_OK;
        }
        // 无法停止  返回
        else
        {
                return S_FALSE;
        }

        // 定位到文件头
        ipMedSeeking->SetPositions(&pos, AM_SEEKING_AbsolutePositioning ,
            NULL, AM_SEEKING_NoPositioning);

    return hr;
}

/******************************************************************************
* 函数名称: SpeedMedia()                                                     *
* 功能描述: 播放时快进一段距离                                               *
* 输入参数: llMediaPos   (in)   媒体需要快进的量                             *
* 输出参数: 无                                                               *
* 返 回 值: S_OK      成功快进播放                                           *
*            S_FALSE   无法快进播放                                           *
******************************************************************************/
HRESULT SpeedMedia(LONGLONG llMediaPos)
{
        HRESULT hr;
        LONGLONG llMediaLen;
        LONGLONG llCurrLen;
        // 获取媒体总长度和当前媒体播放位置
        GetMediaLength(llMediaLen);
        GetMediaCurrPos(llCurrLen);
        // 媒体总长度和当前媒体播放位置都不能为-1
        assert(llMediaLen!=-1 && llCurrLen!=-1);
        // 如果快进量与当前播放位置的和大于总长度,则从头开始播放
        if((llCurrLen+llMediaPos)>llMediaLen)
        {
                hr = ReSetMediaPos(NULL);
        }
        else
        {
                hr = ReSetMediaPos(llCurrLen+llMediaPos);
        }

        return hr;
}

/******************************************************************************
* 函数名称: BlackMedia()                                                     *
* 功能描述: 播放时快退一段距离                                               *
* 输入参数: llMediaPos   (in)  媒体需要快退的量                              *
* 输出参数: 无                                                               *
* 返 回 值: S_OK      成功快退播放                                           *
*            S_FALSE   无法快退播放                                           *
******************************************************************************/
HRESULT BlackMedia(LONGLONG llMediaPos)
{
        HRESULT hr;
        LONGLONG llMediaLen;
        LONGLONG llCurrLen;
        // 获取媒体总长度和当前媒体播放位置
        GetMediaLength(llMediaLen);
        GetMediaCurrPos(llCurrLen);
        // 媒体总长度和当前媒体播放位置都不能为-1
        assert(llMediaLen!=-1 && llCurrLen!=-1);
        // 如果快进量与当前播放位置的差小于0,则从头开始播放
        if((llCurrLen-llMediaPos)<0)
        {
                hr = ReSetMediaPos(NULL);
        }
        else
        {
                hr = ReSetMediaPos(llCurrLen-llMediaPos);
        }
       
        return hr;
}

/******************************************************************************
* 函数名称: ReSetMediaPos()                                                  *
* 功能描述: 重置媒体播放的位置                                               *
* 输入参数: llMediaPos   (in)  媒体新的播放开始位置                          *
* 输出参数: 无                                                               *
* 返 回 值: NOERROR    成功重置播放位置                                      *
*            其他       无法重置播放位置                                      *
******************************************************************************/
HRESULT ReSetMediaPos(LONGLONG llMediaPos)
{
        HRESULT hr;
       
        // 先暂停播放,然后重置播放位置
        hr = PauseMedia();
        if(hr == S_OK)
        {
                g_psCurrent = psPAUSED;
                hr = ipMedSeeking->SetPositions(&llMediaPos,AM_SEEKING_AbsolutePositioning,
                        NULL,AM_SEEKING_NoFlush);
                if(hr!=NOERROR)
                {
                        return S_FALSE;
                }
        }
        else
        {
                return S_FALSE;
        }
       
        // 重置播放位置后,开始播放
        hr=PlayMedia();
        if(hr!=S_OK)
        {
                return S_FALSE;
        }
        else
        {
                hr = NOERROR;
                g_psCurrent = psRUNNING;
        }
       
        return hr;
}
此帖出自WindowsCE论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
还以为这帖子沉了呢,看来还是有很多人在做这个的,呵呵·~

TCPMP是很流畅,现在改名叫COREPLAYER了吧,不开源了~

to:dthxman()
我的板子是ATMEL的at91sam9261 速度是200M,不是很快,但在LINUX下播放得很流畅的,用TCPMP也播得流畅,应该不是速度问题吧
to:1982pc()
谢谢你的代码,这个是做成一般DLL还是驱动,你的是什么环境,播得流畅吗.这几天在忙其他,改天再试试,再次感谢!
此帖出自WindowsCE论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

11
 
做的一般dll,播放会很基本流畅,不过就是播起来以后操作会慢点儿:(
而且上面给的不是完整代码~~~~只能连续回复三次.
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(中级)

12
 
/******************************************************************************
* 函数名称: MinSound()                                                       *
* 功能描述: 声音最小化,即禁音                                               *
* 输入参数: 无                                                               *
* 输出参数: 无                                                               *
* 返 回 值: E_FAIL         出现设备错误                                      *
*            S_OK           设置成功                                          *
*            E_INVALIDARG   设置超过范围                                      *
******************************************************************************/
HRESULT MinSound(void)
{
        // 将音量设置为最小值MIN_SOUND
        HRESULT hr;
        JIF(ipBasAudio->put_Volume(MIN_SOUND));
        return hr;
}

/******************************************************************************
* 函数名称: MaxSound()                                                       *
* 功能描述: 声音最大化                                                       *
* 输入参数: 无                                                               *
* 输出参数: 无                                                               *
* 返 回 值: E_FAIL         出现设备错误                                      *
*            S_OK           设置成功                                          *
*            E_INVALIDARG   设置超过范围                                      *
******************************************************************************/
HRESULT MaxSound(void)
{
        // 将音量设置为最大值MAX_SOUND
        HRESULT hr;
        JIF(ipBasAudio->put_Volume(MAX_SOUND));
        return hr;
}

/******************************************************************************
* 函数名称: IncreaseSound()                                                  *
* 功能描述: 增加音量(音量范围,从小到大 -10000---0)                           *
* 输入参数: iIncrease  增大的音量量(0-10000)                                 *
* 输出参数: 无                                                               *
* 返 回 值: E_FAIL         出现设备错误                                      *
*            S_OK           设置成功                                          *
*            E_INVALIDARG   设置超过范围                                      *
******************************************************************************/
HRESULT IncreaseSound(int iIncrease)
{
        HRESULT hr;
        // 保证输入的增大音量值在0-10000之间
        if(iIncrease>=0 && iIncrease<=(MIN_SOUND*(-1)))
        {
                // 基准音量变为其与增大的音量量的和
                g_iBenchSound += iIncrease;
                // 当前的基准音量大于最大音量
                if(g_iBenchSound>MAX_SOUND)
                {
                        // 将音量设置为最大
                        JIF(ipBasAudio->put_Volume(MAX_SOUND));
                        // 将基准音量设置为最大值
                        g_iBenchSound = MAX_SOUND;
                        return E_INVALIDARG;
                }
                // 音量设置为当前基准音量
                else
                {
                        JIF(ipBasAudio->put_Volume(g_iBenchSound));
                }
        }
        else
        {
                return E_INVALIDARG;
        }
       
        return hr;
}

/******************************************************************************
* 函数名称: ReduceSound()                                                    *
* 功能描述: 减少音量(音量范围,从小到大 -10000---0)                           *
* 输入参数: iReduce  减少的音量量(0-10000)                                   *
* 输出参数: 无                                                               *
* 返 回 值: E_FAIL         出现设备错误                                      *
*            S_OK           设置成功                                          *
*            E_INVALIDARG   设置超过范围                                      *
******************************************************************************/
HRESULT ReduceSound(int iReduce)
{
        HRESULT hr;
        // 保证输入的减少音量值在0-10000之间
        if(iReduce>=0 && iReduce<=(MIN_SOUND*(-1)))
        {
                // 基准音量变为其与减少的音量量的差
                g_iBenchSound -= iReduce;
                // 如果当前基准音量小于最小音量值
                if (g_iBenchSound                 {
                        // 设置音量为最小
                        JIF(ipBasAudio->put_Volume(MIN_SOUND));
                        // 基准音量设置为最小值
                        g_iBenchSound = MIN_SOUND;
                        return E_INVALIDARG;
                }
                // 音量设置为当前基准音量
                else
                {
                        JIF(ipBasAudio->put_Volume(g_iBenchSound));
                }
        }
        else
        {
                return E_INVALIDARG;
        }
       
        return hr;
}

/******************************************************************************
* 函数名称: SetSound()                                                       *
* 功能描述: 设置音量(音量范围,从小到大 -10000---0)                           *
* 输入参数: dRate  总音量的百分比(0.001--1)                                  *
* 输出参数: 无                                                               *
* 返 回 值: E_FAIL         出现设备错误                                      *
*            S_OK           设置成功                                          *
*            E_INVALIDARG   设置超过范围                                      *
******************************************************************************/
HRESULT  SetSound(double dRate)
{
        HRESULT hr;
        // 可调的精准度1/1000
        if(dRate>0.001 && dRate<=1.0)
        {
                int iBenchSound = (int)(MIN_SOUND*(1.0-dRate));
                JIF(ipBasAudio->put_Volume((long)iBenchSound));
                g_iBenchSound = iBenchSound;
        }
        else
        {
                return E_INVALIDARG;   // 超出当前可设置的音量范围
        }
        return hr;
}

/******************************************************************************
* 函数名称: FullScreen()                                                     *
* 功能描述: 全屏播放                                                         *
* 输入参数: hWnd   (in)全屏播放依赖的窗口句柄                                *
* 输出参数: 无                                                               *
* 返 回 值: E_NOTIMPL   此媒体文件不支持全屏,无法全屏幕                     *
*            NOERROR     支持全屏                                             *
*            S_FALSE     无法全屏播放(窗口句柄无效、无法暂停或开始播放、当前已*
*                          为全屏状态)                                        *
******************************************************************************/
HRESULT FullScreen(HWND hWnd)
{
        HRESULT hr;
    LONG lMode;

        // 如果窗口句柄无效,直接返回
        if(!IsWindow(hWnd))
        {
                return S_FALSE;
        }

        // 如果媒体文件仅是音频或视频接口不存在,则无法全屏播放
    if (g_bAudioOnly || !ipVidWindow)
        {
        return S_FALSE;
        }

        // 如果媒体当前是播放状态则先暂停播放
    if (g_psCurrent == psRUNNING)
        {
        if(S_FALSE == PauseMedia())
                {
                        return S_FALSE;
                }
        }

    JIF(ipVidWindow->get_FullScreenMode(&lMode));

        // 如果当前状态不是全屏,则设置为全屏
    if (lMode == OAFALSE)
    {
                // 设置视频窗口将要发送消息的窗口
        LIF(ipVidWindow->put_MessageDrain((OAHWND) hWnd));
        JIF(ipVidWindow->put_FullScreenMode(OATRUE));
    }
        // 当前状态已经为全屏了
        else
        {
                hr = S_FALSE;
        }

        // 如果当前播放状态为暂停,则改变播放状态为开始播放
        if (g_psCurrent == psPAUSED)
        {
                if(S_FALSE == PlayMedia())
                {
                        return S_FALSE;
                }
        }

    return hr;
}
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

13
 
/******************************************************************************
* 函数名称: OriginalScreen()                                                 *
* 功能描述: 恢复原始播放屏幕,需重新调用InitVideoWnd初始化视频播放窗口        *
* 输入参数: 无                                                               *
* 输出参数: 无                                                               *
* 返 回 值: E_NOTIMPL   无法恢复原始屏幕                                     *
*            NOERROR     成功恢复原始屏幕                                     *
******************************************************************************/
HRESULT OriginalScreen(void)
{
        HRESULT hr;
        // 恢复原始屏幕
    JIF(ipVidWindow->put_FullScreenMode(OAFALSE));
        return hr;
}

/******************************************************************************
* 函数名称: InitVideoWnd()                                                   *
* 功能描述: 初始化视频播放窗口                                               *
* 输入参数: hWnd   (in)播放窗依赖的窗口句柄                                  *
*            rc     播放的视频窗口位置                                        *
* 输出参数: 无                                                               *
* 返 回 值: S_OK     成功初始化视频窗口                                      *
*            非S_OK   视频窗口初始化失败                                      *
******************************************************************************/
HRESULT InitVideoWnd(HWND hWnd,RECT rc)
{
        HRESULT hr;
        // 视频状态才真正调用
        if (!g_bAudioOnly)
        {
                // 设置视频窗口依赖的窗口句柄
                JIF(ipVidWindow->put_Owner((OAHWND)hWnd));
                // 设置视频窗口样式
                JIF(ipVidWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN));
                // 设置视频窗口的位置
                JIF(ipVidWindow->SetWindowPosition(rc.left, rc.top, rc.right-rc.left,rc.bottom-rc.top));
                // 设置视频窗口将要发送消息的窗口
                LIF(ipVidWindow->put_MessageDrain((OAHWND) hWnd));
        }
        else
        {
                return S_FALSE;
        }
        return hr;
}

/******************************************************************************
* 函数名称: SetPlayRate()                                                    *
* 功能描述: 设置播放速率                                                     *
* 输入参数: dRate                                                            *
*              1     普通速率                                                 *
*              2     2倍速率                                                  *
*              0.5   1/2倍速率                                                *
*              其余类推                                                       *
* 输出参数: 无                                                               *
* 返 回 值: S_OK            成功设置                                         *
*            E_INVALIDARG    设置超出范围                                     *
*            其他            设置失败                                         *
******************************************************************************/
HRESULT SetPlayRate(double dRate)
{
        HRESULT hr;

        if (S_OK != PauseMedia())
        {
                return S_FALSE;
        }

        JIF(ipMedSeeking->SetRate(dRate));

        if (S_OK != PlayMedia())
        {
                return S_FALSE;
        }

        return hr;
}

/******************************************************************************
* 函数名称: CloseMedia()                                                     *
* 功能描述: 关闭媒体播放,释放接口资源                                       *
* 输入参数: 无                                                               *
* 输出参数: 无                                                               *
* 返 回 值: 无                                                               *
******************************************************************************/
void CloseMedia(void)
{
        // 隐藏视频窗口后放弃所有权
        if(ipVidWindow)
    {
        ipVidWindow->put_Visible(OAFALSE);
        ipVidWindow->put_Owner(NULL);
    }
        // 注销事件回调
    if (ipMedEventEx)
        {
        ipMedEventEx->SetNotifyWindow((OAHWND)NULL, 0, 0);
        }
       
        // 安全释放各接口资源
        SAFE_RELEASE(ipMedControl);
    SAFE_RELEASE(ipMedEventEx);
    SAFE_RELEASE(ipMedSeeking);
    SAFE_RELEASE(ipBasVideo);
    SAFE_RELEASE(ipBasAudio);
    SAFE_RELEASE(ipVidWindow);
    SAFE_RELEASE(ipGraBuilder);
}
此帖出自WindowsCE论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

14
 
关注!
TCPMP源码应该可以下载到吧?
此帖出自WindowsCE论坛
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

15
 
at91sam9261-EK评估板 在哪里可以搞到?
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

16
 
to 1982pc 请问有没有这个dll的使用范例
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

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

回复

73

帖子

0

TA的资源

一粒金砂(初级)

18
 
to 1982pc 谢谢~ :) 已经根据你的代码生成DLL,准备写调用了~

bzjing(Jin) 老兄,谢谢你的建议,看来老兄对WINCE媒体播放多有研究,想再请教你几个问题:

1: TCPMP在24位液晶屏中为何显示不出图像,而在16位液晶屏中能正确播出,这是软件问题还是什么问题?
2: TCPMP里哪些项目是必须的,我只是编译了源码中VS2005已经加载的项目,效果没有原TCPMP好!
3: 自己写播放器有多大难度,就按照您说的采用DIVX文件及直接访问framebuffer,主要做些什么工作,现在就只是移植别人的工程,而且TCPMP那么庞大,出了错也不好改!

我最终想要做的是在at91sam9261的24位液晶屏上流畅的跑起一个播放器,也希望其他有做过这方面工作的朋友帮帮我,谢谢了!

marc4901@hotmail.com


此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

19
 
对于问题1,你可以尝试在TCPMP菜单中选择不同的video driver,看能否显示出来;至少选择GDI的时候应该能正常显示。
其实TCPMP工程中只有COMMON是必须的,其他都是插件;而插件最好用TCPMP官方发布的,一般地官方的插件编译方法有所不同,性能会好些;并且比如MPEG4和H264解码插件并不开源。
对于自己写播放器,我建议你最好还是基于别人的基础上开发会更快些,但难度都不小。不过我们将发布一个基于TCPMP框架和解码核心的播放器引擎,提供播放控制接口,用户只需自己定制界面就好。这样一来,开发播放器就容易多了!有兴趣请关注我们的网站 www.cyansoft.com.cn 。
此帖出自WindowsCE论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

20
 
我用DIRECTSHOW做了个简单的嵌入式本地播放器,播放WMV没什么不流畅啊,
PS:在WINCE上播放
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表