微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

低音lib用于解码单声道mp3

如何解决低音lib用于解码单声道mp3

我使用低音提琴库(Un4seen)解码音频。一切正常,但现在我有一个带单声道的mp3,并且最终创建的输出基础是播放器的两倍速度。可能有些问题。

我当前正在使用:

    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,BASS_STREAM_DECODE | BASS_UNICODE);
#else
        g_BassHandle = _BASS_StreamCreateFile(false,(const char*)m_strFileName,BASS_STREAM_DECODE);
#endif
#else
        g_BassHandle = _BASS_StreamCreateFile(false,m_strFileName.GetAsUtf8(),BASS_STREAM_DECODE);
#endif
        

        
        try
        {
            //m_BuffLens interessiert mich nicht.
            m_nBuffLens = new size_t[BUFNUM];
            memset(m_nBuffLens,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,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,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,NULL)

输出始终为44.1和立体声。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。