我正在使用 VideoToolbox VTCompressionSession 以 H264 格式对帧进行编码,我将通过网络套接字将其发送到浏览器。接收到的帧将被解码,输出将在网站中呈现。现在,当使用某些编码器时,视频的渲染始终具有四帧延迟。
如何将帧发送到服务器:
开始>------------ f1 ------------ f2 ------------ f3 -------- ---- f4 ------------- f5 ...
渲染是如何发生的:
开始>------------------------------------------------------------ --------------------------- f1 ------------ f2 --------- --- f3 ------------ f4 ----------- ...
这个有时会变成两帧延迟,有时会变成十六帧延迟,因此可用性受到影响。
我在 videotoolbox 的 VTCompressionSession 中使用此配置:
kVTCompressionPropertyKey_AverageBitRate=3MB
kVTCompressionPropertyKey_ExpectedFrameRate=24
kVTCompressionPropertyKey_RealTime=true
kVTCompressionPropertyKey_ProfileLevel=kVTProfileLevel_H264_High_AutoLevel
kVTCompressionPropertyKey_AllowFrameReordering = false
kVTCompressionPropertyKey_MaxKeyFrameInterval=1000
使用相同的配置,我能够使用
com.apple.videotoolbox.videoencoder.h264.gva
实现 1 输入 - 1 输出。这个问题是使用编码器进行复制com.apple.videotoolbox.videoencoder.ave.avc
不确定其编码器是否特定。我还发现两个编码器的编码输出之间的 VUI 参数存在差异。
我想知道是否可以通过编码器配置或 VideoToolBox 提供的另一个 API 来解决此问题,以确保解码器同时解码和渲染帧。
提前致谢......
作为 h264 规范,当
sps.pic_order_cnt_type = 2
or
SPS.pic_order_cnt_type = 0 then
* VUI.max_dec_frame_buffering >= num_ref_frames
* SEI.pic_timing.dpb_output_delay = 0
解码器可以是 1 个数据包输入 1 个帧输出。
但是 h264_videotoolbox 有
pic_order_cnt_type=0
且无法修改。
所以某些解码器可能缓冲超过 16 帧。