FFmpeg7中使用avcodec_send_frame()失败,返回值为-22
报错输出:
avcodec_send_frame失败 -22
源码:
againCodec = avcodec_find_decoder(InputFrame->codecpar->codec_id);
if(!againCodec){
qDebug()<<"查找二次编码解码器失败";
return;
}
againCodecContext = avcodec_alloc_context3(againCodec);
if(!againCodecContext){
qDebug()<<"保存二次编码解码器信息失败";
return;
}
if(avcodec_parameters_to_context(againCodecContext,InputFrame->codecpar)){
qDebug()<<"保存编码器失败";
return;
}
if(avcodec_open2(againCodecContext,againCodec,NULL)<0){
qDebug()<<"打开编码器失败";
return;
}
while (av_read_frame(InputFormatContext,InputPacket) >= 0) {
if(InputPacket->stream_index == InputVideoStream){
//自定义时间戳
// InputPacket->pts = 0;
// InputPacket->dts = InputPacket->pts;
//重新编解码
int ret = avcodec_send_packet(OutputCodecContext,InputPacket);
if(ret < 0){
qDebug()<<"发送数据包失败";
return;
}
while (ret >= 0) {
AVFrame *frame;
frame = av_frame_alloc();
AVPacket *out_pkt = av_packet_alloc();
ret = avcodec_receive_frame(OutputCodecContext,frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){
break;
}else if (ret < 0) {
qDebug()<<"结束解码后的数据包失败";
return;
}
frame->pts = timeStamp;
//时间戳递增
timeStamp++;
qDebug()<<"时间戳"<<timeStamp;
//再次编码
ret = avcodec_send_frame(againCodecContext,frame);
if(ret<0){
qDebug()<<"avcodec_send_frame失败"<<ret;
return;
}
while (ret>0) {
ret = avcodec_receive_packet(againCodecContext, out_pkt);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){
break;
}else if (ret < 0) {
qDebug()<<"编码失败";
return;
}
ret = av_interleaved_write_frame(OutputFormatContext, out_pkt);
if (ret < 0) {
qDebug()<<"写入视频帧失败";
return;
}
}
}
}
}
调试查看againCodecContext和frame