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圖像:關鍵字段已用紅框標註