當前位置:首頁 » 文件管理 » 解壓縮一幀圖像

解壓縮一幀圖像

發布時間: 2024-10-04 18:17:00

A. 什麼是JEPG

JPEG壓縮技術可以說是所有圖像壓縮技術的基礎。它適合靜態圖像的壓縮,直接處理整個畫面,壓縮倍數為20-80倍,解析度沒有選擇的餘地。所以要等到整個壓縮檔案傳輸完成才開始進行解壓縮成影像畫面,而這樣的方式造成傳輸一個高解析畫面時須耗時數十秒甚至數分鍾。

而MJPEG(Motion JPEG)是在JPEG基礎發展起來的動態圖像壓縮技術,它只單獨的對某一幀進行壓縮,而基本不考慮視頻流中不同幀之間的變化。使得可獲取清晰度很高的視頻圖像,而且可靈活設置每路的視頻清晰度和壓縮幀數。其壓縮後的畫面還可任意剪接。但它的缺陷也非常明顯,其一:丟幀現象嚴重、實時性差,在保證每路都必須是高清晰的前提下,很難完成實時壓縮。其二:壓縮效率低,存儲佔用空間較大。

後來又出現了多層式JPEG(ML-JPEG)壓縮技術,它採取漸層式技術,先傳輸低解析的圖檔,然後再補送更細節的壓縮資料,使畫面品質改善。這種方式所需的時間雖然與原先的方式一樣。但由於可以先看到畫面,所以使用者會覺得這種方式較好。

B. 附加: FFmpeg概念理解

FFmpeg 介紹

FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化為流的開源計算機程序。採用LGPL或GPL許可證。它提供了錄制、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec里很多codec都是從頭開發的。

FFmpeg在Linux平台下開發,但它同樣也可以在其它操作系統環境中編譯運行,包括Windows、Mac OS X等。這個項目最早由Fabrice Bellard發起,現在由Michael Niedermayer維護。許多FFmpeg的開發人員都來自MPlayer項目,而且當前FFmpeg也是放在MPlayer項目組的伺服器上。項目的名稱來自MPEG視頻編碼標准,前面的"FF"代表"Fast Forward"。

FFmpeg模塊

libavformat:用於各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能;

libavcodec:用於各種類型聲音/圖像編解碼;

libavutil:包含一些公共的工具函數;

libswscale:用於視頻場景比例縮放、色彩映射轉換;

libpostproc:用於後期效果處理;

ffmpeg:該項目提供的一個工具,可用於格式轉換、解碼或電視卡即時編碼等;

ffsever:一個 HTTP 多媒體即時廣播串流伺服器;

ffplay:是一個簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;

H.264編碼原理I/B/P幀

三種幀的說明

I幀:幀內編碼幀 ,I幀表示關鍵幀,你可以理解為這一幀畫面的完整保留;解碼時只需要本幀數據就可以完成(因為包含完整畫面)

I幀特點:

1.它是一個全幀壓縮編碼幀。它將全幀圖像信息進行JPEG壓縮編碼及傳輸;

2.解碼時僅用I幀的數據就可重構完整圖像;

3.I幀描述了圖像背景和運動主體的詳情;

4.I幀不需要參考其他畫面而生成;

5.I幀是P幀和B幀的參考幀(其質量直接影響到同組中以後各幀的質量);

6.I幀是幀組GOP的基礎幀(第一幀),在一組中只有一個I幀;

7.I幀不需要考慮運動矢量;

8.I幀所佔數據的信息量比較大。

P幀:前向預測編碼幀。P幀表示的是這一幀跟之前的一個關鍵幀(或P幀)的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(也就是差別幀,P幀沒有完整畫面數據,只有與前一幀的畫面差別的數據)

P幀的預測與重構:P幀是以I幀為參考幀,在I幀中找出P幀「某點」的預測值和運動矢量,取預測差值和運動矢量一起傳送。在接收端根據運動矢量從I幀中找出P幀「某點」的預測值並與差值相加以得到P幀「某點」樣值,從而可得到完整的P幀。

P幀特點:

1.P幀是I幀後面相隔1~2幀的編碼幀;

2.P幀採用運動補償的方法傳送它與前面的I或P幀的差值及運動矢量(預測誤差);

3.解碼時必須將I幀中的預測值與預測誤差求和後才能重構完整的P幀圖像;

4.P幀屬於前向預測的幀間編碼。它只參考前面最靠近它的I幀或P幀;

5.P幀可以是其後面P幀的參考幀,也可以是其前後的B幀的參考幀;

6.由於P幀是參考幀,它可能造成解碼錯誤的擴散;

7.由於是差值傳送,P幀的壓縮比較高。

B幀:雙向預測內插編碼幀。B幀是雙向差別幀,也就是B幀記錄的是本幀與前後幀的差別(具體比較復雜,有4種情況,但我這樣說簡單些),換言之,要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之後的畫面,通過前後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累。

B幀的預測與重構

B幀以前面的I或P幀和後面的P幀為參考幀,「找出」B幀「某點」的預測值和兩個運動矢量,並取預測差值和運動矢量傳送。接收端根據運動矢量在兩個參考幀中「找出(算出)」預測值並與差值求和,得到B幀「某點」樣值,從而可得到完整的B幀。

B幀特點

1.B幀是由前面的I或P幀和後面的P幀來進行預測的;

2.B幀傳送的是它與前面的I或P幀和後面的P幀之間的預測誤差及運動矢量;

3.B幀是雙向預測編碼幀;

4.B幀壓縮比最高,因為它只反映丙參考幀間運動主體的變化情況,預測比較准確;

5.B幀不是參考幀,不會造成解碼錯誤的擴散。

注:I、B、P各幀是根據壓縮演算法的需要,是人為定義的,它們都是實實在在的物理幀。一般來說,I幀的壓縮率是7(跟JPG差不多),P幀是20,B幀可以達到50。可見使用B幀能節省大量空間,節省出來的空間可以用來保存多一些I幀,這樣在相同碼率下,可以提供更好的畫質。

