gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:36:27 24 4
gpt4 key购买 nike

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

我尝试编写 (C++) 一个简单的 mkv 播放器。我在这个主题上很新,所以我一点一点地发现我需要的一切。一开始,我对视频使用 VP8 编解码器,对音频使用 Vorbis。视频方面目前看起来还不错,但我在音频方面遇到了麻烦。

我无法找出循环逻辑来解码我使用 libvorbismkvparser 获得的音频帧。我抬头看了this samplethis 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 结构。

最佳答案

https://matroska.org/technical/specs/codecid/index.html
在 A_VORBIS 部分私有(private)数据按顺序包含前三个 Vorbis 数据包....

编解码器私有(private)在这里
https://matroska.org/technical/specs/index.html
“编解码器私有(private) 3 [63][A2]”

关于c++ - 从 matroska(mkv、webm)到音频(C++ 通过 libvorbis)的解码循环逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38207823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com