Qt+FFmpeg编解码之后写入到rtsp流文件中,可以运行。在解析过程中报错。
[h264 @ 000001d50b418340] non-existing PPS 1 referenced
[h264 @ 000001d50b418340] decode_slice_header error
[h264 @ 000001d50b418340] non-existing PPS 3 referenced
[h264 @ 000001d50b418340] decode_slice_header error
[h264 @ 000001d50b418340] reference count overflow
[h264 @ 000001d50b418340] decode_slice_header error
[h264 @ 000001d50b418340] no frame!
源码
while (av_read_frame(InputFormatContext,InputPacket) >= 0) {
if(InputPacket->stream_index == InputVideoStream){
//重新编解码
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;
frame->time_base = InputFrame->time_base;
//时间戳递增
timeStamp++;
qDebug()<<"时间戳"<<timeStamp;
//再次编码
ret = avcodec_send_frame(againCodecContext,frame);
if(ret<0){
av_strerror(ret,errorStr,sizeof(errorStr));
qDebug()<<"打开编码器失败"<<QString(errorStr)<<ret;
qDebug()<<"avcodec_send_frame失败"<<ret;
return;
}
while (ret>=0) {
ret = avcodec_receive_packet(againCodecContext, out_pkt);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){
av_strerror(ret,errorStr,sizeof(errorStr));
qDebug()<<"编码失败"<<QString(errorStr)<<ret;
break;
}else if (ret < 0) {
qDebug()<<"编码失败";
return;
}
ret = av_interleaved_write_frame(OutputFormatContext, out_pkt);
qDebug()<<"向RTSP中写入视频帧"<<ret<<"data的大小"<<out_pkt->size;
if (ret < 0) {
qDebug()<<"写入视频帧失败"<<ret;
return;
}
}
}
}
}