调用av_read_frame时,
报错 [rtsp @ 000001c7b34f0240] max delay reached. need to consume packet
[rtsp @ 000001c7b34f0240] RTP: missed 116 packets,但是返回值是0,
这种情况下画面会花屏,
确认是网络波动引起的,可以丢包,但是不能花屏
DTS的值和PTS的值是相同的,
用VLC查看同一个视频流地址,是没有花屏的现象的
调用av_read_frame时,
报错 [rtsp @ 000001c7b34f0240] max delay reached. need to consume packet
[rtsp @ 000001c7b34f0240] RTP: missed 116 packets,但是返回值是0,
这种情况下画面会花屏,
确认是网络波动引起的,可以丢包,但是不能花屏
DTS的值和PTS的值是相同的,
用VLC查看同一个视频流地址,是没有花屏的现象的
以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:
在使用 FFmpeg 库处理视频流时遇到的问题确实比较复杂,以下是一些可能的解决方案和建议:
max delay reached
错误通常是因为解码器需要更多的数据来解码当前帧,但数据没有及时到达。这可能是由于网络延迟或丢包造成的。avcodec_parameters_to_context
函数设置解码器的参数,增加 rc_buffer_size
值。av_frame_set_best_effort_timestamp
函数调整时间戳。av_frame_set_pts
和 av_frame_set_pkt_dts
函数设置时间戳。以下是一些示例代码,展示如何调整 FFmpeg 的参数和处理时间戳:
// 设置解码器参数
AVCodecParameters *codecpar = avcodec_parameters_alloc();
codecpar->rc_buffer_size = 1024 * 1024; // 增加缓冲区大小
// 打开解码器
AVCodec *codec = avcodec_find_decoder(codecpar->codec_id);
AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);
if (avcodec_open2(codec_ctx, codec, NULL) < 0) {
fprintf(stderr, "Could not open codec.\n");
exit(1);
}
// 读取帧
AVPacket pkt;
AVFrame *frame = av_frame_alloc();
while (av_read_frame(ic, &pkt) >= 0) {
// 解码帧
if (avcodec_send_packet(codec_ctx, &pkt) < 0) {
fprintf(stderr, "Failed to send packet to decoder.\n");
exit(1);
}
if (avcodec_receive_frame(codec_ctx, frame) < 0) {
fprintf(stderr, "Failed to receive frame from decoder.\n");
exit(1);
}
// 调整时间戳
av_frame_set_best_effort_timestamp(frame, pkt.pts);
av_frame_set_pkt_dts(frame, pkt.dts);
// 显示帧
// ...
}
// 释放资源
av_frame_free(&frame);
avcodec_free_context(&codec_ctx);
avcodec_parameters_free(&codecpar);
这些只是基本的示例,具体实现可能需要根据你的应用场景和需求进行调整。希望这些建议能帮助你解决问题!