C ffmpeg资源暂时不可用
我正在尝试使用ffmpeg库和Opus编解码器对音频帧进行编码 但我面临着这个错误:C ffmpeg资源暂时不可用,c,ffmpeg,libav,opus,C,Ffmpeg,Libav,Opus,我正在尝试使用ffmpeg库和Opus编解码器对音频帧进行编码 但我面临着这个错误: 资源暂时不可用 我的源代码: void encode_audio(uint8_t *frame , int frame_size , void (*onPacket)(uint8_t *packet , int packet_size)){ if(audio_encoder_codec_context != NULL){ memset(audio_encoder_frame_buffer , 0 , (
资源暂时不可用
我的源代码:
void encode_audio(uint8_t *frame , int frame_size , void (*onPacket)(uint8_t *packet , int packet_size)){
if(audio_encoder_codec_context != NULL){
memset(audio_encoder_frame_buffer , 0 , (size_t) audio_encoder_frame_size);
swr_convert(
s16_to_flt_resampler,
&audio_encoder_frame_buffer,
audio_encoder_frame_size,
(const uint8_t **) &frame,
frame_size
);
int result = avcodec_send_frame(audio_encoder_codec_context , audio_encoder_frame);
while(result >= 0){
result = avcodec_receive_packet(audio_encoder_codec_context , audio_encoder_packet);
char *a = malloc(1024);
av_strerror(result , a , 1024);
printf("%s\n",a);
if (result == AVERROR(EAGAIN) || result == AVERROR_EOF || result < 0){
break;
}
onPacket(audio_encoder_packet->data , audio_encoder_packet->size);
av_packet_unref(audio_encoder_packet);
}
}
}
void encode_音频(uint8_t*帧,int帧大小,void(*onPacket)(uint8_t*包,int包大小)){
if(音频编码器编解码器上下文!=NULL){
memset(音频编码器帧缓冲区,0,(大小)音频编码器帧大小);
swr_转换(
s16至flt再采样器,
&音频编码器帧缓冲区,
音频编码器帧大小,
(const uint8_t**)和框架,
框架尺寸
);
int result=avcodec\u send\u frame(音频编码器\u编解码器\u上下文,音频编码器\u frame);
而(结果>=0){
结果=avcodec_接收_数据包(音频_编码器_编解码器_上下文,音频_编码器_数据包);
char*a=malloc(1024);
av_strerror(结果,a,1024);
printf(“%s\n”,a);
if(result==AVERROR(EAGAIN)| | result==AVERROR_EOF | | result<0){
打破
}
onPacket(音频编码器包->数据,音频编码器包->大小);
av_数据包_unref(音频编码器_数据包);
}
}
}
这是来自averor(EAGAIN)
当averor(EAGAIN)
返回时,您应该发送更多帧
文档为avcodec\u receive\u数据包说明了这一点
avcodec.h:
/**
*从编码器读取编码数据。
*
*@param avctx编解码器上下文
*@param avpkt这将被设置为由
*编码器。请注意,该函数将始终调用
*av_数据包_unref(avpkt),然后再执行其他操作。
*@成功返回0,否则返回负错误代码:
*AVERROR(EAGAIN):输出在当前状态下不可用-用户
*必须尝试发送输入
*AVERROR_EOF:编码器已完全刷新,将出现错误
*没有更多的输出数据包
*AVERROR(EINVAL):编解码器未打开,或者是解码器
*其他错误:合法编码错误
*/
int avcodec_receive_packet(AVCodecContext*avctx,AVPacket*avpkt);
根据数据的不同,FFmpeg在生成输出之前可能需要额外的输入/数据
更多来自文档:
averor(EAGAIN):输出在当前状态下不可用-用户必须尝试发送输入。
继续提供数据,直到您得到返回码0(成功)。您找到解决方法了吗?我面临着一个类似的问题,将一个帧编码为从Opus解码的AAC。我使用的是Ffmpeg 3.1.2,我无法解决这个问题,你可以使用Ffmpeg 4.0,可能会解决这个问题相同的错误,你是如何解决的?