我使用低音库(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 和立体声。