gpt4 book ai didi

c++ - FFmpeg 卡在缓冲区填充 C++

转载 作者:可可西里 更新时间:2023-11-01 16:23:49 26 4
gpt4 key购买 nike

我正在使用 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));

}

我添加了导致程序挂起的代码。

最佳答案

你可以试试多线程。每个帧都由一个单独的线程处理(使用线程池)。

如果您需要顺序完成顺序,则必须使用某种结构(队列?)来为无序线程完成时间排序。

关于c++ - FFmpeg 卡在缓冲区填充 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45943492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com