www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]   目前,智能手機(jī)、PDA和平板電腦等越來(lái)越多的嵌入式設(shè)備支持高清視頻采集和播放功能,高清視頻的采集或播放功能正廣泛用于游戲設(shè)備、監(jiān)控設(shè)備、視頻會(huì)議設(shè)備和數(shù)字網(wǎng)絡(luò)電視等嵌入式系統(tǒng)中。這些功能的

  目前,智能手機(jī)、PDA和平板電腦等越來(lái)越多的嵌入式設(shè)備支持高清視頻采集和播放功能,高清視頻的采集或播放功能正廣泛用于游戲設(shè)備、監(jiān)控設(shè)備、視頻會(huì)議設(shè)備和數(shù)字網(wǎng)絡(luò)電視等嵌入式系統(tǒng)中。這些功能的實(shí)現(xiàn)建立在高性能視頻硬件編解碼技術(shù)基礎(chǔ)之上。本文闡述了基于FFMpeg的H.264視頻硬件編解碼在S3C6410處理器上的實(shí)現(xiàn)方法,為數(shù)字娛樂(lè)、視頻監(jiān)控和視頻通信系統(tǒng)開(kāi)發(fā)過(guò)程中的高清視頻硬件編解碼的實(shí)現(xiàn)提供參考。


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

  S3C6410[2]是三星公司推出的應(yīng)用處理器芯片,基于ARM11架構(gòu),主頻最高可達(dá)800 MHz。它具有多媒體硬件加速功能,其中包括大于30FPs的MPEG4 SP、H.264/263 BP和VC1(WMV9)多種視頻硬件編解碼,可用于手機(jī)、平板電腦和游戲機(jī)等手持移動(dòng)設(shè)備和其他高性能嵌入式設(shè)備。國(guó)產(chǎn)手機(jī)魅族M8的處理器使用的就是S3C6410。

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

  1 FFmpeg視頻編解碼流程

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

  解碼基本流程共分4步:

 ?、?注冊(cè)所有可能用到的編解碼器和混合器。av_register_all(void)函數(shù)中通過(guò)執(zhí)行 REGISTER_MUXDEMUX(X,x)和REGISTER_ENCDEC(X,x),把所有FFmpeg支持的混合器和編解碼器相關(guān)信息以鏈?zhǔn)降慕Y(jié)構(gòu)存放在內(nèi)存中。

  ② 打開(kāi)視頻文件。av_open_input_file(AVFormatContext **IC_ptr,const char *filename,AVInputFormat *fmt,int buf_size,AVFormatParameters *ap)函數(shù)中偵測(cè)文件的格式,根據(jù)文件格式從鏈?zhǔn)降幕旌掀髦姓业较鄬?duì)應(yīng)的混合器(demuxer)并分離出視頻信息。

 ?、?獲取視頻信息。通過(guò)av_find_stream_info(AVFormatContext *ic)函數(shù)獲取視頻格式。根據(jù)視頻格式,在鏈?zhǔn)降囊曨l解碼器中找到相應(yīng)的視頻解碼器,并通過(guò)avcodec_open(AVCodeCContext *avctx,AVCodec *codec)函數(shù)將解碼器打開(kāi)用于下一步視頻的解碼。

 ?、?解碼一幀視頻,通過(guò) avcodec_decode_video(AVCodecContext *avctx,AVFrame *picture,int *got_picture_ptr,const uint8_t *buf,int buf_size)函數(shù)解碼一幀視頻。

  FFmpeg的編碼過(guò)程與解碼過(guò)程類似,不同的是第3步根據(jù)要求編碼的格式在鏈?zhǔn)降囊曨l編碼器中找到相應(yīng)的視頻編碼器,并執(zhí)行編碼過(guò)程。

  通過(guò)以上對(duì)FFmpeg視頻編解碼流程分析可以知道,為了在FFmpeg中添加自定義的視頻編解碼器,并在程序運(yùn)行時(shí)使用這個(gè)編解碼器,關(guān)鍵在于如下兩點(diǎn):

 ?、?根據(jù)FFmpeg對(duì)編解碼器的描述,實(shí)現(xiàn)自定義編解碼器。

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

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

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

