帧封装形式:
webrtc::VideoFrame
时间戳:
uint32_t timestamp_rtp_; rtp时间戳 默认为 0 编码前赋值
int64_t ntp_time_ms_; ntp时间 默认为 0 编码前赋值
int64_t timestamp_us_; 采集时系统时间 采集时赋值
传输过程:
VideoBroadcaster::OnFrame -> VideoStreamEncoder::OnFrame()
ntp_time_ms_的计算:
delta_ntp_internal_ms_ = clock_->CurrentNtpInMilliseconds() - clock_->TimeInMilliseconds();
ntp_time_ms_ = timestamp_us_ / 1000 + delta_ntp_internal_ms_;
delta_ntp_internal_ms_即系统时间和ntp时间的差值,VideoStreamEncoder对象初始化时计算好
ntp_time_ms_为用帧的采集时的系统时间加上系统时间与ntp时间的差值
timestamp_rtp_的计算:
视频采样率:90 * 1000,即一秒采集90 * 1000个样本,那么一毫秒就是采集90个样本
const int kMsToRtpTimestamp = 90;
uint32_t ntp_low_time_ms = static_cast<uint32_t>(incoming_frame.ntp_time_ms());
timestamp_rtp_ = 90 * ntp_low_time_ms;
即将ntp时间转换为对应的采样个数就是rtp时间戳
rtp打包的时间戳的计算:
VideoFrame中的时间戳一直被传递到发送阶段,在发送前进行rtp打包时对时间戳做了一点处理,即
rtp_timestamp = timestamp_offset_ + capture_timestamp
timestamp_offset_ = random_.Rand<uint32_t>();
capture_timestamp = VideoFrame.timestamp_rtp_;
so:
rtp_timestamp = timestamp_offset_ + VideoFrame.timestamp_rtp_;