我正在使用ffmpeg处理来自RTSP流的一堆帧。 我对这些帧进行了许多处理,这意味着我并不总是实时地获取数据。如果缓冲区变满,进程将挂起。 我想知道以下哪个解决方案可行/能够解决问题,如果可以,如何使用ffmpeg库实现:
1)如果我遇到挂起的情况,是否有一种清除缓冲区的方法? 我可以确定何时出现挂起,但不知道该怎么解决它。
2)是否有一种使缓冲区覆盖旧数据,只读取最新数据的方法? 如果丢失帧对我来说无关紧要。
3)我已经发现可以使用以下代码将缓冲区任意扩大:
4)这只是我需要与ffmpeg团队提出的错误吗?
5)还有其他没有考虑的方法吗?
1)如果我遇到挂起的情况,是否有一种清除缓冲区的方法? 我可以确定何时出现挂起,但不知道该怎么解决它。
2)是否有一种使缓冲区覆盖旧数据,只读取最新数据的方法? 如果丢失帧对我来说无关紧要。
3)我已经发现可以使用以下代码将缓冲区任意扩大:
av_dict_set(& avd,“buffer_size”,“655360”,0);
。 这可能是一种解决方案,但我不知道需要多大/小的缓冲区,因为我不知道流会发布视频多长时间?4)这只是我需要与ffmpeg团队提出的错误吗?
5)还有其他没有考虑的方法吗?
while(av_read_frame(context, &(packet)) >= 0 && fcount < fps*SECONDS) {
clock_t start, end;
int ret = avcodec_send_packet(codec_context, packet);
if(!(packet->stream_index == video_stream_index)) {
continue;
}
if (ret == AVERROR(EAGAIN) || ret == AVERROR(EINVAL)) {
continue;
} else if (ret < 0) {
cerr << "Error while decoding frame " << fcount << endl;
exit(1);
}
ret = avcodec_receive_frame(codec_context, frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR(EINVAL)) {
continue;
} else if (ret < 0) {
cerr << "Error while decoding frame " << fcount << endl;
exit(1);
}
sws_scale(img_convert_ctx, frame->data, frame->linesize, 0,
codec_context->height, picture_rgb->data, picture_rgb->linesize);
if(!frame) {
cerr << "Could not allocate video frame" << endl;
exit(1);
}
if(codec_context == NULL) {
cerr << "Cannot initialize the conversion context!" << endl;
exit(1);
}
// Do something with the frame here
fcount++;
av_packet_unref(&(packet));
}
我已添加导致程序挂起的代码。