0

我使用低音库(Un4seen)来解码音频。一切正常,但现在我有一个带单声道的 mp3,最终输出 bas 创建是播放器的两倍速度。可能有些事情是错误的。

我目前使用:

    bool CDecoder::Init(size_t nBlockSize)
    {
        assert(nBlockSize > 0);
        
        m_pEmptySemaphore->AddWaiter(&m_cWaiter);
        m_pFullSemaphore->AddWaiter(&m_cWaiter);
        m_pFinishEvent->AddWaiter(&m_cWaiter);
        m_pStopEvent->AddWaiter(&m_cWaiter);
        m_pTrackFinishEvent->AddWaiter(&m_cWaiter);
        
        
        m_bNoBuf = true;
        m_CurBufBytes = 0;
        m_nWrite = 0;
        m_nRead = 0;
        m_nBufSize = nBlockSize;
        m_pBufferPercent = 0;

        if (g_BassHandle)
        {
            _BASS_ChannelStop(g_BassHandle);
            _BASS_StreamFree(g_BassHandle);
            g_BassHandle = 0;
        }
        

        if (!_BASS_Init(-1, 44100, BASS_DEVICE_STEREO , NULL, NULL)) {
            if (_BASS_ErrorGetCode() != BASS_ERROR_ALREADY) {
                return false;
            }
        }

      


#ifdef WIN32
#ifdef _UNICODE     
        g_BassHandle = _BASS_StreamCreateFile(false, (const WCHAR*)m_strFileName, 0, 0, BASS_STREAM_DECODE | BASS_UNICODE);
#else
        g_BassHandle = _BASS_StreamCreateFile(false, (const char*)m_strFileName, 0, 0, BASS_STREAM_DECODE);
#endif
#else
        g_BassHandle = _BASS_StreamCreateFile(false, m_strFileName.GetAsUtf8(), 0, 0, BASS_STREAM_DECODE);
#endif
        

        
        try
        {
            //m_BuffLens interessiert mich nicht.
            m_nBuffLens = new size_t[BUFNUM];
            memset(m_nBuffLens, 0, sizeof(size_t)*BUFNUM);
            m_pBuffer = new BYTE[BUFNUM*m_nBufSize];
        }
        catch(...)
        {
            Deinit();
            return false;
        }
        
        return true;
    }
    
#ifdef WIN32
    BOOL PeekAndPump2()
    {
        MSG msg;
        while (::PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
        }
        
        return TRUE;
    }
#endif

//decode:
bool CDecoder::DecodeFrame(BYTE *pcmdata, size_t nSize, size_t &nRealSize)
    {
        std::vector<KEvent *> vWaitObjects(1);
        //vWaitObjects[0] = m_pFullSemaphore;
        vWaitObjects[0] = m_pFinishEvent;
        
        //Hier hängt er, er wartet auf etwas.
        
#ifdef WIN32
        PeekAndPump2();
#endif
        
       
            //get a buffer
            //
            /*
            if (nSize > m_nBuffLens[m_nRead])
                nSize = m_nBuffLens[m_nRead];
             */
            
            //BYTE* pBuf;
            //RETURN VALUE IST BYTES WRITTEN ZUM BUFFER
            //AM Ende sind die Bytes die gebraucht werden.
        
            //Das Handle ist auf einmal weg
        
            int pos=_BASS_ChannelGetPosition(g_BassHandle,BASS_POS_BYTE);
        
            DWORD result = _BASS_ChannelIsActive(g_BassHandle);
            if(result==BASS_ACTIVE_STOPPED){
                return false;
            }
            int cSize = _BASS_ChannelGetData(g_BassHandle,m_pBuffer,nSize/*BUFNUM*m_nBufSize   20000*/);
            
            //BYTE* pBuf = m_pBuffer + m_nBufSize * m_nRead;
        
            if(cSize!=-1){
                memcpy(pcmdata, m_pBuffer, cSize);
                nRealSize = cSize;
                return true;
            }
            return false;
            
            //m_pFullSemaphore->Increase(1);
            
            /*
            if (nSize == m_nBuffLens[m_nRead])
            {
                m_nRead = (m_nRead + 1) % BUFNUM;
                m_pEmptySemaphore->Increase(1);
            }
            else
            {
                m_nBuffLens[m_nRead] -= nSize;
                
                memcpy(pBuf, m_pBuffer + cSize, m_nBuffLens[m_nRead]);
                m_pFullSemaphore->Increase(1);
            }
             */
    }

在我添加后BASS_SAMPLE_FLOAT,最终音频的速度很好,但音频在流中具有“swoosh”信号。如果我使用立体声(2 声道)音频效果很好,只是在单声道流上它会失败。在单声道文件的情况下我错过了什么?我期望与

_BASS_Init(-1, 44100, BASS_DEVICE_STEREO , NULL, NULL)

输出始终为 44.1 和立体声。

4

0 回答 0