Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ffmpeg资源暂时不可用_C_Ffmpeg_Libav_Opus - Fatal编程技术网

C ffmpeg资源暂时不可用

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 , (

我正在尝试使用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 , (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,可能会解决这个问题相同的错误,你是如何解决的?