h264的壓縮方法:

1.分組:把幾幀圖像分為一組(GOP,也就是一個序列),為防止運動變化,幀數不宜取多。

2.定義幀:將每組內各幀圖像定義為三種類型,即I幀、B幀和P幀;

3.預測幀:以I幀做為基礎幀,以I幀預測P幀,再由I幀和P幀預測B幀;

4.數據傳輸:最後將I幀數據與預測的差值信息進行存儲和傳輸。幀內(Intraframe)壓縮也稱為空間壓縮(Spatial compression)。當壓縮一幀圖像時,僅考慮本幀的數據而不考慮相鄰幀之間的冗餘信息,這實際上與靜態圖像壓縮類似。幀內一般採用有損壓縮演算法,由於幀內壓縮是編碼一個完整的圖像,所以可以獨立的解碼、顯示。幀內壓縮一般達不到很高的壓縮,跟編碼jpeg差不多。

幀間(Interframe)壓縮的原理是:相鄰幾幀的數據有很大的相關性,或者說前後兩幀信息變化很小的特點。也即連續的視頻其相鄰幀之間具有冗餘信息,根據這一特性,壓縮相鄰幀之間的冗餘量就可以進一步提高壓縮量,減小壓縮比。幀間壓縮也稱為時間壓縮(Temporal compression),它通過比較時間軸上不同幀之間的數據進行壓縮。幀間壓縮一般是無損的。幀差值(Frame differencing)演算法是一種典型的時間壓縮法,它通過比較本幀與相鄰幀之間的差異,僅記錄本幀與其相鄰幀的差值,這樣可以大大減少數據量。

順便說下有損(Lossy )壓縮和無損(Lossy less)壓縮。無損壓縮也即壓縮前和解壓縮後的數據完全一致。多數的無損壓縮都採用RLE行程編碼演算法。有損壓縮意味著解壓縮後的數據與壓縮前的數據不一致。在壓縮的過程中要丟失一些人眼和人耳所不敏感的圖像或音頻信息,而且丟失的信息不可恢復。幾乎所有高壓縮的演算法都採用有損壓縮,這樣才能達到低數據率的目標。丟失的數據率與壓縮比有關,壓縮比越小,丟失的數據越多,解壓縮後的效果一般越差。此外,某些有損壓縮演算法採用多次重復壓縮的方式,這樣還會引起額外的數據丟失。

H264 NAL頭解析

如果NALU對應的Slice為一幀的開始,則用4位元組表示,即0x00000001;否則用3位元組表示,0x000001。

NAL Header:forbidden_bit,nal_reference_bit(優先順序)2bit,nal_unit_type(類型)5bit。 標識NAL單元中的RBSP數據類型,其中,nal_unit_type為1, 2, 3, 4, 5的NAL單元稱為VCL的NAL單元,其他類型的NAL單元為非VCL的NAL單元。

0:未規定

1:非IDR圖像中不採用數據劃分的片段

2:非IDR圖像中A類數據劃分片段

3:非IDR圖像中B類數據劃分片段

4:非IDR圖像中C類數據劃分片段

5:IDR圖像的片段

6:補充增強信息(SEI)

7:序列參數集(SPS)

8:圖像參數集(PPS)

9:分割符

10:序列結束符

11:流結束符

12:填充數據

13:序列參數集擴展

14:帶前綴的NAL單元

15:子序列參數集

16 – 18:保留

19:不採用數據劃分的輔助編碼圖像片段

20:編碼片段擴展

21 – 23:保留

24 – 31:未規定

H.264的SPS和PPS串,包含了初始化H.264解碼器所需要的信息參數,包括編碼所用的profile,level,圖像的寬和高,deblock濾波器等。

碼率:256~512 kb/s

幀率:15~20fps

解析度:1280x720(HD) 640x368(VGA) 1920x1080(UHD)

AAC(Advanced Audio Coding)

中文名:高級音頻編碼,出現於1997年,基於MPEG-2的音頻編碼技術。由Fraunhofer IIS、杜比實驗室、AT&T、Sony等公司共同開發,目的是取代MP3格式。2000年,MPEG-4標准出現後,AAC重新集成了其特性,加入了SBR技術和PS技術,為了區別於傳統的MPEG-2 AAC又稱為MPEG-4 AAC。

優點:相對於mp3,AAC格式的音質更佳,文件更小。

不足:AAC屬於有損壓縮的格式,與時下流行的APE、FLAC等無損格式相比音質存在「本質上」的差距。加之,傳輸速度更快的USB3.0和16G以上大容量MP3正在加速普及,也使得AAC頭上「小巧」的光環不復存在了。

音頻采樣率是指錄音設備在一秒鍾內對聲音信號的采樣次數,采樣頻率越高聲音的還原就越真實越自然。在當今的主流採集卡上,采樣頻率一般共分為22.05KHz、44.1KHz、48KHz三個等級,22.05KHz只能達到FM廣播的聲音品質,44.1KHz則是理論上的CD音質界限,48KHz則更加精確一些。

比特率是指每秒傳送的比特(bit)數。單位為 bps(Bit Per Second),比特率越高,傳送數據速度越快。聲音中的比特率是指將模擬聲音信號轉換成數字聲音信號後,單位時間內的二進制數據量,是間接衡量音頻質量的一個指標。 視頻中的比特率(碼率)原理與聲音中的相同,都是指由模擬信號轉換為數字信號後,單位時間內的二進制數據量。

信道編碼中,K符號大小的信源數據塊通過編碼映射為N符號大小的碼字,則K/N成為碼率,其中假設編碼前後的符號表沒有變化。

FFMPEG中結構體很多。最關鍵的結構體可以分成以下幾類:

解協議(http,rtsp,rtmp,mms)

AVIOContext,URLProtocol,URLContext主要存儲視音頻使用的協議的類型以及狀態。URLProtocol存儲輸入視音頻使用的封裝格式。每種協議都對應一個URLProtocol結構。(注意:FFMPEG中文件也被當做一種協議「file」)

