版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
淘寶店鋪:
技術(shù)論壇:《手把手教你學(xué)STM32》主講人:正點(diǎn)原子團(tuán)隊(duì)硬件平臺:正點(diǎn)原子STM32開發(fā)板版權(quán)所有:廣州市星翼電子科技有限公司淘寶店鋪:技術(shù)論壇:
開源電子網(wǎng)公眾平臺:“正點(diǎn)原子”官方網(wǎng)站:聯(lián)系電話LIENTEK《手把手教你學(xué)STM32》視頻播放器實(shí)驗(yàn)淘寶店鋪:
技術(shù)論壇:STM32F1xx開發(fā)板(正點(diǎn)原子)STM32F4xx開發(fā)板(正點(diǎn)原子)適用平臺本視頻重點(diǎn)參考資料淘寶店鋪:
技術(shù)論壇:參考資料:1,探索者STM32F407開發(fā)板《STM32F4開發(fā)指南-庫函數(shù)版本》——視頻播放器實(shí)驗(yàn)
2,AVI文件格式參考資料見光盤:軟件資料AVI學(xué)習(xí)資料AVI文件格式詳解.docx3,libjpeg參考資料見光盤:軟件資料AVI學(xué)習(xí)資料IJG(libjpeg)資料①使用IJG讀寫JPEG格式文件.pdf②源碼jpegsr9a.ziplibjpeg.txt本例程還外涉及到:液晶、FSMC、SD卡、SDIO、WM8978、I2S等相關(guān)知識,默認(rèn)大家都已經(jīng)學(xué)會!如不懂,請先學(xué)習(xí)相關(guān)教程。目錄淘寶店鋪:
技術(shù)論壇:AVI&libjpeg簡介1
硬件連接2
源碼講解&例程測試31、AVI&libjpeg簡介-什么是AVI?淘寶店鋪:
技術(shù)論壇:AVI
(AudioVideoInterleaved)是微軟開發(fā)的一種符合RIFF文件規(guī)范的數(shù)字音視頻交錯文件格式
。AVI格式允許視頻和音頻交錯在一起同步播放,支持256色和RLE壓縮,但AVI文件并未限定壓縮標(biāo)準(zhǔn),AVI僅僅是一個容器,用不同壓縮算法(比如:H.264/MPEG4/MJPEG等)生成的AVI文件,必須使用相應(yīng)的解壓縮算法才能播放出來。比如本章,我們使用的AVI,其音頻數(shù)據(jù)采用16位線性PCM格式(未壓縮),而視頻數(shù)據(jù),則采用MJPEG編碼方式。1、AVI&libjpeg簡介-RIFF格式簡介淘寶店鋪:
技術(shù)論壇:RIFF(ResourceInterchangeFileFormat,資源互換文件格式)是微軟定義的一種用于管理WINDOWS環(huán)境中多媒體數(shù)據(jù)的文件格式,波形音頻WAVE,MIDI和數(shù)字視頻AVI都采用這種格式存儲。構(gòu)造RIFF文件的基本單元叫做數(shù)據(jù)塊(Chunk),每個數(shù)據(jù)塊包含3個部分:整個RIFF文件可以看成一個數(shù)據(jù)塊,其數(shù)據(jù)塊ID為"RIFF",稱為RIFF塊。一個RIFF文件中只有一個RIFF塊。RIFF塊中包含一系列的子塊,其中有一種子塊的ID為"LIST",稱為LIST塊,LIST塊中可以再包含一系列的子塊,但除了LIST塊外的其他所有子塊都不能再包含子塊。1、數(shù)據(jù)塊標(biāo)記(或者叫做數(shù)據(jù)塊的ID,4字節(jié))2、數(shù)據(jù)塊的大小(4字節(jié))3、數(shù)據(jù)1、AVI&libjpeg簡介-RIFF格式簡介淘寶店鋪:
技術(shù)論壇:RIFF和LIST塊分別比普通的數(shù)據(jù)塊多一個被稱為形式類型(FormType)和列表類型(ListType)的數(shù)據(jù)域,其組成如下:1、數(shù)據(jù)塊標(biāo)記(ChunkID,4字節(jié))2、數(shù)據(jù)塊的大?。?字節(jié))3、形式類型或者列表類型(ID,4字節(jié))4、數(shù)據(jù)1、AVI&libjpeg簡介-AVI文件結(jié)構(gòu)淘寶店鋪:
技術(shù)論壇:AVI文件是目前使用的最復(fù)雜的RIFF文件,它能同時存儲同步表現(xiàn)的音頻視頻數(shù)據(jù)。AVI的RIFF塊的形式類型(FormType)是AVI,它一般包含3個子塊,如下所述:1、信息塊,一個ID為"hdrl"的LIST塊,定義AVI文件的數(shù)據(jù)格式。2、數(shù)據(jù)塊,一個ID為"movi"的LIST塊,包含AVI的音視頻序列數(shù)據(jù)。3、索引塊,ID為"idxl"的子塊,定義"movi"LIST塊的索引數(shù)據(jù),是可選塊(不一定有)。typedefstruct{ u32ListID; //ListID=='LIST'==0X4c495354u32BlockSize; //塊大小(不包含最初的8字節(jié),也ListID和BlockSize不計(jì)算在內(nèi))u32ListType; //LIST子塊類型:hdrl(信息塊)/movi(數(shù)據(jù)塊)}LIST_HEADER;LIST塊信息定義(不包括其數(shù)據(jù)域)如下所示:1、AVI&libjpeg簡介-AVI文件結(jié)構(gòu)淘寶店鋪:
技術(shù)論壇:AVI文件結(jié)構(gòu)圖,如右圖所示,從圖中可以看出(注意‘AVI’,是帶了一個空格的),AVI文件是由:信息塊(HeaderList)、數(shù)據(jù)塊(MovieList)和索引塊(IndexChunk)等三部分組成。接下來,我們分別介紹下這幾個部分。1、AVI&libjpeg簡介-AVI文件組成淘寶店鋪:
技術(shù)論壇:①信息塊(HeaderList),即ID為“hdrl”的LIST塊,它包含文件的通用信息,數(shù)據(jù)格式,所用的壓縮算法等。hdrl塊還包括了一系列的子塊,首先是:avih塊,用于記錄AVI的全局信息,比如數(shù)據(jù)流數(shù)量,視頻圖像的寬度和高度等信息,avih塊(均包含BlockID和BlockSize,下同)的定義如下://avih子塊信息typedefstruct{ u32BlockID; //塊標(biāo)志:avih==0X61766968u32BlockSize; //塊大小(不包含最初的8字節(jié),即BlockID和BlockSize不算)u32SecPerFrame; //視頻幀間隔時間(單位為us)u32MaxByteSec; //最大數(shù)據(jù)傳輸率,字節(jié)/秒u32PaddingGranularity; //數(shù)據(jù)填充的粒度u32Flags; //AVI文件的全局標(biāo)記,比如是否含有索引塊等u32TotalFrame; //文件總幀數(shù)u32InitFrames; //為交互格式指定初始幀數(shù)(非交互格式應(yīng)該指定為0)u32Streams; //包含的數(shù)據(jù)流種類個數(shù),通常為2u32RefBufSize; //建議讀取本文件的緩存大?。☉?yīng)能容納最大的塊)u32Width; //圖像寬u32Height; //圖像高u32Reserved[4]; //保留}AVIH_HEADER;1、AVI&libjpeg簡介-AVI文件組成淘寶店鋪:
技術(shù)論壇:在avih塊之后,有一個或者多個strl子列表,文件中有多少種數(shù)據(jù)流(即前面的Streams),就有多少個strl子列表。
每個strl子列表,至少包括一個strh(StreamHeader)塊和一個strf(StreamFormat)塊,另有strn(StreamName)塊(可選,不一定有)。
注意:strl子列表出現(xiàn)的順序與媒體流的編號是對應(yīng)的(比如:00dc,前面的00,即媒體流編號00)。比如第一個strl子列表說明的是第一個流(Stream0),假設(shè)是視頻流,則表征視頻數(shù)據(jù)塊的四字符碼為“00dc”,第二個strl子列表說明的是第二個流(Stream1),假設(shè)是音頻流,則表征音頻數(shù)據(jù)塊的四字符碼為“01wb”,以此類推。1、AVI&libjpeg簡介-AVI文件組成淘寶店鋪:
技術(shù)論壇:先看strh子塊,該塊用于說明這個流的頭信息,strh定義如右側(cè)代碼所示:
其中,對我們最有用的即StreamType和Handler這兩個參數(shù)。StreamType用于表示數(shù)據(jù)流類型;
Handler則告訴我們所使用的解碼器,比如MJPG/H264等。
//strh流頭子塊信息(strh∈strl)typedefstruct{ u32BlockID; //塊標(biāo)志:strh==0X73747268u32BlockSize; //塊大小(不包含最初的8字節(jié),即BlockID和BlockSize不算)u32StreamType; //數(shù)據(jù)流種類,vids(0X73646976):視頻;//auds(0X73647561):音頻u32Handler; //指定流的處理者,即解碼器,如MJPG/H264等.u32Flags; //標(biāo)記:是否允許這個流輸出?調(diào)色板是否變化?u16Priority; //流優(yōu)先級(有多個同類型的流時優(yōu)先級最高的為默認(rèn)流)u16Language; //音頻的語言代號u32InitFrames; //為交互格式指定初始幀數(shù)u32Scale; //數(shù)據(jù)量,視頻每楨的大小或者音頻的采樣大小u32Rate; //Scale/Rate=每秒采樣數(shù)u32Start; //數(shù)據(jù)流開始播放的位置,單位為Scaleu32Length; //數(shù)據(jù)流的數(shù)據(jù)量,單位為Scaleu32RefBufSize; //建議使用的緩沖區(qū)大小u32Quality; //解壓縮質(zhì)量參數(shù),值越大,質(zhì)量越好u32SampleSize; //音頻的樣本大小struct //視頻幀所占的矩形{ shortLeft;shortTop;shortRight;shortBottom;}Frame; }STRH_HEADER;對于音頻流,此值為:0X01,由strf確定音頻格式(WAV/MP3等)1、AVI&libjpeg簡介-AVI文件組成淘寶店鋪:
技術(shù)論壇:strf子塊,需要根據(jù)strh子塊的類型而定。如果strh子塊是視頻數(shù)據(jù)流(StreamType=“vids”),則strf子塊定義如右側(cè)代碼所示:
視頻流的strf包含2個結(jié)構(gòu),最有用的就是BMP_HEADER結(jié)構(gòu)體。它告訴我們視頻分辨率及其所用編碼器等重要信息。//BMP結(jié)構(gòu)體typedefstruct{ u32BmpSize; //bmp結(jié)構(gòu)體大小,包含(BmpSize在內(nèi))
longWidth; //圖像寬 longHeight; //圖像高 u16Planes; //平面數(shù),必須為1 u16BitCount; //像素位數(shù),0X0018表示24位
u32Compression; //壓縮類型,比如:MJPG/H264等 u32SizeImage; //圖像大小 longXpixPerMeter; //水平分辨率 longYpixPerMeter; //垂直分辨率 u32ClrUsed; //實(shí)際使用了調(diào)色板中的顏色數(shù),壓縮格式中不使用 u32ClrImportant; //重要的顏色}BMP_HEADER;//顏色表typedefstruct{ u8rgbBlue; //藍(lán)色的亮度(值范圍為0-255) u8rgbGreen; //綠色的亮度(值范圍為0-255) u8rgbRed; //紅色的亮度(值范圍為0-255) u8rgbReserved; //保留,必須為0}AVIRGBQUAD;//對于strh,如果是視頻流,strf(流格式)使STRH_BMPHEADER塊typedefstruct{ u32BlockID; //塊標(biāo)志,strf==0X73747266 u32BlockSize; //塊大小(不含前8字節(jié),即BlockID和BlockSize不算) BMP_HEADERbmiHeader; //位圖信息頭 AVIRGBQUADbmColors[1]; //顏色表}STRF_BMPHEADER;1、AVI&libjpeg簡介-AVI文件組成淘寶店鋪:
技術(shù)論壇://對于strh,如果是音頻流,strf(流格式)使STRF_WAVHEADER塊typedefstruct{u32BlockID; //塊標(biāo)志,strf==0X73747266u32BlockSize; //塊大小(不包含最初的8字節(jié),即BlockID和BlockSize不算)u16FormatTag; //格式標(biāo)志:0X0001=PCM,0X0055=MP3...u16Channels; //聲道數(shù),一般為2,表示立體聲u32SampleRate; //音頻采樣率u32BaudRate; //波特率u16BlockAlign; //數(shù)據(jù)塊對齊標(biāo)志u16Size; //該結(jié)構(gòu)大小}STRF_WAVHEADER;如果strh子塊是音頻數(shù)據(jù)流(StreamType=“auds”),則strf子塊的內(nèi)容定義如下面代碼所示:本結(jié)構(gòu)體對音頻數(shù)據(jù)解碼起決定性的作用,他告訴我們音頻信號的編碼方式(FormatTag)、聲道數(shù)(Channels)和采樣率(SampleRate)等重要信息。本章例程僅支持PCM格式(FormatTag=0X0001)的音頻數(shù)據(jù)解碼。1、AVI&libjpeg簡介-AVI文件組成淘寶店鋪:
技術(shù)論壇:②數(shù)據(jù)塊(MovieList),即ID為“movi”的LIST塊,它包含AVI的音視頻序列數(shù)據(jù),是這個AVI文件的主體部分。音視頻數(shù)據(jù)塊交錯的嵌入在“movi”LIST塊里面,通過標(biāo)準(zhǔn)類型碼進(jìn)行區(qū)分,標(biāo)準(zhǔn)類型碼有如下4種:1,“##db”(非壓縮視頻幀)2,“##dc”(壓縮視頻幀)3,“##pc”(改用新的調(diào)色板)4,“##wb”(音頻幀)其中##是編號,得根據(jù)我們的數(shù)據(jù)流順序來確定,也就是前面的strl塊。比如,如果第一個strl塊是視頻數(shù)據(jù),那么對于視頻幀,標(biāo)準(zhǔn)類型碼就是:00dc。第二個strl塊是音頻數(shù)據(jù),那么對于音頻幀,標(biāo)準(zhǔn)類型碼就是:01wb。緊跟著標(biāo)準(zhǔn)類型碼的是4個字節(jié)的數(shù)據(jù)長度(不包含類型碼和長度參數(shù)本身),該長度必須是偶數(shù),如果讀到為奇數(shù),則加1即可。我們讀數(shù)據(jù)的時候,一般一次性要讀完一個標(biāo)準(zhǔn)類型碼所表征的數(shù)據(jù),方便解碼。1、AVI&libjpeg簡介-AVI文件組成淘寶店鋪:
技術(shù)論壇:③索引塊(IndexChunk)。
最后,緊跟在‘hdrl’列表和‘movi’列表之后的,就是AVI文件可選的索引塊。這個索引塊為AVI文件中每一個媒體數(shù)據(jù)塊進(jìn)行索引,并且記錄它們在文件中的偏移(可能相對于‘movi’列表,也可能相對于AVI文件開頭)。本例程我們用不到索引塊,這里就不詳細(xì)介紹了。
AVI文件的介紹,我們就介紹到這,有興趣的朋友,可以再看看光盤軟件資料AVI學(xué)習(xí)資料,里面的相關(guān)文檔1、AVI&libjpeg簡介-MJPEG簡介淘寶店鋪:
技術(shù)論壇:
經(jīng)過前面的介紹,我們對AVI文件有了一個比較深刻的了解。本例程我們將實(shí)現(xiàn)一個簡單的視頻播放器,可以實(shí)現(xiàn)AVI文件的解碼(播放)。本例程解碼的AVI文件,其音頻必須是16位線性PCM編碼,而視頻必須是MJPEG編碼。PCM解碼,我們在音樂播放器實(shí)驗(yàn)就已經(jīng)介紹過了,故我們只需要實(shí)現(xiàn)MJPEG的解碼,就可以完成視頻播放器的設(shè)計(jì)。MJPEG是一種基于靜態(tài)圖像壓縮技術(shù)JPEG發(fā)展起來的動態(tài)圖像壓縮技術(shù),可以生成序列化的運(yùn)動圖像。其主要特點(diǎn)是:基本不考慮視頻流中不同幀之間的變化,只單獨(dú)對某一幀進(jìn)行壓縮,其壓縮倍數(shù)為20~80倍,適合靜態(tài)畫面的壓縮。缺點(diǎn)就是:壓縮效率低,體積龐大。
MJPEG實(shí)際上就是一連串的JPEG圖片組成的,所以,我們只需要實(shí)現(xiàn)JPEG解碼,就可以完成MJPEG解碼。1、AVI&libjpeg簡介-什么是libjpeg?淘寶店鋪:
技術(shù)論壇:libjpeg是一個完全用C語言編寫的庫,包含了被廣泛使用的JPEG解碼、JPEG編碼和其他的JPEG功能的實(shí)現(xiàn)。
這個庫由IJG組織(IndependentJPEGGroup,即獨(dú)立JPEG小組)提供,并維護(hù)。libjpeg,目前最新版本為v9a,可以在:
這個網(wǎng)站下載到。libjpeg具有穩(wěn)定、兼容性強(qiáng)和解碼速度較快等優(yōu)點(diǎn)。1、AVI&libjpeg簡介-libjpegVSTJPGD淘寶店鋪:
技術(shù)論壇:在圖片顯示實(shí)驗(yàn),我們使用了TJPGD來做JPEG解碼,TJPGD的特點(diǎn)就是:占用資源少,但是解碼速度慢。在STM32F4上,同樣一張320*240的JPG圖片,用TJPGD來解碼,得120多ms,而用libjpeg,則只需要50ms左右即可完成解碼,明顯速度上libjpeg要快不少,使得解碼視頻成為可能。實(shí)際上,經(jīng)過我們優(yōu)化后的libjpeg,使用STM32F4,在不超頻的情況下,可以流暢播放480*272@10幀的MJPG視頻(帶音頻)。1、AVI&libjpeg簡介-libjpeg使用簡介淘寶店鋪:
技術(shù)論壇:關(guān)于libjpeg的移植,我們這里就不介紹了,請大家參考光盤源碼。關(guān)于libjpeg的移植和使用,其實(shí)在下載的libjpeg源碼里面,就有詳細(xì)介紹,大家重點(diǎn)可以看:readme.txt、filelist.txt、install.txt和libjpeg.txt等文件。接下來,我們重點(diǎn)介紹如何使用libjpeg來實(shí)現(xiàn)一個jpeg圖片的解碼,這個在libjpeg源碼里面:example.c,這個文件里面有簡單的示范代碼,在libjpeg.txt里面有相關(guān)步驟說明。接下來我們介紹使用libjpeg解碼JPEG的步驟。
1、AVI&libjpeg簡介-libjpeg使用簡介淘寶店鋪:
技術(shù)論壇:
libjpeg解碼JPEG的時候,會用到一個非常重要的結(jié)構(gòu)體:structjpeg_decompress_struct,定義成cinfo變量,該變量保存著jpeg數(shù)據(jù)的詳細(xì)信息,也保存著解碼之后輸出數(shù)據(jù)的詳細(xì)信息。
一般情況下,每次調(diào)用libjpeg庫API的時候都需要把這個變量作為第一個參數(shù)傳入。另外用戶也可以通過修改該變量來修改libjpeg行為,比如輸出數(shù)據(jù)格式,libjpeg庫可用的最大內(nèi)存等等。libjpeg將JPEG解碼分為8個步驟,接下來一一介紹。1、AVI&libjpeg簡介-libjpeg解碼步驟淘寶店鋪:
技術(shù)論壇:①分配,并初始化解碼對象結(jié)構(gòu)體(cinfo)。
這里做了兩件事:1,錯誤管理,2,初始化解碼對象。首先,錯誤管理使用setjmp和longjmp機(jī)制(不懂請百度)來實(shí)現(xiàn)類似C++的異常處理功能,外部代碼可以調(diào)用longjmp來跳轉(zhuǎn)到setjmp位置,執(zhí)行錯誤管理(釋放內(nèi)存,關(guān)閉文件等)。這里注冊了my_error_exit函數(shù),來執(zhí)行錯誤退出處理,另外,使用:my_emit_message函數(shù),來輸出警告信息,方便調(diào)試代碼。
然后,通過調(diào)用jpeg_create_decompress函數(shù)實(shí)現(xiàn)初始化解碼對象結(jié)構(gòu)體:cinfo。1、AVI&libjpeg簡介-libjpeg解碼步驟淘寶店鋪:
技術(shù)論壇:②指定數(shù)據(jù)源。示例代碼(指:example.c里面的JPEG解碼參考代碼,下同)用的是jpeg_stdio_src函數(shù)。本例程,我們用另外一個函數(shù)實(shí)現(xiàn)://初始化jpeg解碼數(shù)據(jù)源staticvoidjpeg_filerw_src_init(j_decompress_ptrcinfo){if(cinfo->src==NULL)/*firsttimeforthisJPEGobject?*/{cinfo->src=(structjpeg_source_mgr*)(*cinfo->mem->alloc_small)((j_common_ptr)cinfo,JPOOL_PERMANENT,sizeof(structjpeg_source_mgr));}cinfo->src->init_source=init_source;
cinfo->src->fill_input_buffer=fill_input_buffer;cinfo->src->skip_input_data=skip_input_data;cinfo->src->resync_to_restart=jpeg_resync_to_restart;/*usedefaultmethod*/cinfo->src->term_source=term_source;cinfo->src->bytes_in_buffer=0;/*forcesfill_input_bufferonfirstread*/cinfo->src->next_input_byte=NULL;/*untilbufferloaded*/}這里主要設(shè)置了cinfo->src各函數(shù)指針,用于獲取外部數(shù)據(jù)。fill_input_buffer用于填充數(shù)據(jù)給libjpegskip_input_data用于跳過一定字節(jié)的數(shù)據(jù)1、AVI&libjpeg簡介-libjpeg解碼步驟淘寶店鋪:
技術(shù)論壇:③讀取文件參數(shù)。
這個步驟,通過jpeg_read_header函數(shù)實(shí)現(xiàn),該函數(shù)將讀取JPEG的很多參數(shù),必須在解碼前調(diào)用。④設(shè)置解碼參數(shù)。示例代碼沒有做任何設(shè)置(使用默認(rèn)值)。本章代碼則做了設(shè)置,如下:cinfo->dct_method=JDCT_IFAST;cinfo->do_fancy_upsampling=0;這里,我們設(shè)置了使用快速整型DCT(離散余弦變換),并且設(shè)置do_fancy_upsampling的值為假(0),以提高解碼速度。1、AVI&libjpeg簡介-libjpeg解碼步驟淘寶店鋪:
技術(shù)論壇:⑤開始解碼。示例代碼里面先調(diào)用jpeg_start_decompress函數(shù),然后計(jì)算樣本輸出buffer大小,并為其申請內(nèi)存,為后續(xù)讀取解碼后的數(shù)據(jù)做準(zhǔn)備。
不過為了提高速度,本例程就沒做這些處理了,而是直接修改底層函數(shù):h2v1_merged_upsample和h2v2_merged_upsample(在jdmerge.c里面),將輸出的RGB數(shù)據(jù)轉(zhuǎn)換成RGB565,送給LCD。為了正確的輸出到LCD,我們在jpeg_start_decompress函數(shù)之后,加入如下代碼:LCD_Set_Window(imgoffx,imgoffy,cinfo->output_width,cinfo->output_height);//設(shè)置LCD顯示窗口大小LCD_WriteRAM_Prepare(); //開始寫入GRAM 解碼時,直接在h2v1_merged_upsample和h2v2_merged_upsample里面丟數(shù)據(jù)給LCD,實(shí)現(xiàn)jpeg解碼輸出到LCD。1、AVI&libjpeg簡介-libjpeg解碼步驟淘寶店鋪:
技術(shù)論壇:⑥循環(huán)讀取數(shù)據(jù)。
通過jpeg_read_scanlines函數(shù),循環(huán)解碼并讀取jpeg圖片數(shù)據(jù),實(shí)現(xiàn)jpeg解碼。示例代碼通過put_scanline_someplace函數(shù),輸出到某個地方(如lcd,文件等),本例程則直接輸出到LCD了,所以僅剩jpeg_read_scanlines函數(shù),循環(huán)調(diào)用即可實(shí)現(xiàn)jpegLCD的操作。⑦解碼結(jié)束。
解碼完成后,通過jpeg_finish_decompress函數(shù),結(jié)束jpeg解碼。⑧釋放解碼對象資源。在所有操作完成后,通過jpeg_destroy_decompress,釋放解碼過程中用到的資源(比如釋放內(nèi)存)。經(jīng)過這8步處理,即可完成一張jpeg圖片的解碼。詳細(xì)的代碼,請大家參考本例程源碼:mjpeg.c。libjepg的使用,就介紹到這里。淘寶店鋪:
技術(shù)論壇:1)初始化各外設(shè)要解碼視頻,相關(guān)外設(shè)肯定要先初始化好,比如:SDIO(驅(qū)動SD卡用)、I2S、DMA、WM8978、LCD和按鍵等。這些具體初始化過程,在前面的例程都有介紹,大同小異,這里就不再細(xì)說了。
2)讀取AVI文件,并解析要解碼,得先讀取avi文件,按之前的介紹,讀取出音視頻關(guān)鍵信息,音頻參數(shù):編碼方式、采樣率、位數(shù)和音頻流類型碼(01wb/00wb)等;視頻參數(shù):編碼方式、幀間隔、圖片尺寸和視頻流類型碼(00dc/01dc)等;共同的:數(shù)據(jù)流起始地址。有了這些參數(shù),我們便可以初始化音視頻解碼,為后續(xù)解碼做好準(zhǔn)備。
3)根據(jù)解析結(jié)果,設(shè)置相關(guān)參數(shù)根據(jù)第2步解析的結(jié)果,設(shè)置I2S的音頻采樣率和位數(shù),同時要讓視頻顯示在LCD中間區(qū)域,得根據(jù)圖片尺寸,設(shè)置LCD開窗時x,y方向的偏移量。
1、AVI&libjpeg簡介-avi視頻播放步驟-1淘寶店鋪:
技術(shù)論壇:4)讀取數(shù)據(jù)流,開始解碼
前面三步完成,就可以正式開始播放視頻了。讀取音視頻流數(shù)據(jù)(movi塊),根據(jù)類型碼,執(zhí)行音頻/視頻解碼。對于音頻數(shù)據(jù)(01wb/00wb),本例程只支持未壓縮的PCM數(shù)據(jù),所以,直接填充到DMA緩沖區(qū)即可,由DMA循環(huán)發(fā)送給WM8978,播放音頻。對于視頻數(shù)據(jù)(00dc/01dc),本例程只支持MJPG,通過libjpeg解碼,所以將視頻數(shù)據(jù)按前面所說的幾個步驟解碼即可。1、AVI&libjpeg簡介-avi視頻播放步驟-26)解碼完成,釋放資源最后在文件讀取完后(或者出錯了),需要釋放申請的內(nèi)存、恢復(fù)LCD窗口、關(guān)閉定時器、停止I2S播放音樂和關(guān)閉文
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GBT 4802.1-2008紡織品 織物起毛起球性能的測定 第1部分:圓軌跡法》專題研究報(bào)告
- 《GBT 22401-2008攝影 加工用化學(xué)品 無水焦亞硫酸鈉》專題研究報(bào)告
- 《FZT 52044-2017聚酰胺酯短纖維》專題研究報(bào)告-專家深度與行業(yè)前瞻
- 道路交通標(biāo)志安全課課件
- 2026年江西高考政治真題試卷
- 道法趣味知識競賽課件
- 2026年甘肅武威市高職單招語文考試題庫(附含答案)
- 2025中國肺移植生物樣本庫構(gòu)建臨床指南(2025年版)課件
- 返崗安全知識培訓(xùn)課件
- 達(dá)利員工培訓(xùn)計(jì)劃
- 清華大學(xué)教師教學(xué)檔案袋制度
- 公租房完整租賃合同范本
- 東南大學(xué)附屬中大醫(yī)院2026年招聘備考題庫及答案詳解參考
- GB/T 3098.5-2025緊固件機(jī)械性能第5部分:自攻螺釘
- 孟州市浩軒塑業(yè)有限公司年產(chǎn)200噸塑料包裝袋項(xiàng)目環(huán)評報(bào)告
- 衛(wèi)生院消防安全演練方案篇
- 電焊機(jī)操作JSA分析表
- 落地式鋼管腳手架工程搭拆施工方案
- 養(yǎng)老院健康檔案模板
- 新競爭環(huán)境下的企業(yè)發(fā)展戰(zhàn)略(培訓(xùn)講座課件PPT)
- 電力拖動自動控制系統(tǒng)-運(yùn)動控制系統(tǒng)(第5版)習(xí)題答案
評論
0/150
提交評論