視頻編解碼類型MJPEG數據格式介紹

Motion JPEG(M-JPEG或MJPEG,Motion Joint Photographic Experts Group,FourCC:MJPG)是一種影像壓縮格式,其中每一幀圖像都分別使用JPEG編碼。M-JPEG常用在數字相機和攝像頭之類的圖像採集設備上。MJPEG即動態JPEG,按照至少達到25幀/秒速度使用JPEG壓縮算法壓縮視頻信號,完成動態視頻的壓縮。MJPEG壓縮標準是由JPEG專家組制定的,其圖像格式是對每一幀JPEG圖像進行壓縮。MJPEG是一種基於靜態圖像壓縮技術JPEG發展起來的動態圖像壓縮技術,可以生成序列化的運動圖像。實際上MJPEG圖像數據流就是一幀一幀的JPEG格式圖片

MJPEG只是有幀內壓縮(區別於算法更復雜的幀間壓縮),只單獨的對某一幀進行壓縮,而不考慮影像畫面中不同幀之間的變化。因此壓縮效率比較低,而使用了幀間壓縮的現代影像壓縮格式(如MPEG1、MPEG2和H.264/MPEG-4 AVC)一般壓縮率比較高。

MJPEG是一種基於靜態圖像JPEG壓縮標準的動態圖像壓縮標準,壓縮過程是將視頻序列的每一幀視爲一幅靜止圖像進行壓縮。因此,要進行MJPEG壓縮,首先必須實現靜態圖像的JPEG壓縮。JPEG定義了兩種基本的算法:基於DCT的有失真壓縮算法和基於DPCM的無失真壓縮算法。基於DCT的有失真JPEG壓縮算法主要分爲5個基本步驟:色彩空間變換及採樣、離散餘弦變換DCT、量化、Z字形編排、編碼。

JPEG是一種很靈活的格式,具有調節圖像質量的功能,允許用不同的壓縮比例對文件進行壓縮,支持多種壓縮級別。壓縮比越大,品質就越低。

JPEG委員會在制定JPEG標準時,定義了許多標記碼(marker)或標記段(marker segments)組成,用來區分和識別圖像數據及其相關信息。目前,使用比較廣泛的是其交換格式JFIF(Jpeg File Interchange Format)。JPEG的每個標記碼都是由2個字節組成,其前一個字節是固定值0xFF,每個標記碼之前還可以添加數目不限的0xFF填充字節。JPEG文件中的字節是按照正序排列的,即高位字節在前,低位字節在後

JFIF即JPEG文件交換格式(JPEG File Interchange Format, JFIF)是一個圖像文件格式標準。它是一種交換符合JPEG交換格式(JIF)標準的JPEG編碼文件的格式。它解決了JIF在簡單JPEG編碼文件交換方面的一些限制。與所有符號JIF的文件一樣,JFIF文件中的圖像數據使用JPEG標準的技術壓縮,因此JFIF有時被稱爲”JPEG/JFIF”。在JFIF中,圖像樣本的存放順序是從左到右和從上到下。

按照JFIF,JPEG文件由兩個部分組成:文件頭部分和圖像壓縮數據。其中文件頭部分分爲一個一個的段來存儲(但並不是全部都是段),段的多少和長度並不確定。只要包含了足夠的信息,該JPEG文件就能夠被打開。文件頭部分的每個段都一定包含兩部分,一個是段的標記碼,它由兩個字節構成:第一個字節是十六進制0xFF,第二個字節對於不同的段,有不同的值。緊接着的兩個字節存放的是這個段的長度。這個長度的表示方法是按照高位在前,低位在後。另外,爲了避免文件頭部分和圖像壓縮數據部分的衝突,在對圖像數據進行huffman編碼時如果產生了一個0xFF,那麼就用0xFF 0x00代替。因此在對壓縮數據部分進行解碼時,如果一個0xFF的後面字節不是0x00,那麼這個字節沒有意義,如果0xFF後一字節爲0x00,則將此兩個字節作爲一個字節0xFF進行處理。由於文件頭中包含了解碼圖像時必須的量化表、Huffman表、圖像格式等信息,因此輸出的第一幀JPEG數據流必須包含文件頭。由於接下來編碼的圖像都是按照相同的方式進行編碼的,因此可以不包含文件頭,只需要在編碼結束時產生一個表示編碼結束的標記,用於區分不同幀圖像,解碼時在圖像頭部添加上文件頭,將編碼圖像轉變爲標準的JPEG圖像即可。

