基本概念:
I帧、p帧、b帧、DTS、PTS、
抖动jitter、
音视频同步:stream clock、system clock、pcr(参考时钟)
时钟同步:drift播放流程:
input->Demux->audio FIFO->Decoder->DirectSound
————–Video FIFO->Decoder->Pic FIFO->DirectShow
access访问:接受获取->内存缓冲
demux解吗:input_decoderdecode->vlc_fifo_QueueUnlocked
es_out.c:创建音视频两个解码器
decode解码:vlc_fifo_DequeueUnlocked->DecoderDecode->
avcodec/video.c->DecodeVideo->vout_putPicture->picture_fifo_push
vlc_fifo_QueueUnlocked->DecoderDecode->avcodec/audio.c->DecodeAudio->aout_decplay
output输出:aout直接播放decoderplayaudio;
vout送入缓存
丢帧策略:以音频为基准,来一帧播放一帧;延时超过500ms,如果缓存有多余的帧,就丢掉一些;视频:比音频快慢20ms就丢(不能丢关键帧..)
常见问题:
a. 直播延时:
启动延时: 进程初始化,如cpu探测、加载组件等;控制协议,如rtsp协议交互时间;关键帧的位置;预读取的流太多,等待时间太长,可以通过修改p_sys->ic->probesize、max_analyze_duration来减少
播放延时:网络延时;网络抖动;乱序;丢包;缓存;音视频同步(累积延时);
音频播放延时的处理函数为aout_decsynchronize
b. 马赛克:由于gop中的p帧丢失,导致部分连续新鲜丢失;h264解码的时候会根据前面的参考帧来补齐,从而造成马赛克现象。
c. 卡顿:如果I帧丢失,就没法显示一个GOP内的所有帧,而I帧周期较长,所以会导致下一个I帧到来之前画面静止不动。
丢帧策略-> threaddisplaypreparepicture里,即使“too late to be displayed”,也是隔一帧才丢一帧,不连续丢。
d. 裁减:减少flash占用、加快vlc初始化、减少内存占用历史故障:
a. 某地长城宽带用户无法播放xx摄像头的直播流,问题原因:
b. 用户app在局域网内无法播放直播流,更换家庭网关则正常
- VLC启动流程
libvlc_InternalInit(): log初始化、注册组件、
avcodec_skip_frame:跳侦的作用?
avcodec_skip_idct: