(我的英語不流利,我會盡力做到最好)解碼循環邏輯音頻
我嘗試代碼(C++)一個簡單的MKV播放器。我在這個主題上很新,所以我發現我一點一點需要。首先,我使用VP8編解碼器進行視頻,並使用Vorbis進行音頻處理。 視頻方面現在看起來不錯,但我遇到了音頻問題。
我想不通的循環邏輯音頻幀我從mkvparser與libvorbis解碼。 我仰望this sample和this brief explanation,但無法設法使它在我的情況下工作。我沒有找到其他簡單的例子。
這裏是我的代碼塊:音頻
const mkvparser::Block* const pBlock = m_pMkvContext->pBlockEntry->GetBlock();
const mkvparser::Track* const pTrack = m_pMkvContext->pTracks->GetTrackByNumber((unsigned long)pBlock->GetTrackNumber());
if (pTrack != NULL)
{
const long long trackType = pTrack->GetType();
const int frameCount = pBlock->GetFrameCount();
if (frameCount > 0)
{
const mkvparser::Block::Frame& oFrame = pBlock->GetFrame(0);
unsigned char* pData = (unsigned char*)malloc((size_t)oFrame.len);
oFrame.Read(&m_pMkvContext->oReader, pData);
if (trackType == mkvparser::Track::kVideo)
{
// i'm ok here
}
else if (trackType == mkvparser::Track::kAudio)
{
// what to do here with my audio frame data ?
}
free(pData);
}
}
也許我得到幀的方式是很好的視頻,而不是......
你們是否知道一些好的資源共享關於它?或者一些建議?
感謝您的幫助!
[編輯]:我忘了補充我的嘗試之一:
bool MoviePlayer::DecodeAudioData(unsigned char* pData, uint32 iSize)
{
int ret;
char* pBuffer = NULL;
pBuffer = ogg_sync_buffer(&m_pOVContext->oOggSyncState, iSize);
memcpy(pBuffer, pData, iSize);
ogg_sync_wrote(&m_pOVContext->oOggSyncState, iSize);
ret = ogg_sync_pageout(&m_pOVContext->oOggSyncState, &m_pOVContext->oOggPage);
ret = ogg_stream_init(&m_pOVContext->oOggStreamState, ogg_page_serialno(&m_pOVContext->oOggPage));
ret = ogg_stream_pagein(&m_pOVContext->oOggStreamState, &m_pOVContext->oOggPage);
int iPacketsCount = ogg_page_packets(&m_pOVContext->oOggPage);
for (int i = 0; i < iPacketsCount; ++i)
{
ret = ogg_stream_packetout(&m_pOVContext->oOggStreamState, &m_pOVContext->oOggPacket);
// do something with the packet...
}
return true;
}
它崩潰的ogg_sync_pageout,因爲我ogg_page不正確初始化。 但是,不是來自正確的.ogg文件,如我發現的例子,我不知道如何正確初始化vorbis結構。