@leaveye
2022-05-11T11:29:17.000000Z
字数 1236
阅读 333
d2201 debug codec video decoder
loop:if nng_recv_queue.empty():continuepkt = nng_recv_queue.pop()... some pts manner and maybe delay ...decoder_write(pkt)free(pkt)
pkt = NULLpts_next = 0pts_last = 0while RUNNING:if pkt:// fps controllocal pts_this = pkt.ptslocal pts_step = pts_this - pts_lastpts_step -= 1msif pts_step > const_window_size:pts_next = get_now() - pts_step / 4local pts_delta = get_now() - pts_nextwhile pts_delta > const_min_delay:if not RUNNING:... force quit ...else if pts_delta > const_window_size:pts_next = get_now() - pts_step / 4else:... short sleep, maybe 10 ms ...pts_delta = get_now() - pts_nextpts_next += pts_steppts_last = pts_thisdecoder_write(pkt)free(pkt)continueif nng_recv_queue.empty():sleep 10 mscontinuepkt = nng_recv_queue.pop()if pkt:free(pkt)
this - step = last 表征,解码侧用 now() - next = delta 控制。如果处于 就送解,否则等待。next ,条件为: step 超限。比如初始化或中间网络断流一段时间。delta 超限。比如进程挂起一段时间后继续运行。step ,以避免设备间时钟差异导致延迟。表示在播放第 帧之前,应该等待多久。
然而算法中,使用 拿来当作播放第 帧后的等待时间。
这在 序列产生较大突变的时候可能会引入问题。幸运的是编码侧帧率最终由硬件时钟驱动,稳定性不错。暂时应可无视此问题。
