999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

嵌入式Linux下基于FFmpeg的視頻硬件編解碼

2011-03-20 02:31:56劉建敏楊斌
單片機與嵌入式系統應用 2011年6期
關鍵詞:嵌入式設備

劉建敏,楊斌

(西南交通大學信息科學與技術學院,成都610031)

引 言

目前,智能手機、PDA和平板電腦等越來越多的嵌入式設備支持高清視頻采集和播放功能,高清視頻的采集或播放功能正廣泛用于游戲設備、監控設備、視頻會議設備和數字網絡電視等嵌入式系統中。這些功能的實現建立在高性能視頻硬件編解碼技術基礎之上。本文闡述了基于FFmpeg的H.264視頻硬件編解碼在S3C6410處理器上的實現方法,為數字娛樂、視頻監控和視頻通信系統開發過程中的高清視頻硬件編解碼的實現提供參考。

FFmpeg[1]是一個開源免費跨平臺的視頻和音頻流方案,屬于自由軟件。它包含非常先進的音頻/視頻編解碼庫libavcodec,提供了錄制、轉換以及流化音視頻的完整解決方案。FFmpeg支持MPEG4、FLV等40多種編碼,以及AVI、ASF等90多種解碼。目前國內較為流行的播放器暴風影音和國外較為流行的Mplayer在音頻/視頻編解碼方面都用到了FFmpeg。

S3C6410[2]是三星公司推出的應用處理器芯片,基于ARM11架構,主頻最高可達800MHz。它具有多媒體硬件板電腦和游戲機等手持移動設備和其他高性能嵌入式設備。國產手機魅族M8的處理器使用的就是S3C6410。

雖然FFmpeg提供了簡單的應用程序編程接口(API),可以很方便地實現多種格式的視頻軟件編解碼[3],但是軟件編解碼在處理復雜視頻編解碼(如H.264)時無法運用到處理速度不快、內存空間不多的嵌入式環境中。為了在資源有限的嵌入式環境下使用FFmpeg實現復雜視頻編解碼,下面在分析FFmpeg視頻編碼流程和S3C6410處理器視頻編解碼方法的基礎上,闡述嵌入式Linux操作系統下基于FFmpeg的H.264硬件編解碼在S3C6410處理器上的實現方法。

1 FFmpeg視頻編解碼流程

FFmpeg主要有encode/decode、muxer/demuxer和內存操作3個模塊。encode/decode模塊用于音視頻的編碼和解碼,存放在libavcodec子目錄中;muxer/demuxer模塊用于音頻和視頻的合并與分離(也稱混合器模塊),存放在libavformat目錄中;內存等常用模塊存放于libavutil目錄中。下面以解碼過程為例分析FFmpeg視頻編解碼流程。

解碼基本流程共分4步:

①注冊所有可能用到的編解碼器和混合器。av_register_all(void)函數中通過執行REGISTER_MUXDEMUX(X,x)和REGISTER_ENCDEC(X,x),把所有FFm-peg支持的混合器和編解碼器相關信息以鏈式的結構存放在內存中。

②打開視頻文件。av_open_input_file(AVFormat-Context**ic_ptr,const char*filename,AVInputFormat*fmt,int buf_size,AVFormatParameters*ap)函數中偵測文件的格式,根據文件格式從鏈式的混合器中找到相對應的混合器(demuxer)并分離出視頻信息。

③獲取視頻信息。通過av_find_stream_info(AVFormatContext*ic)函數獲取視頻格式。根據視頻格式,在鏈式的視頻解碼器中找到相應的視頻解碼器,并通過avcodec_open(AVCodecContext*avctx,AVCodec*codec)函數將解碼器打開用于下一步視頻的解碼。

④解碼一幀視頻,通過avcodec_decode_video(AVCodecContext*avctx,AVFrame*picture,int*got_picture_ptr,const uint8_t*buf,int buf_size)函數解碼一幀視頻。

