最近在修正一個hls的問題, Audio 跟 Video 會卡頓

先講引發點, 在講修正原因, 以及修正的瑕疵

引發點:frame pts與實際的播放時間有落差, 然後vlc把frame 給丟掉, 因此引起卡頓

程式碼追蹤有點長, 直接貼最後的追蹤位置:./vlc/src/input/decoder.c

Video

if( unlikely(prerolled) )

{

msg_Dbg( p_dec, "end of video preroll" );

f( p_vout )

vout_Flush( p_vout, VLC_TS_INVALID+1 );

}

Audio

if( unlikely(prerolled) )

{

msg_Dbg( p_dec, "end of audio preroll" );

if( p_owner->p_aout )

aout_DecFlush( p_owner->p_aout, false );

}

修正地方:移除 p_owner->i_preroll_end 的設定資料程式, 也就是不成立設定, 永久不 Lost Frame

DecoderUpdatePreroll(..) 裡面的程式碼都註解掉, 如下所示

static inline void DecoderUpdatePreroll( decoder_t *p_dec, int64_t *pi_preroll, const block_t *p )

{

// if( p->i_flags & (BLOCK_FLAG_PREROLL|BLOCK_FLAG_DISCONTINUITY) )

//if( p->i_flags & (BLOCK_FLAG_PREROLL|BLOCK_FLAG_DISCONTINUITY) ){

// msg_Dbg(p_dec, "[Jerome] p->i_flags & (BLOCK_FLAG_PREROLL|BLOCK_FLAG_DISCONTINUITY " );

// *pi_preroll = INT64_MAX;

//}

//else if( p->i_dts > VLC_TS_INVALID ) {

// msg_Dbg(p_dec, "[Jerome] p->i_dts > VLC_TS_INVALID " );

// *pi_preroll = __MIN( *pi_preroll, p->i_dts );

//}

//else if( p->i_pts > VLC_TS_INVALID ) {

// msg_Dbg(p_dec, "[Jerome] p->i_pts > VLC_TS_INVALID " );

// *pi_preroll = __MIN( *pi_preroll, p->i_pts );

//}

}

results matching ""

    No results matching ""