(我的英语不流利,我会努力做到最好)
我尝试编写(C ++)一个简单的mkv播放器。我是这个主题的新人,所以我发现我需要的一点一点。首先,我使用VP8编解码器用于视频,使用Vorbis用于音频。 视频方面现在似乎还可以,但我的音频问题。
我无法找出循环逻辑来解码我使用 libvorbis 从 mkvparser 获得的音频帧。 我向上看了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 );
}
}
也许我得到帧的方式对于视频而言并不适合音频......
你们知道一些很好的资源可以分享吗?还是一些建议?
感谢您的帮助!
[编辑]:我忘记添加一个尝试:
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结构。
答案 0 :(得分:-1)
https://matroska.org/technical/specs/codecid/index.html
在A_VORBIS部分
私有数据按顺序包含前三个Vorbis数据包....
并且编解码器私有在这里
https://matroska.org/technical/specs/index.html
“CodecPrivate 3 [63] [A2]”