FFmpeg的編碼過程與解碼過程類似,不同的是第3步根據要求編碼的格式在鏈式的視頻編碼器中找到相應的視頻編碼器,并執行編碼過程。

通過以上對FFmpeg視頻編解碼流程分析可以知道,為了在FFmpeg中添加自定義的視頻編解碼器,并在程序運行時使用這個編解碼器,關鍵在于如下兩點:

①根據FFmpeg對編解碼器的描述,實現自定義編解碼器。

②通過REGISTER_ENCDEC(X,x)函數將自定義的視頻編解碼器添加到視頻編解碼器鏈中。在獲取視頻信息時,保證需要編碼或解碼的視頻能找到視頻編解碼器鏈中自定義的視頻編解碼器。

2 S3C6410處理器視頻編解碼方法

S3C6410視頻編解碼軟件架構[4]如圖1所示。底層為操作系統空間,上層為用戶空間,視頻編解碼器通過驅動和操作系統以設備文件的形式使用,使用的方法和普通文件一樣,包括文件打開和關閉、文件讀寫和輸入/輸出控制(ioctl,input/output control)。

圖1 S3C6410視頻編解碼軟件架構

具體操作方法如下:

①通過open函數打開編解碼器設備文件;

②使用mmap方法在用戶空間和驅動空間之間映射輸入/輸出緩存空間,這樣做的好處是可以快速進行數據輸入/輸出;

③通過ioctl設備編解碼參數,初始化編解碼器;

④輸入數據,通過ioctl執行編解碼過程,輸出數據;

⑤通過close方法關閉編解碼器設備文件。

值得注意的是,無論編碼還是解碼,處理的數據都是以一幀幀的形式操作的,所以第4步是一個不斷循環的過程,直到所有數據處理完成。另外,雖然編解碼器以設備文件的形式使用,但是它不能使用標準的文件讀寫操作,查看編解碼的設備驅動可以發現,其文件讀寫函數是空的,這一點三星公司的開發文檔并沒有說明。

3 H.264硬件編解碼實現

FFmpeg的H.264硬件編解碼[5]實現就是自定義一個視頻編解碼器,加入到FFmpeg庫中。這個視頻編解碼器使用S3C6410處理視頻硬件編解碼功能來實現H.264的視頻編碼和解碼過程,這樣使用FFmpeg庫的多媒體程序可以用訪問FFmpeg其他編解碼器一樣的方法使用這個自定義的編解碼器。添加自定義編解碼器的關鍵是根據FFmpeg中對編解碼的描述定義編解碼器,并實現定義中的相關函數。

在libavcodec/avcodec.h中的AVCodec結構體是定義FFmpeg編解碼器的關鍵結構體,包括編解碼器的名字、類型(聲音/視頻)、編解碼器的識別號(CodecID)、支持格式和一些用于初始化、編碼、解碼和關閉的函數指針。

解碼器的名字為s3cx264,類型為視頻。CodecID為H264,表示這個解碼器用于H.264視頻編解碼。初始化、編碼、解碼和關閉函數指針分別指向X264_init、X264_frame、X264_decodec和X264_close函數。

添加s3cx264編解碼器到編解器鏈中,關鍵是通過修改libavcodec/allcodecs.c文件實現,修改如下:

這樣,在程序運行時調用av_register_all(void)函數后,就可以把自定義的編解碼器s3cx264添加到FFmpeg存放在內存中的解編碼器鏈中。值得提出的是,對同一個視頻格式FFmpeg有多個編解碼器與之相對應。如H.264格式的視頻,FFmpeg本身就帶有對應的軟解碼器,現在添加了硬解碼器,為了避免不確定是哪一個解碼器在執行,可以把自定義的硬件編解碼器在注冊時放在注冊過程的最前面,這樣編解碼器在添加到解編器鏈中時就會放在靠前的位置,查找時就可以優于軟件解碼器找到硬解碼器。

