使用C++,SDL2,SDL2_mix,ffmpeg2。SDL2 + ffmpeg2間歇性點擊而非音頻
Inited 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);
混合。有趣的是m_audioCodecContext->channels == 2
,當我的回調被稱爲_len = 16384
。不知道該怎麼做。請幫忙!!!
什麼是ffmpeg2? – rogerdpack
最新版本。花了將近一個小時才發現:dranger教程不能很好地適用於最新的ffmpeg庫,因爲一些defs和方法已經被廢棄了,現在可以用avcodec_decode_audio4方法取代大量的代碼...如果我理解正確的話。要點是 - 我做了一些搜索,以找出如何使東西幾乎工作。這是我第一次使用音頻( – FertoVordalastr