首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解码从matroska (mkv,webm)到音频的循环逻辑(C++通过libvorbis)

解码从matroska (mkv,webm)到音频的循环逻辑(C++通过libvorbis)
EN

Stack Overflow用户
提问于 2016-07-05 15:56:42
回答 1查看 494关注 0票数 0

(我英语不流利,我会尽力的)

我试图编码(C++)一个简单的mkv播放器。我对这门学科很陌生,所以我一点一点地发现了我所需要的一切。首先,我使用VP8编解码器作为视频,沃比斯用于音频。目前,视频方面似乎还不错,但我在音频方面遇到了麻烦。

我无法用libvorbis来解析从the解析器获得的音频帧的循环逻辑。我仰慕这个样本这个简短的解释,但无法在我的情况下使其发挥作用。我没有找到其他简单的例子。

下面是我的代码块:

代码语言:javascript
复制
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 );
    }
}

也许我获取帧的方式对视频和音频都有好处.

你们知道有什么好的资源可以分享吗?或者一些建议?

谢谢你帮忙!

编辑:我忘了添加一个尝试:

代码语言:javascript
复制
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没有被正确初始化。但是,我不知道如何正确初始化vorbis结构,而不是像我在示例中所发现的那样来自正确的.ogg文件。

EN

回答 1

Stack Overflow用户

发布于 2016-07-21 15:48:24

https://matroska.org/technical/specs/codecid/index.html

在A_VORBIS部分,私有数据按顺序包含前三个Vorbis数据包.

编解码器的人在这里

https://matroska.org/technical/specs/index.html

"CodecPrivate 3 63“

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38207823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档