把硬件編解碼器s3cx264注冊到編解碼器鏈后,還要完成X264_init、X264_frame、X264_decodec和X264_close函數,編解碼器才能正常工作。以下結合前面對S3C6410視頻編解碼過程的分析,以編碼為例詳細闡述實現過程。

定義X264Context結構體,保存設備文件描述符、編碼參數和輸入/輸出地址等信息,用于FFmpeg模塊間數據的傳遞:

X264_init實現的是編碼器初始化過程,用于編碼器設備文件的打開、內存空間的映射、編碼參數設置和獲取

編解碼數據輸入/輸出地址。

static av_cold int X264_init(AVCodecContext*avctx){X264Context*x4=avctx->priv_data;

//打開編碼器設備文件

x4->dev_fd=open(MFC_DEV_NAME,O_RDWR|O_NDELAY);

//內存空間映射

x4->addr=(uint8_t*)mmap(0,BUF_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,x4->dev_fd,0);

//編碼參數設置

ioctl(x4->dev_fd,S3C_MFC_IOCTL_MFC_H264_ENC_INIT,&x4->enc_init);

//獲取輸入/輸出地址

ioctl的參數為S3C_MFC_IOCTL_MFC_H264_ENC_INIT,表示使用H.264編碼。

X264_frame函數執行編碼過程。需要注意的是data參數保存了需要編碼的數據,是一個四維的數組,要把它轉換成一維數組用于S3C6410編碼器輸入。另外,編碼數據存在空的情況,也就是空幀。這是需要處理的,方法是返回“0”,表示沒有輸出數據,否則程序運行時會出現段錯誤。

//編碼數據輸出

X264_close關閉函數用于編碼結束后的資源釋放,包括取消空間映射和關閉設備文件。

解碼函數的實現過程類似于編碼函數,包括空間轉換、執行解碼和解碼數據輸出。初始化時使用S3C_MFC_IOCTL_MFC_H264_DEC_INIT參數,執行時使用S3C_MFC_IOCTL_MFC_H264_ENC_EXE參數。

4 運行測試

s3cx264編解碼器添加到FFmpeg后,可以通過以下方式測試:

①用如下命令編譯FFmpeg。

②運行./ffmpeg-codecs查看可以找到s3cx264編解碼器,如圖2所示。

圖2 FFmpeg顯示s3cx264編解碼器信息

③結合USB攝像頭測試s3cx264編碼。運行./ffmpeg-s 320x240-r 50-f video4linux2-i/dev/video2-vcodec s3cx264test.mp4可以看到FFmpegg正使用s3cx264編碼器將USB攝像頭采集的數據編碼壓縮成test.mp4文件。test.mp4能夠正常播放顯示。

以上測試說明已經成功地將s3cx264硬件視頻編碼器添加到了FFmpeg中,能夠編碼視頻數據,可以運用到其他使用FFmpeg庫的多媒體程序中。

結 語

對于多媒體開發來說,編解碼時使用FFmpeg多媒體庫是一個不錯的選擇,支持較多的音視頻編解碼,編程接口簡單易用。了解FFmpeg編解碼過程,熟悉FFmpeg硬件編解碼器添加方法,對多媒體開發,尤其是資源有限的嵌入式多媒體開發有很大幫助。本文通過分析FFmpeg視頻編解碼過程和三星S3C6410處理器視頻硬件編解碼方法,在FFmpeg庫中成功添加S3C6410硬件編解碼器,使FFmpeg庫具有H.264視頻格式的硬件編解碼能力,可運用于游戲設備、監控設備、視頻會議設備和數字網絡電視等嵌入式系統中,同時也為其他嵌入式設備添加別的視頻格式的編解碼器到FFmpeg多媒體庫提供了參考。

[1]http://www.ffmpeg.org/.

[2]Samsung.S3C6410Datasheet,2010.

[3]李少春.基于FFMPEG的嵌入式視頻監控系統[J].電子技

[4]API Document S3C6400/6410Multi-Format Codec,2008.

[5]FFmpeg codec HOWTO[EB/OL].2010[2011-01].http://wiki.multimedia.cx/index.php?title=FFmpeg_codec_HOWTO/.

猜你喜歡
嵌入式設備
諧響應分析在設備減振中的應用
TS系列紅外傳感器在嵌入式控制系統中的應用
電子制作(2019年7期)2019-04-25 13:17:14
基于VB6.0+Access2010開發的設備管理信息系統
嵌入式系統通信技術的應用
電子制作(2018年18期)2018-11-14 01:48:16
基于MPU6050簡單控制設備
電子制作(2018年11期)2018-08-04 03:26:08
搭建基于Qt的嵌入式開發平臺
嵌入式軟PLC在電鍍生產流程控制系統中的應用
電鍍與環保(2016年3期)2017-01-20 08:15:32
500kV輸變電設備運行維護探討
工業設計(2016年12期)2016-04-16 02:52:00
如何在設備采購中節省成本
原來他們都是可穿戴設備
消費者報道(2014年7期)2014-07-31 11:23:57
主站蜘蛛池模板: 欧美天堂久久| 免费人成视网站在线不卡 | 99热精品久久| 91久久夜色精品国产网站 | 国产黄在线免费观看| 成人午夜福利视频| 2022精品国偷自产免费观看| 激情国产精品一区| 72种姿势欧美久久久大黄蕉| 亚洲综合婷婷激情| 91丨九色丨首页在线播放| 美女视频黄频a免费高清不卡| 青青草原国产av福利网站| 激情网址在线观看| 精品一区二区三区波多野结衣| 国产毛片不卡| 国产精品九九视频| 久久亚洲天堂| 国产精品人人做人人爽人人添| 欧美午夜视频在线| 国产精品亚欧美一区二区| 免费在线看黄网址| 青草视频久久| 色综合日本| 国产男女免费完整版视频| 亚洲最猛黑人xxxx黑人猛交 | 国产午夜一级淫片| 无码日韩人妻精品久久蜜桃| 欧美激情综合一区二区| 911亚洲精品| 国产va免费精品观看| 亚洲一级无毛片无码在线免费视频| 一区二区三区四区在线| a级毛片免费播放| 国产精品hd在线播放| 日本午夜精品一本在线观看| 国产欧美精品一区aⅴ影院| 亚洲男人的天堂久久精品| 91网址在线播放| 色妞永久免费视频| 日韩乱码免费一区二区三区| 99热最新在线| 精品精品国产高清A毛片| 国产精品亚洲一区二区三区在线观看| 麻豆国产精品| 国产美女91视频| 色噜噜在线观看| 毛片久久久| 幺女国产一级毛片| 一级一级一片免费| 三上悠亚一区二区| 国产午夜精品一区二区三区软件| 一级香蕉人体视频| 国产剧情国内精品原创| 在线看国产精品| 99精品视频在线观看免费播放| 毛片久久网站小视频| 色综合久久久久8天国| a毛片在线| 亚洲天堂色色人体| 中文一级毛片| 91久久偷偷做嫩草影院精品| 久久久久久久97| 色天天综合久久久久综合片| 欧美日韩在线第一页| 在线播放精品一区二区啪视频| 亚洲免费福利视频| 亚洲三级电影在线播放| 欧美第一页在线| 日韩福利视频导航| 青青草欧美| 欧美色图第一页| 欧美激情,国产精品| 57pao国产成视频免费播放 | 久久婷婷国产综合尤物精品| 国产精品lululu在线观看| 国产一区二区三区视频| 国产无遮挡猛进猛出免费软件| 国产人人干| 伊人久久久大香线蕉综合直播| 蜜臀AV在线播放| 丁香综合在线|