本文来自IBC 2019(International Broadcasting Convention)中的演讲,主要内容是FFmepg编码的子帧延时。演讲内容来自EBU(European Broadcasting Union)的Kieran Kunhya。
Kieran Kunhya首先比较了基于整帧图像的编码和子帧编码之间的延时。基于整帧图像的编码需要在接收到整帧图像后才开始编码,这样在编码阶段会引入至少一帧的延时,同样在解码阶段也会引入一帧的延时。而子帧编码却不需要在接收完整幅帧图像就可以开始,它将一帧图像的连续N行看作为一个子帧(通常是连续16行或者32行),也称为一个切片(slice),在接收完一个切片后就可以开始编码,这样编解码阶段只会各自引入一个切片的延时,一个切片的延时大约为40us,所以子帧编码会大大降低编解码过程引入的延时。
图1 子帧编解码流程
接着,Kieran Kunhya阐述了子帧编码的编解码流程,如图1所示。编码器接收到一个切片以后,就可以对当前的切片进行编码,然后经过网络传输后送到解码器,解码器对切片解码后进行切片拼接,恢复出每一帧图像。为了使FFmpeg支持子帧编码,引入draw_horiz_band,一旦切片编解码完成,则将其进行传输或者在硬件上渲染。此外,在使用H.264编码的时候,要设置deblock_flag=2,即对切片边缘不进行去块效应。如果需要对切片边缘去块效应,可以考虑选择引入边缘切片。
最后,Kieran Kunhya也说明了子帧编码目前存在的问题。比如可以使用多线程来提高吞吐量,此外某些切片在编码还未结束就被引用等。这些问题有待进一步解决。
演讲PPT全文