【发布时间】:2014-02-16 00:13:17
【问题描述】:
使用 c++、SDL2、SDL2_mix、ffmpeg2。
使用回调初始化 SDL2_mix
Mix_HookMusic(MusicPlayer, &g_audioPos);
通过此代码将音频从 ogg 解码到 AVFrame*:
while(av_read_frame(m_formatContext, &m_packet) >= 0)
{
if(m_packet.stream_index == m_audioStream)
{
int audio_frame_finished;
avcodec_decode_audio4(m_audioCodecContext, m_audioFrame, &audio_frame_finished, &m_packet);
if(!audio_frame_finished)
{
continue;
}
}
}
在这段代码之后,我有一些 m_audioFrame->data[0] 和 m_audioFrame->linesize[0] == 4096 的框架
偶尔会调用我的回调:
void MusicPlayer(void *_udata, Uint8 *_stream, int _len)
{
if(!g_audioData)
{
return;
}
AudioData* audio = reinterpret_cast<AudioData*>(g_audioData);
if(!audio || audio->Frame->linesize[0] == 0)
{
return;
}
SDL_memcpy((Uint8*)audio->Data + audio->Pos, (Uint8*)audio->Frame->data[0], audio->Frame->linesize[0]);
audio->Pos+= audio->Frame->linesize[0];
int rest = g_chunkSize - audio->Pos;//frame->linesize[0];
if(rest <= 0)
{
SDL_memcpy(_stream, audio->Data, _len);
audio->Pos = 0;
*(int*)_udata += _len;
}
}
_len == 8192,所以我必须推动 2 帧来填充流,但我得到的只是 - 在我的扬声器中点击。我做错了什么?
PS:尝试使用Mix_OpenAudio(m_audioCodecContext->sample_rate, AUDIO_S16SYS, m_audioCodecContext->channels, 4096); 重新打开 MIX。有趣的是m_audioCodecContext->channels == 2,当我的回调被称为_len = 16384。不知道该怎么做。请帮忙!!!
【问题讨论】:
-
最新版本。花了将近一个小时才弄清楚:danger教程不适用于最新的ffmpeg lib,因为一些defs和方法已被弃用,而且 - 现在可以用avcodec_decode_audio4方法替换相当大的代码块......如果我理解正确的话。重点是-我做了一些搜索以了解如何使事情几乎正常工作。这是我第一次使用音频(