x264线程延迟



我想知道为什么无切片线程(http://akuvian.org/src/x264/sliceless_threads.txt)x264导致延迟?如果我有例如2个线程,则第一个对一帧进行编码,第二个对一个帧进行编码。在某些情况下,秒必须等待第一个。但它们可以并行编码。

所以两个线程应该比只有一个更快,对吧?

帧线程增加了以帧为单位的延迟,而不是以秒为单位,因为在开始获取输出帧(填充管道)之前,需要向编码器提供更多的输入帧。编码一个帧本身将花费与一个线程几乎相同的处理器时间,但线程通过并行编码不同的帧来允许流水线处理。另一方面,切片线程减少了延迟,因为所有线程都对一帧并行进行编码,所以它的完成速度会比用一个线程进行编码更快(此外,切片线程不需要帧中的延迟来进行管道传输)。

我花了很长时间来推理,但答案是排队论。

每个帧都可以在前一帧的一半已经被编码时开始。但是,如果并行化能带来任何好处,那么大多数(最好是所有)线程都应该有一个可处理的框架。5个线程意味着5个框架。这就是管道。每当管道未完全满时,并行化给您带来的好处就会减少。如果管道只包含一个帧,那么只有一个线程在工作,因此并行化不会带来任何好处。但是,如果你的管道通常是满的,它里面装满了什么?未编码的帧。未编码帧是必须捕获的帧,因此它们代表了相当于许多帧的延迟。延迟可能会稍微减少一个帧的一小部分,因为管道中的一些帧是部分编码的,但通常管道中的每个项都会导致延迟。

使用更多线程增加延迟的一个原因是连续帧相互用于运动预测和补偿。这意味着为了压缩一帧,你需要来自先前运动估计细节的信息。这意味着帧是相互依赖的,有时它们也必须等待来自其他线程的至少一些数据。这与切片线程形成了鲜明对比,当线程对帧进行切片时,每个线程都在一个切片上工作,并且都在同一帧上,并且它们具有来自前一帧的所有所需信息,或者在B帧的情况下具有下一帧的所需信息。

最新更新