解封裝(flv,avi,rmvb,mp4)

AVFormatContext主要存儲視音頻封裝格式中包含的信息;AVInputFormat存儲輸入視音頻使用的封裝格式。每種視音頻封裝格式都對應一個AVInputFormat 結構。

解碼(h264,mpeg2,aac,mp3)

每個AVStream存儲一個視頻/音頻流的相關數據;每個AVStream對應一個AVCodecContext,存儲該視頻/音頻流使用解碼方式的相關數據;每個AVCodecContext中對應一個AVCodec,包含該視頻/音頻對應的解碼器。每種解碼器都對應一個AVCodec結構。

存數據

視頻的話,每個結構一般是存一幀;音頻可能有好幾幀

解碼前數據:AVPacket

解碼後數據:AVFrame

AVCodec

AVCodec是存儲編解碼器信息的結構體

const char *name:編解碼器的名字,比較短

const char *long_name:編解碼器的名字,全稱,比較長

enum AVMediaType type:指明了類型,是視頻,音頻,還是字幕

enum AVCodecID id:ID,不重復

const AVRational *supported_framerates:支持的幀率(僅視頻)

const enum AVPixelFormat *pix_fmts:支持的像素格式(僅視頻)

const int *supported_samplerates:支持的采樣率(僅音頻)

const enum AVSampleFormat *sample_fmts:支持的采樣格式(僅音頻)

const uint64_t channel_layouts:支持的聲道數(僅音頻)

int priv_data_size:私有數據的大小

1.注冊所有編解碼器:av_register_all();

2.聲明一個AVCodec類型的指針,比如說AVCodec

first_c;

3.調用av_codec_next()函數,即可獲得指向鏈表下一個解碼器的指針,循環往復可以獲得所有解碼器的信息。注意,如果想要獲得指向第一個解碼器的指針,則需要將該函數的參數設置為NULL。

AVCodecContext

這是一個描述編解碼器上下文的數據結構,包含了眾多編解碼器需要的參數信息

如果是單純使用libavcodec,這部分信息需要調用者進行初始化;如果是使用整個FFMPEG庫,這部分信息在調用 av_open_input_file和av_find_stream_info的過程中根據文件的頭信息及媒體流內的頭部信息完成初始化。其中幾個主要 域的釋義如下:

extradata/extradata_size: 這個buffer中存放了解碼器可能會用到的額外信息,在av_read_frame中填充。一般來說,首先,某種具體格式的demuxer在讀取格式頭 信息的時候會填充extradata,其次,如果demuxer沒有做這個事情,比如可能在頭部壓根兒就沒有相關的編解碼信息,則相應的parser會繼 續從已經解復用出來的媒體流中繼續尋找。在沒有找到任何額外信息的情況下,這個buffer指針為空。

time_base:

width/height:視頻的寬和高。

sample_rate/channels:音頻的采樣率和信道數目。

sample_fmt: 音頻的原始采樣格式。

codec_name/codec_type/codec_id/codec_tag:編解碼器的信息。

AVStream

該結構體描述一個媒體流

主要域的釋義如下,其中大部分域的值可以由av_open_input_file根據文件頭的信息確定,缺少的信息需要通過調用av_find_stream_info讀幀及軟解碼進一步獲取:

index/id:index對應流的索引,這個數字是自動生成的,根據index可以從AVFormatContext::streams表中索引到該流;而id則是流的標識,依賴於具體的容器格式。比如對於MPEG TS格式,id就是pid。

time_base:流的時間基準,是一個實數,該流中媒體數據的pts和dts都將以這個時間基準為粒度。通常,使用av_rescale/av_rescale_q可以實現不同時間基準的轉換。

start_time:流的起始時間,以流的時間基準為單位,通常是該流中第一個幀的pts。

ration:流的總時間,以流的時間基準為單位。

need_parsing:對該流parsing過程的控制域。

nb_frames:流內的幀數目。

r_frame_rate/framerate/avg_frame_rate:幀率相關。

codec:指向該流對應的AVCodecContext結構,調用av_open_input_file時生成。

parser:指向該流對應的AVCodecParserContext結構,調用av_find_stream_info時生成。

AVFormatContext

這個結構體描述了一個媒體文件或媒體流的構成和基本信息

這是FFMpeg中最為基本的一個結構,是其他所有結構的根,是一個多媒體文件或流的根本抽象。其中:nb_streams和streams所表示的AVStream結構指針數組包含了所有內嵌媒體流的描述;iformat和oformat指向對應的demuxer和muxer指針;pb則指向一個控制底層數據讀寫的ByteIOContext結構。

start_time和ration是從streams數組的各個AVStream中推斷出的多媒體文件的起始時間和長度,以微妙為單位。

通常,這個結構由av_open_input_file在內部創建並以預設值初始化部分成員。但是,如果調用者希望自己創建該結構,則需要顯式為該結構的一些成員置預設值——如果沒有預設值的話,會導致之後的動作產生異常。以下成員需要被關註:

probesize

mux_rate

packet_size

flags

max_analyze_ration

key

max_index_size

max_picture_buffer

max_delay

AVPacket

AVPacket定義在avcodec.h中

FFMPEG使用AVPacket來暫存解復用之後、解碼之前的媒體數據(一個音/視頻幀、一個字幕包等)及附加信息(解碼時間戳、顯示時間戳、時長等)。其中:

dts 表示解碼時間戳,pts表示顯示時間戳,它們的單位是所屬媒體流的時間基準。

stream_index 給出所屬媒體流的索引;

data 為數據緩沖區指針,size為長度;

ration 為數據的時長,也是以所屬媒體流的時間基準為單位;

pos 表示該數據在媒體流中的位元組偏移量;

destruct 為用於釋放數據緩沖區的函數指針;

flags 為標志域,其中,最低為置1表示該數據是一個關鍵幀。

