EasyPlayerPro windows播放器之多窗口播放音量控制方法

EasyPlayerPro-win基礎版本的音頻播放爲單一通道播放,即同一時間僅容許一個通道播放聲音,現應客戶需求,在基礎版本上實現獨立的音頻播放,即每一個通道可同時播放視頻和音頻;git

EasyPlayerPro windows播放器

設計思路

將音頻播放類DirectSoundPlayer移到每一個播放通道中, 取消以前的音頻通道關係判斷; 音量控制類保持不變;github

DirectSoundPlayer 實現

  1. 打開音頻播放設備 Open(WAVEFORMATEX *pWaveFormatEx);
  2. 調用開始播放;
  3. 將音頻數據寫入隊列;
  4. 播放線程從隊列中讀取數據開始播放;
  5. 調用中止播放;
  6. 關閉音頻播放設備;

注: 在沒有聲音數據時,需填充爲靜音數據. 不然會一直播放最後一幀的音頻; windows

播放數據填充代碼以下:  

while (1)
{
    if (pDirectSoundObj->flag == 0x03)          break;


    if ( (res >= WAIT_OBJECT_0) && (res < WAIT_OBJECT_0+DIRECT_SOUND_BUFFER_NUM) )
    {
        pDirectSoundObj->audioFrameNum = BUFQUE_GetFrameNum(pDirectSoundObj->buffQueue, consumerHandle, BUFFER_TYPE_AUDIO);

        unsigned char *pbuf = NULL, *pbuf2=NULL;
        DWORD buflen = 0, buflen2=0;

        HRESULT hr = pDirectSoundObj->pDirectSoundBuffer8->Lock(offset, pDirectSoundObj->packetSize, (LPVOID*)&pbuf, &buflen, (LPVOID*)&pbuf2, &buflen2, 0);
        if (DSERR_BUFFERLOST == hr)
        {
            pDirectSoundObj->pDirectSoundBuffer8->Restore();
            hr = pDirectSoundObj->pDirectSoundBuffer8->Lock(offset, pDirectSoundObj->packetSize, (LPVOID*)&pbuf, &buflen, (LPVOID*)&pbuf2, &buflen2, 0);
        }


        if (buflen > 0)
        {
            int ret = BUFQUE_GetData(pDirectSoundObj->buffQueue, consumerHandle, NULL, &bufferType, NULL, NULL, &sourceBuff.bufpos, sourceBuff.pbuf, 0x01);
            if ( (ret == 0x00) && (buflen == sourceBuff.bufpos) )
            {
                memcpy(pbuf, sourceBuff.pbuf, sourceBuff.bufpos);

                if (buflen2 > 0)
                {
                    ret = BUFQUE_GetData(pDirectSoundObj->buffQueue, consumerHandle, NULL, &bufferType, NULL, NULL, &sourceBuff.bufpos, sourceBuff.pbuf, 0x01);
                    if (ret == 0x00 && buflen2 == sourceBuff.bufpos)
                    {
                        memcpy(pbuf2, sourceBuff.pbuf, sourceBuff.bufpos);
                    }
                }
            }
            else
            {
                memset(pbuf, 0x00, buflen);     //填充爲靜音
            }

            pDirectSoundObj->pDirectSoundBuffer8->Unlock(pbuf, buflen, pbuf2, buflen2);
        }

        offset += (buflen+buflen2);
        if (offset >= pDirectSoundObj->directSoundBufferDesc.dwBufferBytes) offset = 0;
    }



    ....
}

關於EasyPlayerPro

EasyPlayerPro是一款全功能的流媒體播放器,支持RTSP、RTMP、HTTP、HLS、UDP、RTP、File等多種流媒體協議播放、支持本地文件播放,支持本地抓拍、本地錄像、播放旋轉、多屏播放、倍數播放等多種功能特性,核心基於ffmpeg,穩定、高效、可靠、可控,支持Windows、Android、iOS三個平臺,目前在多家教育、安防、行業型公司,都獲得的應用,廣受好評!服務器

EasyPlayerPro:https://github.com/EasyDSS/EasyPlayerPromarkdown

點擊連接加入羣【EasyPlayer & EasyPlayerPro】:544917793插件

技術支持

獲取更多信息

EasyDarwin開源流媒體服務器:www.EasyDarwin.orgcode

EasyDSS商用流媒體解決方案:www.EasyDSS.comorm

EasyNVR無插件直播方案:www.EasyNVR.com

Copyright © EasyDarwin Team 2012-2017

EasyDarwin

相關文章
相關標籤/搜索