很多人发送流媒体习惯于使用VLC, 很方便也很好用, 功能很强大.
但是很少人提及VLC 发出的帧的时间戳是什么意义,是如何计算得来的. 本人最近分析了VLC的源代码, 分析了时间戳形成机制, 不敢独享,拿出来与大家共享.
VLC发送实时流的命令一般如下:
vlc -vvv localFile --sout udp://ip:port
-vvv是输出调试信息的选项
--sout是输出流到某个地址的选项.
在VLC中时间戳的调用栈如下:
1. decoder.c:decoder_New()-->vlc_clone( &p_dec->p_owner->thread, DecoderThread, p_dec, i_priority )
启动线程,回调函数DecoderThread
2. decoder.c:DecoderThread()-->DecoderProcess( p_dec, p_block )
3. decoder.c:DecoderProcess-->DecoderProcessSout( p_dec, p_block )
4. decoder.c:DecoderProcessSout-->DecoderPlaySout( p_dec, p_sout_block )
5. decoder.c:DecoderPlaySout-->DecoderFixTs( p_dec, &p_sout_block->i_dts, &p_sout_block->i_pts,
&p_sout_block->i_length, NULL, INT64_MAX )
可以看到该函数的第二第三个参数为引用,也就是在该函数中赋值
6. decoder.c:DecoderFixTs()-->input_clock_ConvertTS( p_clock, &i_rate, pi_ts0, p