JFIF主要標記碼:

標記碼

數值

描述

SOI(start of image)

FFD8

圖像開始

EOI(end of image)

FFD9

圖像結束

APP0(application)

FFE0

JFIF應用數據塊,必須緊隨SOI標記

APPn

FFE1----FFEF

擴展APP0標記段,必須緊隨JFIF APP0標記

DQT(define quantization table)

FFDB

量化表,可有多個

SOF(start of frame)

FFC0

一幀圖像的開始,C0後的第4,5兩個字節表示圖像高度;第6,7兩個字節表示圖像寬度;第8個字節若爲1則表示爲灰度圖,若爲3則表示爲彩色圖

DHT(define Huffman table)

FFC4

Huffman表,可有多個

SOS(start of scan)

FFDA

掃描線開始

DRI(define Restart Interval)

FFDD

 

JFIF APP0標記段:在強制性JFIF APP0標記段中指定圖像的參數,可選嵌入未壓縮的縮略圖

字段

大小(字節)

描述

APP0標記

2

FF E0

長度

2

APP0段外的段長度

標識符

5

4A 46 49 46 00 =”JFIF”的ASCII碼,以空字節終止,注:在MJPEG中爲41 56 49 31 00 =”AVI1”

JFIF版本

2

第一個字節爲主版本,第二個字節爲次要版本(01 01表示1.01)

密度單位

1

下列像素密度字段的單位:

00:無單位;width:height像素寬高比=Xdensity:Ydensity

01:每英寸像素(2.54釐米)

02:每釐米像素

Xdensity

2

水平像素密度,不得爲零

Ydensity

2

垂直像素密度,不得爲零

Xthumbnail

1

嵌入的RGB縮略圖的水平像素數,可以爲零

Ythumbnail

1

嵌入的RGB縮略圖的垂直像素數,可以爲零

縮略圖數據

3*n

未壓縮的24位RGB(每個顏色通道8位)光柵縮略圖數據,順序爲R0、G0、B0、…Rn、Gn、Bn;其中n= Xthumbnail* Ythumbnail

JFIF擴展APP0標記段:緊隨JFIF APP0標記段的可能是JFIF擴展APP0標記段。此段可能僅存在於JFIF 1.02及更高版本。它允許以3種不同的格式嵌入縮略圖。

字段

大小(字節)

描述

APP0標記

2

FF E0

長度

2

不包括APP0標記的段長度

標識符

5

4A 46 58 58 00 =”JFXX”的ASCII碼,以空字節終止

縮略圖格式

1

指定用於以下嵌入縮略圖的數據格式:

10:JPEG格式

11:每個像素1字節調色格式

13:每個像素3字節RGB格式

縮略圖數據

可變

取決於縮略圖格式

縮略圖數據取決於縮略圖格式:

使用JPEG編碼存儲的縮略圖

字段

大小(字節)

描述

SOI

2

FF D8

可變

必須爲使用YCbCr或僅Y的JIF格式,並且必須不包含JFIF或JFXX段

 

EOI

2

FF D9

注:以上內容主要摘自維基百科:Motion_JPEG  JPEG File Interchange Format

下圖是通過MJPEG從usb攝像頭獲取到的大小爲160*120(w*h)的一幀數據,爲了便於顯示移除了中間的部分編碼數據:關鍵字段已用紅框標註

下圖是用UltraEdit打開的一個16*16的jpeg圖像:關鍵字段已用紅框標註

GitHubhttps://github.com//fengbingchun/OpenCV_Test

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章