圖1 S3C6410視頻編解碼軟件架構(gòu)

  具體操作方法如下:

  ① 通過(guò)open函數(shù)打開(kāi)編解碼器設(shè)備文件;

  ② 使用mmap方法在用戶空間和驅(qū)動(dòng)空間之間映射輸入/輸出緩存空間,這樣做的好處是可以快速進(jìn)行數(shù)據(jù)輸入/輸出;

 ?、?通過(guò)ioctl設(shè)備編解碼參數(shù),初始化編解碼器;

 ?、?輸入數(shù)據(jù),通過(guò)ioctl執(zhí)行編解碼過(guò)程,輸出數(shù)據(jù);

 ?、?通過(guò)close方法關(guān)閉編解碼器設(shè)備文件。

  值得注意的是,無(wú)論編碼還是解碼,處理的數(shù)據(jù)都是以一幀幀的形式操作的,所以第4步是一個(gè)不斷循環(huán)的過(guò)程,直到所有數(shù)據(jù)處理完成。另外,雖然編解碼器以設(shè)備文件的形式使用,但是它不能使用標(biāo)準(zhǔn)的文件讀寫操作,查看編解碼的設(shè)備驅(qū)動(dòng)可以發(fā)現(xiàn),其文件讀寫函數(shù)是空的,這一點(diǎn)三星公司的開(kāi)發(fā)文檔并沒(méi)有說(shuō)明。

  3 H.264硬件編解碼實(shí)現(xiàn)

  FFmpeg的H.264硬件編解碼[5]實(shí)現(xiàn)就是自定義一個(gè)視頻編解碼器,加入到FFmpeg庫(kù)中。這個(gè)視頻編解碼器使用S3C6410處理視頻硬件編解碼功能來(lái)實(shí)現(xiàn)H.264的視頻編碼和解碼過(guò)程,這樣使用FFmpeg庫(kù)的多媒體程序可以用訪問(wèn)FFmpeg其他編解碼器一樣的方法使用這個(gè)自定義的編解碼器。添加自定義編解碼器的關(guān)鍵是根據(jù)FFmpeg中對(duì)編解碼的描述定義編解碼器,并實(shí)現(xiàn)定義中的相關(guān)函數(shù)。

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

  typedef struct AVCodec {

  const char *name;

  enum CodecType type;

  enum CodecID id;

  int priv_data_size;

  int (*init)(AVCodecContext *);

  int (*encode)(AVCodecContext *,uint8_t *buf,int buf_size,void *data);

  int (*close)(AVCodecContext *);

  int (*decode)(AVCodecContext *,void *outdata,int *outdata_size,

  uint8_t *buf,int buf_size);

  int capabilities;

  struct AVCodec *next;

  void (*flush)(AVCodecContext *);

  const AVRational *supported_framerates;

  const enum PixelFormat *pix_fmts;

  } AVCodec;

  H.264硬件編解碼器定義如下:

  AVCodec s3cx264_encoder = {

  .name="s3cx264",

  .type=AVMEDIA_TYPE_VIDEO,

  .id=CODEC_ID_H264,

  .init=X264_init,

  .encode=X264_frame,

  .decode=X264_decode,

  .close=X264_close,

  …

  };

  解碼器的名字為s3cx264,類型為視頻。CodecID為H264,表示這個(gè)解碼器用于H.264視頻編解碼。初始化、編碼、解碼和關(guān)閉函數(shù)指針?lè)謩e指向X264_init、X264_frame、X264_decodec和X264_close函數(shù)。

  添加s3cx264編解碼器到編解器鏈中,關(guān)鍵是通過(guò)修改libavcodec/allcodecs.c文件實(shí)現(xiàn),修改如下:

  REGISTER_ENCDEC (ASV1,asv1);

  REGISTER_ENCDEC (S3CX264,s3cx264);

  //添加s3cx264編解碼器

  REGISTER_ENCDEC (ASV2,asv2);

  這樣,在程序運(yùn)行時(shí)調(diào)用av_register_all(void)函數(shù)后,就可以把自定義的編解碼器s3cx264添加到FFmpeg存放在內(nèi)存中的解編碼器鏈中。值得提出的是,對(duì)同一個(gè)視頻格式FFmpeg有多個(gè)編解碼器與之相對(duì)應(yīng)。如H.264格式的視頻,F(xiàn)Fmpeg本身就帶有對(duì)應(yīng)的軟解碼器,現(xiàn)在添加了硬解碼器,為了避免不確定是哪一個(gè)解碼器在執(zhí)行,可以把自定義的硬件編解碼器在注冊(cè)時(shí)放在注冊(cè)過(guò)程的最前面,這樣編解碼器在添加到解編器鏈中時(shí)就會(huì)放在靠前的位置,查找時(shí)就可以優(yōu)于軟件解碼器找到硬解碼器。

  把硬件編解碼器s3cx264注冊(cè)到編解碼器鏈后,還要完成X264_init、X264_frame、X264_decodec和X264_close函數(shù),編解碼器才能正常工作。以下結(jié)合前面對(duì)S3C6410視頻編解碼過(guò)程的分析,以編碼為例詳細(xì)闡述實(shí)現(xiàn)過(guò)程。

  定義X264Context結(jié)構(gòu)體,保存設(shè)備文件描述符、編碼參數(shù)和輸入/輸出地址等信息,用于FFmpeg模塊間數(shù)據(jù)的傳遞:

  typedef struct X264Context {

  int dev_fd;

  uint8_t *addr;

  s3c_mfc_enc_init_arg_t enc_init;

  s3c_mfc_enc_exe_arg_t enc_exe;

  s3c_mfc_get_buf_addr_arg_t get_buf_addr;

  uint8_t *in_buf,*out_buf;

  AVFrame out_pic;

  } X264Context;

  X264_init實(shí)現(xiàn)的是編碼器初始化過(guò)程, 用于編碼器設(shè)備文件的打開(kāi)、內(nèi)存空間的映射、編碼參數(shù)設(shè)置和獲取編解碼數(shù)據(jù)輸入/輸出地址。

  static av_cold int X264_init(AVCodecContext *avctx){

  X264Context *x4 = avctx?>priv_data;

  //打開(kāi)編碼器設(shè)備文件

  x4?>dev_fd = open(MFC_DEV_NAME,O_RDWR"O_NDELAY);

  //內(nèi)存空間映射

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

  //編碼參數(shù)設(shè)置

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

  //獲取輸入/輸出地址

  x4?>get_buf_addr.in_usr_data = (int)x4?>addr;

  ioctl(x4?>dev_fd,S3C_MFC_IOCTL_MFC_GET_YUV_BUF_ADDR,&x4?>get_buf_addr);

  x4?>in_buf = (uint8_t *)x4?>get_buf_addr.out_buf_addr;

  x4?>get_buf_addr.in_usr_data = (int)x4?>addr;

  ioctl(x4?>dev_fd,S3C_MFC_IOCTL_MFC_GET_LINE_BUF_ADDR,&x4?>get_buf_addr);

  x4?>out_buf = (uint8_t *)x4?>get_buf_addr.out_buf_addr;

  return 0;

  }

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

  X264_frame函數(shù)執(zhí)行編碼過(guò)程。需要注意的是data參數(shù)保存了需要編碼的數(shù)據(jù),是一個(gè)四維的數(shù)組,要把它轉(zhuǎn)換成一維數(shù)組用于S3C6410編碼器輸入。另外,編碼數(shù)據(jù)存在空的情況,也就是空幀。這是需要處理的,方法是返回“0”,表示沒(méi)有輸出數(shù)據(jù),否則程序運(yùn)行時(shí)會(huì)出現(xiàn)段錯(cuò)誤。

static int X264_frame(AVCodecC

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

開(kāi)創(chuàng)中國(guó)文旅產(chǎn)業(yè)AI深度應(yīng)用新樣本 北京2025年8月22日 /美通社/ -- 以下為來(lái)自億歐的報(bào)道: 8月22日,桂林旅游股份有限公司旗下銀子巖景區(qū)聯(lián)合合作伙伴正式發(fā)布全球首款A(yù)I伴游財(cái)神玩具 —— "五...

關(guān)鍵字: AI IP 數(shù)字化 硬件

北京2025年8月18日 /美通社/ -- 2025年8月,軟通動(dòng)力集團(tuán)一項(xiàng)關(guān)鍵決策引發(fā)行業(yè)矚目——以自有資金8億元向全資子公司軟通計(jì)算機(jī)有限公司完成實(shí)繳增資,使其注冊(cè)資本增加至23億元。這筆戰(zhàn)略注資不僅彰顯集團(tuán)對(duì)信創(chuàng)核...

關(guān)鍵字: AI 硬件 計(jì)算機(jī) 智能化

在科技飛速發(fā)展的今天,硬件更新?lián)Q代的速度日新月異。然而,許多企業(yè)或個(gè)人仍在使用著老舊硬件設(shè)備,這些設(shè)備雖然性能有限,但在一些對(duì)性能要求不高的場(chǎng)景中,仍有其存在的價(jià)值。通過(guò)合理的內(nèi)核參數(shù)調(diào)優(yōu)和輕量級(jí)服務(wù)部署方案,我們可以充...

關(guān)鍵字: 硬件 內(nèi)核參數(shù)

北京 2025年5月27日 /美通社/ -- 日前,軟通華方(清華同方)推出全新超銳T40-Z70國(guó)產(chǎn)筆記本,主打更輕、更強(qiáng)、更安全。這款新品國(guó)產(chǎn)筆記本采用鋁合金材質(zhì)機(jī)身,搭載國(guó)產(chǎn)高性能兆芯開(kāi)先KX-7000八核處理器...

關(guān)鍵字: 筆記本電腦 鋁合金 硬件 BSP

隨著科技的飛速發(fā)展,人工智能(AI)已經(jīng)從科幻作品中的概念逐漸走進(jìn)了我們的日常生活,深刻地改變著各個(gè)行業(yè)的面貌。在這一變革中,硬件作為 AI 技術(shù)運(yùn)行的物理基礎(chǔ),其重要性不言而喻。對(duì)于硬件工程師而言,如何在人工智能時(shí)代找...

關(guān)鍵字: 人工智能 硬件 工程師

上海 2025年5月15日 /美通社/ -- 近日在CHINASHOP2025期間,商米以"SUPER Solution雙系統(tǒng)高效切換助力商業(yè)環(huán)保"的案...

關(guān)鍵字: 硬件 BSP 雙系統(tǒng) 大賽

在軟件和硬件之間,似乎還有一些不軟不硬的存在?沒(méi)錯(cuò),那就是固件(Firmware)。固件,其實(shí)也是一種軟件,但他比普通的軟件更硬。一般是不能隨便改的,改了以后可能整個(gè)系統(tǒng)都得完蛋。它是連接普通軟件和硬件的橋梁。

關(guān)鍵字: 軟件 硬件

北京2025年4月23日 /美通社/ -- 4月22日,在千年大運(yùn)河的粼粼波光中,軟通華方"京牌京產(chǎn)"首臺(tái)下線儀式于國(guó)家網(wǎng)絡(luò)安全產(chǎn)業(yè)園區(qū)(通州園)隆重舉行。通州區(qū)委常委、副區(qū)長(zhǎng)吳孔安,軟通動(dòng)力集團(tuán)董事...

關(guān)鍵字: 數(shù)字經(jīng)濟(jì) 軟件 數(shù)字化 硬件

北京2025年4月20日 /美通社/ -- 4月19日,在北京亦莊舉辦的2025北京亦莊半程馬拉松暨人形機(jī)器人半程馬拉松賽開(kāi)跑,20支人形機(jī)器人參賽隊(duì)和9000余名人類跑者同時(shí)出發(fā)。這是全球首個(gè)人形機(jī)器人半程馬...

關(guān)鍵字: 機(jī)器人 BSP 大眾 硬件

該設(shè)備能非常實(shí)時(shí)的呈現(xiàn)視頻和音頻的功能為我們交通事故個(gè)處理和定位提供了更科學(xué)的依據(jù),讓我們的財(cái)產(chǎn)和人生安全得到了充分的保障。

關(guān)鍵字: 視頻 音頻
關(guān)閉