如何解决低音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 举报,一经查实,本站将立刻删除。