2016-07-05 5 views
0

(я не свободно на английском я постараюсь сделать все возможное)Декодирование логика петли из 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.

ответ