我一直在使用 ffmpeg,它工作得很好,但是我遇到了内存泄漏,我按照一些说明来修复它(比如 use av_frame_unref
),所以我需要将 ffmpeg 更新到 1.2 版本。这对我来说很奇怪,因为一切都运行良好,然后,随着更新,应用程序开始在 memcpy 中崩溃。
老实说,我不知道发生了什么,我试图用谷歌搜索但没有答案。感谢您的帮助,这是失败的代码段:
int WbMedia::DecodeAudioFrame(int16_t *audio_buf){
static AVFrame *frame;
static AVPacket pkt;
static uint8_t *audio_pkt_data = NULL;
static int audio_pkt_size = 0;
static bool first_time = true;
if(first_time){
first_time=false;
}
int len1, data_size = 0;
for(;;){
bool do_rt = false;
while(audio_pkt_size > 0){
int obt_frame = 0;
if (!frame) {
if (!(frame = avcodec_alloc_frame())) {
MessageBox(0,"Out of memory error","Error: Memory",MB_ICONWARNING | MB_OK);
return -1;
}
}
len1 = avcodec_decode_audio4(_audio_ccontext,frame,&obt_frame,&pkt);
if(len1 < 0){
audio_pkt_size = 0;
break;
}
if(obt_frame){
data_size = av_samples_get_buffer_size(NULL,channel_count,sample_fr,_audio_ccontext->sample_fmt,1);
memcpy(audio_buf,frame->data[0],data_size);
}
audio_pkt_data+=len1;
audio_pkt_size-=len1;
if(data_size < 0){
continue;
}
return data_size;
}
if(pkt.data){
//MessageBox(0,"hi","Hi",MB_OK); // This is only for test if the app si reaching this av_free_packet
av_free_packet(&pkt);
}
if(do_rt){
return data_size;
}
// Try to get a new packet
if(!audio_packets.empty()){
WaitForSingleObject(Queue_Audio_Mutex,INFINITE);
pkt = *audio_packets.front();
audio_packets.pop();
ReleaseMutex(Queue_Audio_Mutex);
audio_pkt_size = pkt.size;
audio_pkt_data = pkt.data;
}else{
return -1;
}
}
return 0;
}
非常感谢。