AVPacket 結構本身只是個容器,它使用data成員指向實際的數據緩沖區,這個緩沖區可以通過av_new_packet創建,可以通過    av_p_packet 拷貝,也可以由FFMPEG的API產生(如av_read_frame),使用之後需要通過調用av_free_packet釋放。

av_free_packet調用的是結構體本身的destruct函數,它的值有兩種情況:(1)av_destruct_packet_nofree或 0;(2)av_destruct_packet,其中,前者僅僅是將data和size的值清0而已,後者才會真正地釋放緩沖區。FFMPEG內部使用 AVPacket結構建立緩沖區裝載數據,同時提供destruct函數,如果FFMPEG打算自己維護緩沖區,則將destruct設為 av_destruct_packet_nofree,用戶調用av_free_packet清理緩沖區時並不能夠將其釋放;如果FFMPEG不會再使用 該緩沖區,則將destruct設為av_destruct_packet,表示它能夠被釋放。對於緩沖區不能夠被釋放的AVPackt,用戶在使用之前 最好調用av_p_packet進行緩沖區的克隆,將其轉化為緩沖區能夠被釋放的AVPacket,以免對緩沖區的不當佔用造成異常錯誤。而 av_p_packet會為destruct指針為av_destruct_packet_nofree的AVPacket新建一個緩沖區,然後將原 緩沖區的數據拷貝至新緩沖區,置data的值為新緩沖區的地址,同時設destruct指針為av_destruct_packet。

AVFrame

構體保存的是解碼後和原始的音視頻信息。AVFrame通過函數av_frame_alloc()初始化,該函數僅僅分配AVFrame實例本身,而沒有分配其內部的緩存。AVFrame實例由av_frame_free()釋放;AVFrame實例通常分配一次,重復使用,如分配一個AVFrame實例來保留解碼器中輸出的視頻幀(此時應在恰當的時候使用av_frame_unref()清理參考幀並將AVFrame歸零)。該類所描述的數據通常由AVBuffer的API來保存一個引用計數,並保存於AVFrame.buf

/AVFrame.extended_buf,在至少存在一個參考的時候(如AVFrame.buf[0] != NULL),則該對象被標記為「被引用」。在此情況下,AVFrame所包含的每一組數據必須包含於AVFrame的緩存中。

AAC格式ADTS

ADTS流 跟Raw流,

1.ADTS是個啥

ADTS全稱是(Audio Data Transport Stream),是AAC的一種十分常見的傳輸格式。

AAC解碼器都需要把AAC的ES流打包成ADTS的格式,一般是在AAC ES流前添加7個位元組的ADTS header。也就是說你可以吧ADTS這個頭看作是AAC的frameheader。

ffmpeg寫 mp4+aac時呢,音頻有兩個值得注意的地方。

1 寫aac音頻時,要添加兩個位元組的信息到AVCodecContext.

2 ffmpeg 寫AAC音頻數據不能含有ADTS頭

在AAC ES流前添加7個位元組的ADTS header。也就是說你可以吧ADTS這個頭看作是AAC的frameheader。

tvOS必須要支持 bitcode. (iOS bitcode項可選的) 所以在編譯的時候Makefile要加上 CFLAGS= -fembed-bitcode 。 如果用xcode編譯lib,要在Build Settings—>custom compiler flags —>cflags 加上OTHER_CFLAGS="-fembed-bitcode" 。

FFmpeg優化

1 內存優化。內存往上漲。沒能及時回收。最好能夠使用手動管理內存。

解碼優化,看ffmpeg文檔,最新的解碼庫,解碼效率,穩定性,綜合性考慮。

YUV->RGB  OpenGLES shader來顯示。

FFmpeg轉碼

1.分離視頻音頻流

ffmpeg -i input_file -vcodec -an output_file_video//分離視頻流

ffmpeg -i input_file -acodec -vn output_file_audio//分離音頻流

2.視頻解復用

ffmpeg –i test.mp4 –vcodec –an –f m4v test.264

ffmpeg –i test.avi –vcodec –an –f m4v test.264

3.視頻轉碼

ffmpeg –i test.mp4 –vcodec h264 –s 352 278 –an –f m4v test.264              //轉碼為碼流原始文件

ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352

278 –an –f m4v test.264  //轉碼為碼流原始文件

ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi            //轉碼為封裝文件

//-bf B幀數目控制,-g 關鍵幀間隔控制,-s 解析度控制

4.視頻封裝

ffmpeg –i video_file –i audio_file –vcodec –acodec output_file

5.視頻剪切

ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg        //提取圖片

ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec -acodec output.avi    //剪切視頻

//-r 提取圖像的頻率,-ss 開始時間,-t 持續時間

6.視頻錄制

ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec out.avi

7.YUV序列播放

ffplay -f rawvideo -video_size 1920x1080 input.yuv

8.YUV序列轉AVI

ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi

system調用

#include<stdio.h>#include<string.h>intmain(){charcommand[50];strcpy(command,"ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi");system(command);return(0);}

FFMpeg 中比較重要的函數以及數據結構如下:

數據結構:

(1) AVFormatContext

(2) AVOutputFormat

(3) AVInputFormat

(4) AVCodecContext

(5) AVCodec

(6) AVFrame

(7) AVPacket

(8) AVPicture

(9) AVStream

初始化函數:

(1) av_register_all()

(2) avcodec_open()

(3) avcodec_close()

(4) av_open_input_file()

(5) av_find_input_format()

(6) av_find_stream_info()

(7) av_close_input_file()

音視頻編解碼函數:

(1) avcodec_find_decoder()

(2) avcodec_alloc_frame()

(3) avpicture_get_size()

(4) avpicture_fill()

(5) img_convert()

(6) avcodec_alloc_context()

(7) avcodec_decode_video()

(8) av_free_packet()

(9) av_free()

文件操作:

(1) avnew_steam()

(2) av_read_frame()

(3) av_write_frame()

(4) mp_format()

其他函數:

(1) avpicture_deinterlace()

(2) ImgReSampleContext()

C. 監控視頻壓縮編解碼的介紹

