小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

視頻文件解碼與起始碼(startcode) 研究

 春華_秋實 2012-05-16

視頻文件解碼與起始碼(startcode) 研究

分類: 音視頻編解碼與傳輸 2361人閱讀 評論(2) 收藏 舉報

1. H.264起始碼

在網(wǎng)絡傳輸h264數(shù)據(jù)時,一個UDP包就是一個NALU,解碼器可以很方便的檢測出NAL分界和解碼。 但是如果編碼數(shù)據(jù)存儲為一個文件,原來的解碼器將無法從數(shù)據(jù)流中分別出每個NAL的起始位置和終止位置,為此h.264用起始碼來解決這一問題。(mpeg-4的startcode在后面討論)

 

  H.264編碼時,在每個NAL前添加起始碼 0x000001,解碼器在碼流中檢測到起始碼,當前NAL結束。為了防止NAL內部出現(xiàn)0x000001的數(shù)據(jù),h.264又提出'防止競爭 emulation prevention"機制,在編碼完一個NAL時,如果檢測出有圖下表左側的四個字節(jié)序列,就在最后一個字節(jié)前插入一個新的字節(jié),0x03,從而變成下表右側的樣子。 當解碼器在NAL內部檢測到0x000003的數(shù)據(jù),就把0x03拋棄,恢復原始數(shù)據(jù)。

   0x000000  >>>>>>0x000000300

   0x000001  >>>>>>0x000000301

   0x000002  >>>>>>0x000000302

   0x000003  >>>>>>0x000000303

 

 附上h.264解碼nalu中檢測起始碼的算法流程 

  1. for(;;)
  2.         {
  3.     
  4.             if next 24 bits are 0x000001
  5.         {
  6.            startCodeFound = true
  7.            break;
  8.         }
  9.             else
  10.             {
  11.                 flush 8 bits 
  12.             }
  13.         }// for(;;)
  14.         if(true == startCodeFound)
  15.         {
  16.             //startcode found
  17.             // Flush the start code found
  18.             flush 24 bits 
  19.             //Now navigate up to next start code and put the in between stuff
  20.             // in the nal structure.
  21.            for(;;)
  22.            {
  23.                get next 24 bits & check if it equals to 0x000001
  24.               if(false == (next 24 bits == 000001))
  25.                {
  26.                    // search for pattern 0x000000
  27.                    check if next 24 bits are 0x000000
  28.                    if(false == result)
  29.                    {
  30.                        // copy the byte into the buffer
  31.                        copy one byte to the Nal unit 
  32.                                        
  33.                    }
  34.                    else
  35.                    {
  36.                        break;
  37.                    }
  38.                }
  39.                else
  40.                {
  41.                    break;
  42.                }
  43.            }//for(;;)

  2. MPEG4起始碼

        mpeg4的特色是VOP,沒有NALU的概念,仍使用startcode對每幀進行分界。mpeg4的起始碼是001. 另外mpeg4中很多起始碼也很有用,比如visual_object_sequence_start_code 0001B0 表示一個視頻對象序列的開始,VOP_start_code 0001B6 表示一個VOP的開始. 000001b6之后的兩位,是00表示 I frame, 01 表示 P frame, 10 表示 B frame.

 

   PS:VLC是非常強大的開源視頻解碼工程,里面mpeg4和h.264的解碼部分很有參考價值。建議大家下載看看。http://www./vlc

 

  參考文獻 畢厚杰《新一代視頻壓縮編碼標準--H.264/AVC》

                    MPEG4標準文檔mpeg-4-14496-2

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多