解码循环逻辑从matroska (mkv, webm)到音频(c++通过libvorbis)
Decoding loop logic from matroska (mkv, webm) to audio (C++ via 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结构。
https://matroska.org/technical/specs/codecid/index.html
在A_VORBIS部分私有数据按顺序包含前三个Vorbis数据包....
编解码器private在这里
https://matroska.org/technical/specs/index.html
"CodecPrivate 3 [63][A2]"
相关文章:
- 用c++阅读音频
- 为什么这个音频包络不能通过开关的情况?
- FFMpeg库:如何在音频文件中精确查找
- 需要反转音频步进公式
- 如何在音频处理中使用超能力时间拉伸类
- C++新手,想知道如何使用VS code 2019播放音频文件
- 如何暂停插孔音频客户端
- 如何以编程方式将音频从任何录制设备路由到任何播放设备
- 将音频从浏览器流式传输到WebRTC本机C++应用程序
- 使用IMFSourceReader(Microsoft媒体基金会)进行音频流传输
- 大声音频无法播放
- 让 iaxClient 将音频发送到缓冲区而不是音频设备/从缓冲区获取音频
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 波形音频 - waveOutWrite 发出断断续续的声音
- WASAPI 共享模式:音频引擎预期的振幅是多少?
- 在Win7上,在默认端点上轮询音频会话有时会崩溃
- 媒体基金会:WavSink以比实时消耗率更快的速度处理音频-是否可以实时限制后台处理
- PJSUA在两个或多个不同的音频声卡之间切换
- 当直接渲染到WASAPI时,两个流中的一个流没有音频输出
- FFmpeg av_read_frame从音频流返回数据包