(я не свободно на английском я постараюсь сделать все возможное)Декодирование логика петли из Matroska (MKV, WebM) аудио (C++ с помощью libvorbis)
Я пытаюсь код (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);
}
}
А может быть, как я получаю кадры хорош для видео, а не для аудио ...
ли вы, ребята, знаете, некоторые хорошие ресурсы для обмена об этом? Или какие-то советы?
Спасибо за помощь!
[EDIT]: Я забыл добавить одну мою попытку:
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.