(一)、M-JPEG
M-JPEG(Motion- Join Photographic Experts Group)技術即運動靜止圖像(或逐幀)壓縮技術,廣泛應用於非線性編輯領域可精確到幀編輯和多層圖像處理,把運動的視頻序列作為連續的靜止圖像來處理,這種壓縮方式單獨完整地壓縮每一幀,在編輯過程中可隨機存儲每一幀,可進行精確到幀的編輯,此外M-JPEG的壓縮和解壓縮是對稱的,可由相同的硬體和軟體實現。但M-JPEG只對幀內的空間冗餘進行壓縮。不對幀間的時間冗餘進行壓縮,故壓縮效率不高。採用M-JPEG數字壓縮格式,當壓縮比7:1時,可提供相當於Betecam SP質量圖像的節目。
JPEG標准所根據的演算法是基於DCT(離散餘弦變換)和可變長編碼。JPEG的關鍵技術有變換編碼、量化、差分編碼、運動補償、霍夫曼編碼和遊程編碼等
M-JPEG的優點是:可以很容易做到精確到幀的編輯、設備比較成熟。缺點是壓縮效率不高。
此外,M-JPEG這種壓縮方式並不是一個完全統一的壓縮標准,不同廠家的編解碼器和存儲方式並沒有統一的規定格式。這也就是說,每個型號的視頻伺服器或編碼板有自己的M-JPEG版本,所以在伺服器之間的數據傳輸、非線性製作網路向伺服器的數據傳輸都根本是不可能的。
(二)、MPEG系列標准
MPEG是活動圖像專家組(Moving Picture Exports Group)的縮寫,於1988年成立,是為數字視/音頻制定壓縮標準的專家組,目前已擁有300多名成員,包括IBM、SUN、BBC、NEC、INTEL、AT&T等世界知名公司。MPEG組織最初得到的授權是制定用於「活動圖像」編碼的各種標准,隨後擴充為「及其伴隨的音頻」及其組合編碼。後來針對不同的應用需求,解除了「用於數字存儲媒體」的限制,成為現在制定「活動圖像和音頻編碼」標準的組織。MPEG組織制定的各個標准都有不同的目標和應用,目前已提出MPEG-1、MPEG-2、MPEG-4、MPEG-7和MPEG-21標准。
1.MPEG-1標准
MPEG-1標准於1993年8月公布,用於傳輸1.5Mbps數據傳輸率的數字存儲媒體運動圖像及其伴音的編碼。該標准包括五個部分:
第一部分說明了如何根據第二部分(視頻)以及第三部分(音頻)的規定,對音頻和視頻進行復合編碼。第四部分說明了檢驗解碼器或編碼器的輸出比特流符合前三部分規定的過程。第五部分是一個用完整的C語言實現的編碼和解碼器。
該標准從頒布的那一刻起,MPEG-1取得一連串的成功,如VCD和MP3的大量使用,Windows95以後的版本都帶有一個MPEG-1軟體解碼器,可攜式MPEG-1攝像機等等。
2.MPEG-2標准
MPEG組織於1994年推出MPEG-2壓縮標准,以實現視/音頻服務與應用互操作的可能性。MPEG-2標準是針對標准數字電視和高清晰度電視在各種應用下的壓縮方案和系統層的詳細規定,編碼碼率從每秒3兆比特~100兆比特,標準的正式規范在ISO/IEC13818中。MPEG-2不是MPEG-1的簡單升級,MPEG-2在系統和傳送方面作了更加詳細的規定和進一步的完善。MPEG-2特別適用於廣播級的數字電視的編碼和傳送,被認定為SDTV和HDTV的編碼標准。
MPEG-2圖像壓縮的原理是利用了圖像中的兩種特性:空間相關性和時間相關性。這兩種相關性使得圖像中存在大量的冗餘信息。如果我們能將這些冗餘信息去除,只保留少量非相關信息進行傳輸,就可以大大節省傳輸頻帶。而接收機利用這些非相關信息,按照一定的解碼演算法,可以在保證一定的圖像質量的前提下恢復原始圖像。一個好的壓縮編碼方案就是能夠最大限度地去除圖像中的冗餘信息。
MPEG-2的編碼圖像被分為三類,分別稱為I幀,P幀和B幀。
I幀圖像採用幀內編碼方式,即只利用了單幀圖像內的空間相關性,而沒有利用時間相關性。P幀和B幀圖像採用幀間編碼方式,即同時利用了空間和時間上的相關性。P幀圖像只採用前向時間預測,可以提高壓縮效率和圖像質量。P幀圖像中可以包含幀內編碼的部分,即P幀中的每一個宏塊可以是前向預測,也可以是幀內編碼。B幀圖像採用雙向時間預測,可以大大提高壓縮倍數。
MPEG-2的編碼碼流分為六個層次。為更好地表示編碼數據,MPEG-2用句法規定了一個層次性結構。它分為六層,自上到下分別是:圖像序列層、圖像組(GOP)、圖像、宏塊條、宏塊、塊。
MPEG-2標准在廣播電視領域中的主要應用如下:
(1)視音頻資料的保存
一直以來,電視節目、音像資料等都是用磁帶保存的。這種方式有很多弊端:易損,佔地大,成本高,難於重新使用。更重要的是難以長期保存,難以查找、難以共享。隨著計算機技術和視頻壓縮技術的發展,高速寬頻計算機網路以及大容量數據存儲系統給電視台節目的網路化存儲、查詢、共享、交流提供了可能。
採用MPEG-2壓縮編碼的DVD視盤,給資料保存帶來了新的希望。電視節目、音像資料等可通過MPEG-2編碼系統編碼,保存到低成本的CD-R光碟或高容量的可擦寫DVD-RAM上,也可利用DVD編著軟體(如Daikin Scenarist NT、Spruce DVDMaestro等)製作成標準的DVD視盤,既可節約開支,也可節省存放空間。
(2)電視節目的非線性編輯系統及其網路
在非線性編輯系統中,節目素材是以數字壓縮方式存儲、製作和播出的, 視頻壓縮技術是非線性編輯系統的技術基礎。目前主要有M-JPEG和MPEG-2兩種數字壓縮格式。
M-JPEG技術即運動靜止圖像(或逐幀)壓縮技術,可進行精確到幀的編輯,但壓縮效率不高。
MPEG-2採用幀間壓縮的方式,只需進行I幀的幀內壓縮處理,B幀和P幀通過偵測獲得,因此 ,傳輸和運算的數據大多由幀之間的時間相關性得到,相對來說,數據量小,可以實現較高的壓縮比。隨著逐幀編輯問題的解決,MPEG-2將廣泛應用於非線性編輯系統,並大大地降低編輯成本,同時MPEG-2的解壓縮是標準的,不同廠家設計的壓縮器件壓縮的數據可由其他廠家設計解壓縮器來解壓縮,這一點保證了各廠家的設備之間能完全兼容。
由於採用MPEG-2 IBP視頻壓縮技術,數據量成倍減少,降低了存儲成本,提高了數據傳輸速度,減少了對計算機匯流排和網路帶寬的壓力,可採用純乙太網組建非線性編輯網路系統已成為可能,而在目前乙太網是最為成熟的網路,系統管理比較完善,價格也比較低廉。
基於MPEG-2的非線性編輯系統及非線性編輯網路將成為未來的發展方向。
(3)衛星傳輸
MPEG-2已經通過ISO認可,並在廣播領域獲得廣泛的應用,如數字衛星視頻廣播(DVB-S)、DVD視盤和視頻會議等。目前,全球有數以千萬計的DVB-S用戶,DVB-S信號採用MPEG-2壓縮格式編碼,通過衛星或微波進行傳輸,在用戶端經MPEG-2衛星接收解碼器解碼,以供用戶觀看。此外,採用MPEG-2壓縮編碼技術,還可以進行遠程電視新聞或節目的傳輸和交流。
(4)電視節目的播出
在整個電視技術中播出是一個承上啟下的環節,對播出系統進行數字化改造是非常必要的,其中最關鍵一步就是構建硬碟播出系統。MPEG-2硬碟自動播出系統因編播簡便、儲存容量大、視頻指標高等優點,而為人們所青睞。但以往MPEG-2播出設備因非常昂貴,而只有少量使用。隨著MPEG-2技術的發展和相關產品成本的下降,MPEG-2硬碟自動系統播出可望得到普及。
3.MPEG-4標准
運動圖像專家組MPEG 於1999年2月正式公布了MPEG-4(ISO/IEC14496)標准第一版本。同年年底MPEG-4第二版亦告底定,且於2000年年初正式成為國際標准。
MPEG-4與MPEG-1和MPEG-2有很大的不同。MPEG-4不只是具體壓縮演算法,它是針對數字電視、互動式繪圖應用(影音合成內容)、互動式多媒體(WWW、資料擷取與分散)等整合及壓縮技術的需求而制定的國際標准。MPEG-4標准將眾多的多媒體應用集成於一個完整的框架內,旨在為多媒體通信及應用環境提供標準的演算法及工具,從而建立起一種能被多媒體傳輸、存儲、檢索等應用領域普遍採用的統一數據格式。
MPEG-4的編碼理念是:MPEG-4標准同以前標準的最顯著的差別在於它是採用基於對象的編碼理念,即在編碼時將一幅景物分成若干在時間和空間上相互聯系的視頻音頻對象,分別編碼後,再經過復用傳輸到接收端,然後再對不同的對象分別解碼,從而組合成所需要的視頻和音頻。這樣既方便我們對不同的對象採用不同的編碼方法和表示方法,又有利於不同數據類型間的融合,並且這樣也可以方便的實現對於各種對象的操作及編輯。例如,我們可以將一個卡通人物放在真實的場景中,或者將真人置於一個虛擬的演播室里,還可以在互聯網上方便的實現交互,根據自己的需要有選擇的組合各種視頻音頻以及圖形文本對象。
MPEG-4系統的一般框架是:對自然或合成的視聽內容的表示;對視聽內容數據流的管理,如多點、同步、緩沖管理等;對靈活性的支持和對系統不同部分的配置。
與MPEG-1、MPEG-2相比,MPEG-4具有如下獨特的優點:
(1) 基於內容的交互性
MPEG-4提供了基於內容的多媒體數據訪問工具,如索引、超級鏈接、上下載、刪除等。利用這些工具,用戶可以方便地從多媒體資料庫中有選擇地獲取自己所需的與對象有關的內容,並提供了內容的操作和位流編輯功能,可應用於互動式家庭購物,淡入淡出的數字化效果等。MPEG-4提供了高效的自然或合成的多媒體數據編碼方法。它可以把自然場景或對象組合起來成為合成的多媒體數據。
(2)高效的壓縮性
MPEG-4基於更高的編碼效率。同已有的或即將形成的其它標准相比,在相同的比特率下,它基於更高的視覺聽覺質量,這就使得在低帶寬的信道上傳送視頻、音頻成為可能。同時MPEG-4還能對同時發生的數據流進行編碼。一個場景的多視角或多聲道數據流可以高效、同步地合成為最終數據流。這可用於虛擬三維游戲、三維電影、飛行模擬練習等
(3)通用的訪問性
MPEG-4提供了易出錯環境的魯棒性,來保證其在許多無線和有線網路以及存儲介質中的應用,此外,MPEG-4還支持基於內容的的可分級性,即把內容、質量、復雜性分成許多小塊來滿足不同用戶的不同需求,支持具有不同帶寬,不同存儲容量的傳輸信道和接收端。
這些特點無疑會加速多媒體應用的發展,從中受益的應用領域有:網際網路多媒體應用;廣播電視;互動式視頻游戲;實時可視通信;互動式存儲媒體應用;演播室技術及電視後期製作;採用面部動畫技術的虛擬會議;多媒體郵件;移動通信條件下的多媒體應用;遠程視頻監控;通過ATM網路等進行的遠程資料庫業務等。MPEG-4主要應用如下:
(1)應用於網際網路視音頻廣播
由於上網人數與日俱增,傳統電視廣播的觀眾逐漸減少,隨之而來的便是廣告收入的減少,所以現在的固定式電視廣播最終將轉向基於TCP/IP的網際網路廣播,觀眾的收看方式也由簡單的遙控器選擇頻道轉為網上視頻點播。視頻點播的概念不是先把節目下載到硬碟,然後再播放,而是流媒體視頻(streaming video),點擊即觀看,邊傳輸邊播放。
現在網際網路中播放視音頻的有:Real Networks公司的 Real Media,微軟公司的 Windows Media,蘋果公司的 QuickTime,它們定義的視音頻格式互不兼容,有可能導致媒體流中難以控制的混亂,而MPEG-4為網際網路視頻應用提供了一系列的標准工具,使視音頻碼流具有規范一致性。因此在網際網路播放視音頻採用MPEG-4,應該說是一個安全的選擇。
(2)應用於無線通信
MPEG-4高效的碼率壓縮,交互和分級特性尤其適合於在窄帶移動網上實現多媒體通信,未來的手機將變成多媒體移動接收機,不僅可以打移動電視電話、移動上網,還可以移動接收多媒體廣播和收看電視。
(3)應用於靜止圖像壓縮
靜止圖像(圖片)在網際網路中大量使用,現在網上的圖片壓縮多採用JPEG技術。MPEG-4中的靜止圖像(紋理)壓縮是基於小波變換的,在同樣質量條件下,壓縮後的文件大小約是JPEG壓縮文件的十分之一。把網際網路上使用的JPEG圖片轉換成MPEG-4格式,可以大幅度提高圖片在網路中的傳輸速度。
(4)應用於電視電話
傳統用於窄帶電視電話業務的壓縮編碼標准,如H261,採用幀內壓縮、幀間壓縮、減少象素和抽幀等辦法來降低碼率,但編碼效率和圖像質量都難以令人滿意。MPEG-4的壓縮編碼可以做到以極低碼率傳送質量可以接受的聲像信號,使電視電話業務可以在窄帶的公用電話網上實現。
(5)應用於計算機圖形、動畫與模擬
MPEG-4特殊的編碼方式和強大的交互能力,使得基於MPEG-4的計算機圖形和動畫可以從各種來源的多媒體資料庫中獲取素材,並實時組合出所需要的結果。因而未來的計算機圖形可以在MPEG-4語法所允許的范圍內向所希望的方向無限發展,產生出今天無法想像的動畫及模擬效果。
(6)應用於電子游戲
MPEG-4可以進行自然圖像與聲音同人工合成的圖像與聲音的混合編碼,在編碼方式上具有前所未有的靈活性,並且能及時從各種來源的多媒體資料庫中調用素材。這可以在將來產生象電影一樣的電子游戲,實現極高自由度的互動式操作。
(三)H.264
H.264是ITU-T的VCEG(視頻編碼專家組)和ISO/IEC的MPEG(活動圖像編碼專家組)的聯合視頻組(JVT:joint video team)開發的一個新的數字視頻編碼標准,它既是ITU-T的H.264,又是ISO/IEC的MPEG-4的第10 部分。1998年1月份開始草案徵集,1999年9月,完成第一個草案,2001年5月制定了其測試模式TML-8,2002年6月的 JVT第5次會議通過了H.264的FCD板。2003年3月正式發布。
H.264和以前的標准一樣,也是DPCM加變換編碼的混合編碼模式。但它採用回歸基本的簡潔設計,不用眾多的選項,獲得比H.263++好得多的壓縮性能;加強了對各種信道的適應能力,採用網路友好的結構和語法,有利於對誤碼和丟包的處理;應用目標范圍較寬,以滿足不同速率、不同解析度以及不同傳輸(存儲)場合的需求;它的基本系統是開放的,使用無需版權。
在技術上,H.264標准中有多個閃光之處,如統一的VLC符號編碼,高精度、多模式的位移估計,基於4×4塊的整數變換、分層的編碼語法等。這些措施使得H.264演算法具有很的高編碼效率,在相同的重建圖像質量下,能夠比H.263節約50%左右的碼率。H.264的碼流結構網路適應性強,增加了差錯恢復能力,能夠很好地適應IP和無線網路的應用。 H.264的演算法在概念上可以分為兩層:視頻編碼層(VCL:Video Coding Layer)負責高效的視頻內容表示,網路提取層(NAL:Network Abstraction Layer)負責以網路所要求的恰當的方式對數據進行打包和傳送。在VCL和NAL之間定義了一個基於分組方式的介面,打包和相應的信令屬於NAL的一部分。這樣,高編碼效率和網路友好性的任務分別由VCL和NAL來完成。
VCL層包括基於塊的運動補償混合編碼和一些新特性。與前面的視頻編碼標准一樣,H.264沒有把前處理和後處理等功能包括在草案中,這樣可以增加標準的靈活性。
NAL負責使用下層網路的分段格式來封裝數據,包括組幀、邏輯信道的信令、定時信息的利用或序列結束信號等。例如,NAL支持視頻在電路交換信道上的傳輸格式,支持視頻在Internet上利用RTP/UDP/IP傳輸的格式。NAL包括自己的頭部信息、段結構信息和實際載荷信息,即上層的VCL數據。(如果採用數據分割技術,數據可能由幾個部分組成)。 H.264支持1/4或1/8像素精度的運動矢量。在1/4像素精度時可使用6抽頭濾波器來減少高頻雜訊,對於1/8像素精度的運動矢量,可使用更為復雜的8抽頭的濾波器。在進行運動估計時,編碼器還可選擇增強內插濾波器來提高預測的效果。
在H.264的運動預測中,一個宏塊(MB)可以按圖2被分為不同的子塊,形成7種不同模式的塊尺寸。這種多模式的靈活和細致的劃分,更切合圖像中實際運動物體的形狀,大大提高了運動估計的精確程度。在這種方式下,在每個宏塊中可以包含有1、2、4、8或16個運動矢量。
在H.264中,允許編碼器使用多於一幀的先前幀用於運動估計,這就是所謂的多幀參考技術。例如2幀或3幀剛剛編碼好的參考幀,編碼器將選擇對每個目標宏塊能給出更好的預測幀,並為每一宏塊指示是哪一幀被用於預測。 H.264與先前的標准相似,對殘差採用基於塊的變換編碼,但變換是整數操作而不是實數運算,其過程和DCT基本相似。這種方法的優點在於:在編碼器中和解碼器中允許精度相同的變換和反變換,便於使用簡單的定點運算方式。也就是說,這里沒有反變換誤差。 變換的單位是4×4塊,而不是以往常用的8×8塊。由於用於變換塊的尺寸縮小,運動物體的劃分更精確,這樣,不但變換計算量比較小,而且在運動物體邊緣處的銜接誤差也大為減小。為了使小尺寸塊的變換方式對圖像中較大面積的平滑區域不產生塊之間的灰度差異,可對幀內宏塊亮度數據的16個4×4塊的DC系數(每個小塊一個,共16個)進行第二次4×4塊的變換,對色度數據的4個4×4塊的DC系數(每個小塊一個,共4個)進行2×2塊的變換。
H.264為了提高碼率控制的能力,量化步長的變化的幅度控制在12.5%左右,而不是以不變的增幅變化。變換系數幅度的歸一化被放在反量化過程中處理以減少計算的復雜性。為了強調彩色的逼真性,對色度系數採用了較小量化步長。 在先前的H.26x系列和MPEG-x系列標准中,都是採用的幀間預測的方式。在H.264中,當編碼Intra圖像時可用幀內預測。對於每個4×4塊(除了邊緣塊特別處置以外),每個像素都可用17個最接近的先前已編碼的像素的不同加權和(有的權值可為0)來預測,即此像素所在塊的左上角的17個像素。顯然,這種幀內預測不是在時間上,而是在空間域上進行的預測編碼演算法,可以除去相鄰塊之間的空間冗餘度,取得更為有效的壓縮。
如圖4所示,4×4方塊中a、b、...、p為16 個待預測的像素點,而A、B、...、P是已編碼的像素。如m點的值可以由(J+2K+L+2)/ 4 式來預測,也可以由(A+B+C+D+I+J+K+L)/ 8 式來預測,等等。按照所選取的預測參考的點不同,亮度共有9類不同的模式,但色度的幀內預測只有4類模式。 H.264 草案中包含了用於差錯消除的工具,便於壓縮視頻在誤碼、丟包多發環境中傳輸,如移動信道或IP信道中傳輸的健壯性。
為了抵禦傳輸差錯,H.264視頻流中的時間同步可以通過採用幀內圖像刷新來完成,空間同步由條結構編碼(slice structured coding)來支持。同時為了便於誤碼以後的再同步,在一幅圖像的視頻數據中還提供了一定的重同步點。另外,幀內宏塊刷新和多參考宏塊允許編碼器在決定宏塊模式的時候不僅可以考慮編碼效率,還可以考慮傳輸信道的特性。
除了利用量化步長的改變來適應信道碼率外,在H.264中,還常利用數據分割的方法來應對信道碼率的變化。從總體上說,數據分割的概念就是在編碼器中生成具有不同優先順序的視頻數據以支持網路中的服務質量QoS。例如採用基於語法的數據分割(syntax-based data partitioning)方法,將每幀數據的按其重要性分為幾部分,這樣允許在緩沖區溢出時丟棄不太重要的信息。還可以採用類似的時間數據分割(temporal data partitioning)方法,通過在P幀和B幀中使用多個參考幀來完成。
在無線通信的應用中,我們可以通過改變每一幀的量化精度或空間/時間解析度來支持無線信道的大比特率變化。可是,在多播的情況下,要求編碼器對變化的各種比特率進行響應是不可能的。因此,不同於MPEG-4中採用的精細分級編碼FGS(Fine Granular Scalability)的方法(效率比較低),H.264採用流切換的SP幀來代替分級編碼。
四、H.264的性能比較
TML-8為H.264的測試模式,用它來對H.264的視頻編碼效率進行比較和測試。測試結果所提供的PSNR已清楚地表明,相對於MPEG-4(ASP:Advanced Simple Profile)和H.263++(HLP:High Latency Profile)的性能,H.264的結果具有明顯的優越性。
H.264的PSNR比MPEG-4(ASP)和H.263++(HLP)明顯要好,在6種速率的對比測試中,H.264的PSNR比MPEG-4(ASP)平均要高2dB,比H.263(HLP)平均要高3dB。6個測試速率及其相關的條件分別為:32 kbit/s速率、10f/s幀率和QCIF格式;64 kbit/s速率、15f/s幀率和QCIF格式;128kbit/s速率、15f/s幀率和CIF格式;256kbit/s速率、15f/s幀率和QCIF格式;512 kbit/s速率、30f/s幀率和CIF格式;1024 kbit/s速率、30f/s幀率和CIF格式。

熱點內容
演算法左神 發布:2024-10-04 20:23:55 瀏覽:909
lol手游如何配置技能 發布:2024-10-04 20:17:11 瀏覽:860
伺服器兩根心跳線ip一樣嗎 發布:2024-10-04 20:17:03 瀏覽:553
java無狀態 發布:2024-10-04 20:15:40 瀏覽:727
電信為什麼限制上傳速度 發布:2024-10-04 20:11:28 瀏覽:815
編程哪個培訓機構好 發布:2024-10-04 19:55:14 瀏覽:59
安卓上的傳奇是什麼意思 發布:2024-10-04 19:37:25 瀏覽:277
在資源管理器中文件與文件夾 發布:2024-10-04 19:32:17 瀏覽:970
微笑的編程 發布:2024-10-04 19:04:38 瀏覽:234
28歲學編程 發布:2024-10-04 18:56:24 瀏覽:187