live555 場編碼H264 幀率異常問題
阿新 • • 發佈:2019-01-04
最近在折騰live555 RTSP伺服器,遇到一個碼流幀率異常問題:用vlc客戶端rtsp取流播放的時候 感覺像 慢放;
用elecard分析了碼流,發現是場編碼,幀率是25fps; 而幀編碼的碼流用vlc 取流播放 並沒有發現異常;
單步除錯live555原始碼後 發現live555框架 解析 場編碼碼流幀率 並沒有出錯,也是解析成25fps;
嘗試修改解析程式碼,若解析出來是場編碼H264,則把幀率=(碼流幀率*2),:
1. 找到 frame_mbs_only_flag 標誌位,該標誌位是標識 H264是否為場編碼;
frame_mbs_only_flag = true 表示幀編碼; frame_mbs_only_flag = true 表示
2. 在sps解析程式碼中增加 場編碼判定及幀率修改
else if (isSPS(nal_unit_type)) { // Sequence parameter set// First, save a copy of this NAL unit, in case the downstream object wants to see it:
usingSource()->saveCopyOfSPS(fStartOfFrame + fOutputStartCodeSize, curFrameSize() - fOutputStartCodeSize);
if (fParsedFrameRate == 0.0) {
// We haven't yet parsed a frame rate from the stream.
// So parse this NAL unit to check whether frame rate information is present:
unsigned num_units_in_tick, time_scale;
analyze_seq_parameter_set_data(num_units_in_tick, time_scale);
if (time_scale > 0 && num_units_in_tick > 0) {
usingSource()->fFrameRate = fParsedFrameRate
= time_scale/(DeltaTfiDivisor*num_units_in_tick);
//場編碼
if (!fframe_mbs_only_flag)
{
usingSource()->fFrameRate = fParsedFrameRate = fParsedFrameRate * 2;
}
}