Декодирование логики цикла от matroska (mkv, webm) к аудио (C++ через libvorbis)

(Я не говорю по-английски, я постараюсь сделать все возможное)

Я пытаюсь закодировать (C++) простой проигрыватель MKV. Я очень новичок в этом вопросе, поэтому я поняла все, что мне нужно, понемногу. Для начала я использую кодек VP8 для видео и Vorbis для аудио. С видео стороны пока все в порядке, но у меня проблемы со звуком.

Я не могу понять логику петли для декодирования аудио кадров, которые я получаю из mkvparser с помощью libvorbis. Я посмотрел на этот образец и это краткое объяснение, но не смог заставить его работать в моем случае. И я не нашел других простых примеров.

Вот кусок моего кода:

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.

1 ответ

https://matroska.org/technical/specs/codecid/index.html
в разделе A_VORBIS Личные данные содержат первые три пакета Vorbis по порядку....

и кодек частный здесь
https://matroska.org/technical/specs/index.html
"CodecPrivate 3 [63] [A2]"

Другие вопросы по тегам