尝试使用生产者/消费者习惯用法在内存中实现流解复用/解码。 生产者从网络读取数据并将其推入缓冲区。使用者从该缓冲区读取数据并将其转发到avformat。
根据ffmpeg文档,实现内存中处理的唯一方法是使用AVIOContext
,并为其提供read
功能。
问题在于,如果缓冲区中的数据太少,则read函数返回0,而avformat认为它是EOF
,从而产生错误。
具体来说,这发生在avformat_open_input/avformat_find_stream_info
调用中,其中avformat尝试探测给定数据。有时它可以工作,有时则不能,具体取决于输入缓冲区的大小。
我尝试从EAGAIN
函数返回read
(看起来很合理),但是它不起作用。
作为解决方法,我增加了输入缓冲区的大小,在将更多数据传递给avformat之前积累了更多数据,但这浪费了内存(可能有成百上千的流),并且由于我们不知道它不能成为通用解决方案到底需要多少数据
有什么办法告诉avformat会有更多数据,但是以后呢?