• 4864阅读
  • 8回复

我想在打开文件后同步得到播放时长 [复制链接]

上一主题 下一主题
离线hinacom
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2017-04-24
如题,我想在打开视频文件后,不退出调用函数,等待一些时间,再得到播放文件总时长。请问,如何做?
离线aplayer

只看该作者 沙发  发表于: 2017-04-25
等待时自己写一个 GetMessage 循环,直等到 APlayer 的打开成功事件,获取到时长后,退出该循环即可。
离线hinacom

只看该作者 板凳  发表于: 2017-04-26
回 aplayer 的帖子
aplayer:等待时自己写一个 GetMessage 循环,直等到 APlayer 的打开成功事件,获取到时长后,退出该循环即可。
 (2017-04-25 22:38) 

谢谢回复。和我想的一样。
BOOL CAPlayerDemoDlg::SyncWaitEventAndMessage(HANDLE hEventTarget)
{
    if (hEventTarget == NULL)
        return FALSE;

    BOOL fQuit = FALSE;    // should the loop terminate?
    while (!fQuit)
    {
        HANDLE hEvent = hEventTarget;
        //Wake when the kernel object is signaled OR if we have to process a UI message.
        DWORD dwResult = ::MsgWaitForMultipleObjectsEx(1, &hEvent, INFINITE, QS_ALLEVENTS, MWMO_INPUTAVAILABLE);
        switch (dwResult)
        {
        case WAIT_OBJECT_0: // The event became signaled.
            fQuit = TRUE;
            break;
        case WAIT_OBJECT_0+1: // A message is in our queue;
            // Dispatch all of the messages.
            MSG msg;
            //while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            while (::GetMessage(&msg, NULL, 0, 0))
            {
                if(msg.message == WM_QUIT)
                {
                    //  A WM_QUIT message. exit the loop
                    fQuit = TRUE;
                }
                else
                {
                    // Translate and dispatch the message;
                    ::TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
            }// Our queue is empty/
            break;
        default:
            break;
        }
    }// End of while loop.

    return fQuit;
}
double CAPlayerDemoDlg::startPlayback(const char * filename, long hwnd, bool bPlayAudio)
{
    if(filename == NULL)
        return -1;
    if(!m_bInit || m_MyPlayer.m_pAPlayer == NULL)
        return -1;

    std::string strFileName = filename;
    std::wstring wsFileName = StringConvert::ANSIToUnicode(strFileName);
    m_MyPlayer.SetFileName(wsFileName);

    if (bPlayAudio)
        m_MyPlayer.m_pAPlayer->SetConfig(15, _T("1"));
    else
        m_MyPlayer.m_pAPlayer->SetConfig(15, _T("0"));
    
    if(hwnd == NULL)
    {
        hwnd = (long)GetSafeHwnd();
    }
    if(hwnd)
    {
        m_MyPlayer.m_hAPlayerWnd = (HWND)hwnd;
        if (::IsWindow(m_MyPlayer.m_hAPlayerWnd))
        {
            HRESULT hr = AtlAxAttachControl(m_MyPlayer.m_pAPlayer, m_MyPlayer.m_hAPlayerWnd, NULL);
            if(FAILED(hr))
                return -1;
        }
    }
    
    /**/
     BOOL bResult = m_MyPlayer.OpenFile((wchar_t *)wsFileName.c_str());
     if(!bResult)
         return -1;
    
    double dbDuration = 0.0;
    HANDLE hEventOpen = m_MyPlayer.GetEventOpen();
    BOOL fQuit = SyncWaitEventAndMessage(hEventOpen);
    if(fQuit)
        dbDuration = m_MyPlayer.GetDuration()/1000.0; // unit: second.
    else
        dbDuration = -1;

    return dbDuration;
}
startPlayback就是这样的一个函数。
可是,当我将上述代码放置到一个ocx控件中的时候,OnOpenSucceeded得不到执行。请问,为什么??
离线hinacom

只看该作者 地板  发表于: 2017-04-26
回 hinacom 的帖子
hinacom:谢谢回复。和我想的一样。
BOOL CAPlayerDemoDlg::SyncWaitEventAndMessage(HANDLE hEventTarget)
{
    if (hEventTarget == NULL)
....... (2017-04-26 18:30) 

下面是打开文件操作:
BOOL CMyPlayer::OpenFile(wchar_t * szFileName)
{
    if (m_pAPlayer == NULL || szFileName == NULL )
    {
        return FALSE;
    }

    BOOL bResult = FALSE;
    HRESULT hr = m_pAPlayer->Open(szFileName);
    if(SUCCEEDED(hr))
    {
        bResult = TRUE;
        ::ResetEvent(m_hEventOpen);
        m_bFinished = false;
    }
    else
        bResult = FALSE;

    DWORD dwID = GetCurrentThreadId();
    return bResult;
}
下面是事件处理函数:
HRESULT CMyPlayer::OnOpenSucceeded()
{
    //::PostMessage(m_hDlg, WM_OPEN_SUCCEEDED, (WPARAM)0, (LPARAM)0);
    DWORD dwID = GetCurrentThreadId();
    m_nDuration = m_pAPlayer->GetDuration();
    ::SetEvent(m_hEventOpen);
    return S_OK;
}
离线hinacom

只看该作者 4楼 发表于: 2017-04-26
好像,在打开媒体文件之后,就能够得到文件的播放时长。可否提供一个这样的函数?
离线aplayer

只看该作者 5楼 发表于: 2017-04-26
回 hinacom 的帖子
hinacom:好像,在打开媒体文件之后,就能够得到文件的播放时长。可否提供一个这样的函数? (2017-04-26 18:36) 

正如前面所说,Open函数返回后并不能立即得到播放时长,需要等OpenSuccess返回才能获取到。另外要注意处理打开失败的情况即状态变成 PS_READY 的情况,否则 GetMessage 循环会一直跳不出。
离线hinacom

只看该作者 6楼 发表于: 2017-04-28
回 aplayer 的帖子
aplayer:正如前面所说,Open函数返回后并不能立即得到播放时长,需要等OpenSuccess返回才能获取到。另外要注意处理打开失败的情况即状态变成 PS_READY 的情况,否则 GetMessage 循环会一直跳不出。 (2017-04-26 19:36) 

当我将上述代码放置到一个ocx控件中的时候,OnOpenSucceeded得不到执行。请问,为什么??
离线hinacom

只看该作者 7楼 发表于: 2017-05-02
关于APlayer媒体播放引擎授权协议中的有关问题请给予答复

aplayer版主:你好!
我想获得授权,关于授权协议,有些疑惑,下面列出我的问题:
1、授权期限问题。授权期限,是由乙方申请人自行填写,还是由甲方授权人来填写?
2、乙方的权利义务。第6.1条规定,乙方在3.1.2条所述产品享有完整的知识产权以及该产品属于非商业性产品。从前面的“授权合作”内容来看,迅雷对商业性产品也是有授权意向的,否则关于授权期限的内容中不会出现“如乙方自身开发的产品为商业性产品,则授权期限为  年,自        年   月    日到        年    月    日”这样的内容。我方开发的是商业性产品,希望也能够得到免费授权。
3、乙方权利义务。第6.2条规定,不删除任何包含用在迅雷播放器控件API里的任何模块包括但不限于————————。这里需要填写部分不太明确。比如说,APlayer有些不需要的编解码库,我们可能要删除。

请给予回答。
谢谢。
离线aplayer

只看该作者 8楼 发表于: 2017-05-04
回 hinacom 的帖子
hinacom:aplayer版主:你好!
我想获得授权,关于授权协议,有些疑惑,下面列出我的问题:
1、授权期限问题。授权期限,是由乙方申请人自行填写,还是由甲方授权人来填写?
2、乙方的权利义务。第6.1 .. (2017-05-02 14:49) 

删除解码器没关系。
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个