原因 :fifo过滤器在被请求之前不会输出帧。 并且ffmpeg仅请求属于具有最小时间戳的流的帧(请参见choose_output()函数)。 因此,当媒体中包含一些异常内容时,例如一小段没有音频的纯图像或某些音频解码错误,ffmpeg将继续请求音频帧,并在fifo过滤器中阻塞成千上万的视频帧,从而耗尽您的内存。
解决方案 :我遇到了同样的问题,并通过在fifo过滤器中添加了样本限制来解决了该问题。 当缓冲的帧数超过限制时,它将强制下一个链接的过滤器请求帧。 码:
libavfilter/fifo.c:
+ #define NB_SAMPLE_MAX 500 // About 1GB memory
typedef struct Buf {
AVFrame *frame;
struct Buf *next;
AVFrame *out;
int allocated_samples; ///< number of samples out was allocated for
+ int buffered_samples; ///< avoid memory overflow
} FifoContext;
static av_cold int init(AVFilterContext *ctx)
{
FifoContext *fifo = ctx->priv;
fifo->last = &fifo->root;
+ fifo->buffered_samples = 0;
return 0;
}
static int add_to_