【发布时间】:2018-02-07 04:03:37
【问题描述】:
我正在使用 ffmpeg 处理来自 RTSP 流的一堆帧。我最终对这些帧进行了大量处理,这意味着我并不总是实时拉动。如果缓冲区已满,则进程挂起。我想知道以下解决方案之一是否可行/解决了问题,如果是,我将如何使用 ffmpeg 库来实现它:
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));
}
我添加了导致程序挂起的代码。
【问题讨论】:
-
这里没有代码,所以任何人都可以猜猜出了什么问题。这些信息不足以重现问题。
-
@tadman,这些代码足以让您猜出问题所在吗?我试图暗示我已经调试了问题,并发现缓冲区是问题所在。这就是为什么我提出了我所询问的具体解决方案。我真的主要是在寻找这些解决方案是否可行。但是我理解你为什么想看代码,所以我添加了它。
-
上下文很重要。您最初的问题有点过于假设了。
-
这里的解决方案有帮助吗? stackoverflow.com/questions/14558172/…
-
@kvr 我可能会在明天进行测试,如果能解决问题,请告诉您。