[英]av_free crashes application randomly - FFMPEG C++
我正在尝试创建一个简单的媒体播放器来介绍ffmpeg的世界,问题是每次我调用av_freep(void*ptr)
,应用程序都会崩溃。
如果我不调用av_freep
发生内存泄漏,并且程序使用的内存增加到1000MB(已测量),下面是代码:
int16_t* audioBuffer=(int16_t*)av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE+FF_INPUT_BUFFER_PADDING_SIZE);
if(!audioBuffer){
MessageBox(0,"Error allocating in audioBuffer","Error: Mem",MB_ICONWARNING | MB_OK);
return -1;
}
int sz = MEDIA->DecodeAudioFrame((void*)audioBuffer,0);
Pa_WriteStream(MEDIA->output_stream,(int16_t*)audioBuffer,MEDIA->_audio_ccontext->frame_size);
av_freep(audioBuffer);
这是我的“ DecodeAudioFrame”功能代码:
int WbMedia::DecodeAudioFrame(void *audio_buf, int buf_size){
static AVFrame frame;
static AVPacket pkt;
static uint8_t *audio_pkt_data = NULL;
static int audio_pkt_size = 0;
int len1=0;
for(;;){
bool do_rt = false;
while(audio_pkt_size > 0){
int obt_frame = 0;
len1 = avcodec_decode_audio4(_audio_ccontext,&frame,&obt_frame,&pkt);
if(len1 < 0){
audio_pkt_size = 0;
break;
}
audio_pkt_data+=len1;
audio_pkt_size-=len1;
if(obt_frame){
data_size = av_samples_get_buffer_size(frame.linesize,channel_count,sample_fr,_audio_ccontext->sample_fmt,1);
memcpy(audio_buf,frame.data[0],data_size);
}
if(data_size < 0){
continue;
}
if(pkt.data){
av_free_packet(&pkt);
}
return data_size;
}
if(pkt.data){
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;
}
我需要有关此问题的帮助,我不知道这是错误还是需要做的事情。 那里发生了什么事? 为什么在av_freep
调用时崩溃? 我该如何解决?
谢谢
av_freep
一个指向您要释放的指针的指针 ; 然后将释放的指针设置为NULL
。 因此,您需要将其用作
av_freep(&audioBuffer);
或者,您可以使用
av_free(audioBuffer);
audioBuffer = NULL;
这是等效的。
int16_t* audioBuffer=(int16_t*)av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE+FF_INPUT_BUFFER_PADDING_SIZE);
错了 不建议使用AVCODEC_MAX_AUDIO_FRAME_SIZE
(在新版本中已删除)。 使用新的解码API,您可以获得比此更大的解码帧。
static AVFrame frame;
否。请勿在堆栈上分配AVFrame,否则它将损坏。 使用avcodec_alloc_frame()
(或将av_frame_alloc()
与新版本一起使用)。
data_size = av_samples_get_buffer_size(frame.linesize,channel_count,sample_fr,_audio_ccontext->sample_fmt,1);
您意识到自己正在写原始的帧线宽(也就是平面尺寸),对吗? 我想知道这是否是故意的。
另外, sample_fr
是什么? 那是某个地方的常数吗? 只需使用AVFrame.nb_samples。
最后,您的代码显然假定为交错音频(即,在一个缓冲区中交错的所有通道的音频样本)。 现在,许多解码器输出平面音频(即,每个通道的样本在单独的缓冲区中)。 这可能是导致崩溃的原因,因为av_samples_get_buffer_size
计算所有通道中所有样本的总大小,而data[0]
仅包含第一个通道的样本。
如果确实是平面音频,则应该修改代码以支持它,或者使用libavresample将平面转换为交错
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.