1. 程式人生 > >live555 場編碼H264 幀率異常問題

live555 場編碼H264 幀率異常問題

      最近在折騰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;

       } 

       }