基于FFMPEG 的跨平臺視頻編解碼研究

第33卷 第11期
2011年11月
武 漢 理 工 大 學 學 報
JOURNALOF WUHANUNIVERSITYOFTECHNOLOGY Vol.33 No.11
??????????????????????????????????????????????????
Nov.2011
DOI:10.3963/j.issn.1671-4431.2011.11.029
基于FFMPEG 的跨平臺視頻編解碼研究
胡 聰1,周 甜1,唐璐丹2
(1.桂林電子科技大學電子工程與自動化學院,桂林541004;2.桂林電子科技大學信息科技學院,桂林541004)
摘 要: 針對視頻監控提出了視頻編解碼器的軟件實現。監控客戶端采用S3C2440作為嵌入式硬件平臺,并通過
CMOS攝像頭OV9650采集視頻,經過FFMPEG編碼傳輸給監控服務器端。監控服務器端接收到視頻流后通過FFMPEG
實時解碼播放,實現遠程監控。實驗結果表明,系統達到了監控客戶端的視頻采集、編碼,監控服務器端解碼和播
放。
關鍵詞: FFMPEG; 編解碼; 嵌入式; 視頻; OV9650
中圖分類號: TP391 文獻標識碼: A 文章編號:1671-4431(2011)11-0139-04
ResearchonCross-platform VideoCodecBasedonFFMPEG
HUCong1,ZHOUTian1,TANGLu-dan2
(1.CollegeofElectronicEngineeringandAutomation,GuilinUniversityofElectronicTechnology,
Guilin541004,China;2.InstituteofInformationandTechnology,GuilinUniversityof
ElectronicTechnology,Guilin541004,China)
Abstract: Asoftwareimplementationofvideocodecforvideomonitoringispresented.MonitorclientusedS3C2440
asembeddedhardwareplatform,acquiredvideowithOV9650ofCMOScamera,transmittedtothemonitoringserver
withFFMPEGcoding.Monitorserverreceivedvideostream,decodedandplayingreal-timebyFFMPEG,realizedremotemonitoring.
Theexperimentalresultsshowthatthesystemachievesthemonitorclientvideoacquisition,encoding,
andmonitorserverdecodingandplaying.
Keywords: FFMPEG; codec; embeddedsystem; video; OV9650
收稿日期:2011-09-17. 基金項目:國家自然科學基金(61172053). 作者簡介:胡 聰(1981-),男,碩士,講師.E-mail:hucong@guet.edu.cn
隨著經濟的發展,銀行、交通、家居、倉儲、國防等領域對安全防范、現場記錄、報警系統的需求越來越大,
要求越來越高。視頻監控系統主要具備遠程現場的圖像采集、處理、傳輸、實時顯示及視頻存儲等功能。它
以監控目標實時性強、適于遠距離傳輸、能提供直接有效的現場證據等突出優點,已在諸多領域成為人們不
可或缺的工具[1]。考慮到視頻監控系統必須需要對視頻信號進行編碼解碼,討論了一種基于FFMPEG 的
視頻監控系統的編解碼研究。
1 FFMPEG 簡介
FFMPEG是一個集錄制、轉換、音/視頻編解碼功能為一體的、完整的開源解決方案。FFMPEG 的開發
基于Linux操作系統,也可在大多數操作系統中編譯和使用。FFMPEG 支持MPEG、DivX、MPEG4、AC3、
DV、FLV 等40多種編碼,AVI、MPEG、OGG、ASF等90多種解碼[2]。
2 系統方案
系統采用C/S設計模式來實現客戶端與服務器端的交互,由服務器端向客戶端發出監聽請求,客戶端
驗證并進行連接。連接成功后,客戶端監測點啟動攝
像頭進行視頻數據采集,采集的視頻數據是原始數據
rgb565(.rgb16)格式,經格式轉換后,再經過FFMPEG
壓縮成H.263格式視頻,經通信網絡傳輸到服
務器端計算機中;監控服務器端接收視頻數據后,經
FFMPEG解碼后,通過VFW(VideoforWindows)顯
示在服務器端界面上。視頻發送端采用SAMSUNG
公司的具有ARM9內核的S3C2440作為嵌入式微控
制器,服務器端采用普通PC機。系統方案如圖1所
示。
3 客戶端
客戶端的主要工作首先是搭建嵌入式Linux平臺,然后是搭建交叉編譯環境,做完這些準備工作后,就
是開發攝像頭驅動程序,并通過操作攝像頭采集圖像并經FFMPEG 壓縮,監聽服務器端的請求后發送給服
務器端。
3.1 建立嵌入式Linux平臺
建立嵌入式Linux平臺主要有以下步驟:
1)使用H-JTAG快速燒寫BIOS到開發板。2)格式化NandFlash。3)安裝bootloader。4)安裝內核文
件。5)安裝文件系統[3]。
3.2 搭建交叉編譯環境
在Linux平臺下,要編譯內核、bootloader,還有其他一些應用程序,均需要交叉編譯工具鏈。使用armlinux-
gcc4.3.2[3]。
3.3 攝像頭驅動配置
OV9650是OmniVision公司生產的一系列CMOS攝像頭中的一種,在接口上能夠保持與S3C2440的
一致性。輸出圖像最大為130萬像素,輸出圖像格式包括SXGA,VGA,QVGA,CIF,QCIF等,并提供加窗
功能以輸出不同尺寸的圖像。對于不同的輸出圖像格式,輸出最高幀率可不同,最高可達120f/s。輸出的8
位數據格式包括YUV/YCbCr(4∶2∶2)、GRB(4∶2∶2)、原始RGB數據3種[4]。
OV9650圖像傳感器在Linux中作為字符設備來描述,其驅動程序提供給應用程序一個流控制接口。
用戶進程通過設備文件與硬件打交道,對設備文件的操作本質是一些系統調用。若要將系統調用和設備驅
動程序關聯起來,須用到structfile_operations這個關鍵數據結構。因此,編寫設備驅動的主要工作就是編
寫數據結構中定義的子函數,并填充file_operation的各個域。
在開發階段用makemodules命令將驅動程序編譯成模塊OV9650_2440.ko,用insmod命令來加載驅
動,可避免反復編譯燒寫內核[5]。驅動模塊編譯加載后,便可像操作普通文件一樣對攝像頭進行數據讀取操
作[6]。在開發完成階段中,可以把驅動程序編譯進內核,以免每次都手動加載驅動。
加載了驅動程序后,像操作普通文件一樣操作攝像頭。如:定義intm filev4l2,通過m filev4l2 =
open(“/dev/camera”,O RDWR)打開攝像頭,通過read(fd,&in rgb565,D SIZE)讀取攝像頭的視頻
數據到數組in rgb565中,通過close(m filev4l2)[7]。有了視頻數據后,就可以通過FFMPEG進行編碼。
3.4 FFMPEG 編碼
用FFMPEG編碼時,首先對FFMPEG庫初始化,注冊所有的編解碼器,配置編碼器、碼率、幀速率、編
碼像素格式和分辨率等,然后開始編碼。通過設置結構體AVOutputFormat的成員video codec的值設置
編碼器,如:aofmt->video codec= CODEC ID H263設置H.263編碼;通過設置結構體AVCodecContext
的成員pix fmt的值設置待編碼的數據像素格式,如acc->pix fmt= PIX FMT YUV420P設置
YUV420像素格式;通過設置acc->bit rate,acc->width,acc->height等可以設置碼率,寬度和高度等。
編碼的核心函數是avcodec encode video。系統每采集一幀數據,就送給avcodec encode video函數進
行編碼成H.263視頻流。其編碼流程如圖2所示。
根據系統的要求,傳輸的視頻流為H.263格式。
采集數據中,OV9560輸出的是rgb565(.rgb16)格式,
首先需要轉換成rgb888(.rgb24)格式,然后再轉換成
yuv420(.i420)格式,然后再由FFMPEG 進行壓縮編
碼成H.263視頻格式。其中RGB與YUV 的轉換公
式如公式(1)[8]
Y =0.257R +0.504G +0.098B +16
U =-0.148R -0.291G +0.439B +128
V =0.439R -0.368G -0.071B +128
(1)
4 服務器端
服務器端的主要工作是監控所有客戶端,按照需
要服務器端可以任意連接某個監控客戶端。連接后接收數據,經過FFMPEG解碼后顯示在服務器端。
用FFMPEG 解碼時,首先對FFMPEG 庫初始
化,注冊所有的編解碼器,配置解碼器和解碼像素格式
等,然后開始解碼。通過設置結構體AVCodec內容
設置待解碼數據流格式,如:AVCodec*codec= avcodec
find decoder(CODEC ID H263)設置待解
碼數據流格式為H.263;通過設置結構體AVPicture
的值設置解碼像素格式,如:avpicture fill((AVPicture
*)pFrameYUV,out buffer,PIX FMT
YUV420P,D Width,D Height)設計解碼像素格
式為YUV420。解碼的核心函數是avcodec decode
video。其解碼流程如圖3所示。
4.1 服務器端解碼
由于解碼的是H.263視頻流,因為不知道要解碼的數據流長度,跟文件解碼操作不一樣[9]。在本設計
中,專門為解碼器開辟了一個線程負責解碼,同時也開辟了一個FIFO 隊列進行數據的緩沖。解碼時,接收
的數據不停地進入FIFO 隊列,然后從頭取固定的字節數進行解碼。而且由于解碼時解出的幀是完整的幀,
這就會出現解碼后還會剩余不完整的幀字節,這些字節需要重新和后面的視頻數據流拼接重新解碼[10-11]。
用FFMPEG對H.263解碼出來格式是YUV(.i420)格式,需要轉換成RGB(.rgb24)格式顯示。
4.2 服務器端顯示
顯示視頻采用的是VFW(VideoforWindows)。顯示的核心函數是DrawDibDraw 函數。DrawDib-
Draw 畫圖針對的是DIB圖像,是一種BMP(Bitmap)圖像。DrawDibDraw函數有13個參數,最重要的參數
是第7個和第8個參數,第7個參數是填入位圖的頭信息,第8個參數填入的是RGB(.rgb24)圖像數
據[12-13]。
由于用DrawDibDraw畫圖時,圖像上下顛倒,在采用DrawDibDraw 進行畫圖前,將rgbdata指向的緩
存中的圖像數據進行行的顛倒操作,首先得知道圖像的寬度,假如為Width,然后Width*3就是一行的字節
數,接著第一行的數據和最后一行的數據交換,第二行的和倒數第二行的數據進行交換,依次類推。
5 質量效果控制
系統在中國移動3G 通信環境
下進行實驗,通道的數據流需設置
為H.263編碼格式數據流,分辨率
需設為QCIF(176*144),幀率、關
表1 碼率
時間點1 2 3 4 5 6 7 8 9
碼率/(b·s-1)5914 5728 5968 3155 3227 3502 3557 2919 3000
鍵幀比例由實際情況可以自由設置,碼率由實際情況拍攝的視頻決定,由于傳輸通道帶寬為48kb/s,所以碼
率不能超過48kb/s。當設置關鍵幀比例為1/6時,幀率為6f/s時,實際測得碼率如表1所示。
如果想畫面流暢些,可以增大幀率,如果想增強視頻的對移動物體的顯示效果,可以增大關鍵幀比例,但
不能超過系統傳輸的帶寬[14]。
6 壓縮率
壓縮編碼采用H.263壓縮編
碼,采用關鍵幀比例為1/6時,實測
壓縮率表格如表2所示。
壓縮率與關鍵幀比例、實際視
表2 壓縮率
時間點1 2 3 4 5 6 7 8 9
壓縮率/% 2.59 2.51 2.61 1.38 1.41 1.53 1.55 1.27 1.31
頻及運動等有關,關鍵幀比例越低、視頻像素相似度越高、運動量越小,壓縮率越高[15]。
7 結 語
隨著視頻壓縮技術的日益成熟,嵌入式視頻監控成為當今視頻監控的主流。采用ARM9 內核的
S3C2440為嵌入式硬件平臺,通過攝像頭采集數據,在嵌入式Linux與Windows操作系統相結合的跨平臺
上,實現FFMPEG的編解碼,對實際嵌入式視頻監控系統的設計開發,具有重要意義和實用價值[16]。
參考文獻
[1] 楊曉健.基于ARM9的嵌入式視頻采集系統設計[J].西安工程大學學報,2010,24(2):208-212.
[2] 蔣志峰.FFMPEG的快速音視頻開發方法[J].單片機與嵌入式系統應用,2008(1):69-71.
[3] 師娟娟.基于ARM9的嵌入式Linux移植[J].武漢理工大學學報,2008,30(2):205-208.
[4] 楊海山,何東健.基于ARM 和Linux的視頻采集系統研究與開發[J].微計算機信息,2009,25(11-2):122-124.
[5] 闕大順,杜 瑋.Vivi在S3C2410上的移植研究[J].武漢理工大學學報,2007,29(12):47-50.
[6] 熊平華,楊建剛.IP可視電話視頻會議系統設計與實現[J].計算機工程與設計,2004(4):619-621.
[7] 馮國進.嵌入式Linux驅動程序設計從入門到精通[M].北京:清華大學出版社,2008:102-146.
[8] 馮永超,羅 敏,賀貴明.一種快速YUV RGB彩色空間變換方法[J].微型機與應用,2002(7):59-60.
[9] 詹慧靜.MPEG-4編碼特性剖析及應用研究[J].武漢理工大學學報,2005,27(6):103-106.
[10]呂 雪.基于網絡多媒體的流媒體技術[J].武漢理工大學學報,2005,27(12):121-125.
[11]黎燕霞,李 揚,劉奕宏,等.基于S3C2440的視頻采集驅動設計[J].儀器儀表用戶,2009,16(3):98-99.
[12]查 婧,劉 波,曹劍中.嵌入式視頻采集與網絡傳輸系統[J].電子器件,2009,32(3):646-648.
[13]余兆明,李曉飛,陳春來.MPEG-4標準及其應用[M].北京:北京郵電大學出版社,2002.
[14]曹少坤.一種嵌入式網絡攝像機的設計[J].微計算機應用,2008,29(10):69-73.
[15]張學武,楊學星,江 冰.基于H.263 的視頻編碼、解碼的研究及軟件實現[J].計算機工程與設計,2005,26(9):
2491-2493.
[16]鄭旭東,張培仁,高修峰,等.嵌入式網絡視頻監控系統[J].儀表技術與傳感器,2006(08):24-26.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454506.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454506.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454506.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python邏輯型數據也叫什么_Python入門 | 運算符和數據類型

自用總結。 零散知識 1.Python的計算方法:運算符、函數、方法 1) 方法與函數的區別: 方法與特定類型的對象有關,是屬于某個對象的函數,對象始終是該方法的第一個參數。e.g. islower()方法是檢查字符串中字符是否為小寫形式的方法&…

Flask 第三方組件之 WTForms

簡介 WTForms是一個支持多個web框架的form組件,主要用于對用戶請求數據進行驗證。 安裝: pip3 install wtforms 用戶登錄注冊示例 1. 用戶登錄 當用戶登錄時候,需要對用戶提交的用戶名和密碼進行多種格式校驗。如: 用戶不能為…

機器學習原理與算法(六) 支持向量機

版權聲明:本系列文章為博主原創文章,轉載請注明出處!謝謝! 本章索引: 從第3章的Logistic回歸算法開始,我們一直在討論分類問題。在各種不同的分類算法中,...,我們一直在討論如何分類…

讀《程序員的SQL金典》[2]--函數

一、數學函數 1.RAND SELECT RAND () ---0.302870228294199取0-1之間的隨機小數。 2.小數取整 CEILINT(data)舍掉小數部分并向上取整。FLOOR(data)舍掉小數部分并向下取整。SELECT TOP 3 FWeight, CEILING(FWeight ),FLOOR( FWeight) FROM T_PersonRound(m,d):四舍…

html div模塊前留空白,html – 3個DIV彼此相鄰,中間填充空白

您好我想問你如何將3 DIV放在一起,而中間一個填補第一和第三DIV之間的空白.我想在第一個NAD第三個DIV中有動態按鈕,我需要中間DIV來填充第一和第三個DIV之間的空間.我會破壞純CSS / HTML(沒有JavaScript)這是我的嘗試:http://jsfiddle.net/4smx3627/#wrapper{height…

mplayer安裝記錄 源碼分析

mplayer源碼下載地址: http://www.mplayerhq.hu/MPlayer/releases/ 下載最新的MPlayer-1.0rc4 #mkdir /usr/local/mplayer #mkdir /usr/local/codecs #cd MPlayer-1.0rc4 #./configure --prefix/usr/local/mplayer --codecsdir/usr/local/ codecs --langua…

python人臉識別代碼百度ai_python百度AI人臉識別API測試

1、注冊賬號 2、創建應用 3、得到AK和SK 4、用AK SK獲取access_token 可用下面的代碼: #!/usr/bin/python3.5 # encoding:utf-8 import requests # client_id 你的AK client_secret 你的SK host https://aip.baidubce.com/oauth/2.0/token?grant_typeclient_crede…

Flask 第三方組件之 SQLAlchemy

一、介紹 SQLAlchemy是一個基于Python實現的ORM框架。該框架建立在 DB API之上,使用關系對象映射進行數據庫操作,簡言之便是:將類和對象轉換成SQL,然后使用數據API執行SQL并獲取執行結果。 安裝:pip3 install sqlalc…

httpservlet獲取請求端IP地址

request.getRemoteAddr(); 轉載于:https://www.cnblogs.com/panxuejun/p/7623850.html

html 中怎樣顯示enum,JavaScript如何枚舉?

JavaScript中對象的屬性分為兩種:數據屬性和訪問器屬性。然后根據具體的上下文環境的不同,又可以將屬性分為:原型屬性和實例屬性。原型屬性是定義在對象的原型(prototype)中的屬性,而實例屬性一方面來自構造的函數中,然…

iperf測試網卡性能

Iperf是一個網絡性能測試工具。可以測試TCP和UDP帶寬質量,可以測量最大TCP帶寬,具有多種參數和UDP特性,可以報告帶寬,延遲抖動和數據包丟失 因為產品上確定要要用的PHY是千M的&a…

acrobat 控件可以發布嗎_短視頻可以同時在多個平臺發布嗎?

我們在做自媒體內容創業中,很多人都在做視頻版塊,那么一個短視頻到底能不能多平臺同時發布呢?那么今天,我來分享給大家,希望能夠幫到你解決困惑。1.作品可以多平臺分發:大家不確定是否能多平臺分發&#xf…

紅河學院計算機科學與技術,2016年紅河學院計算機科學與技術專業最低分是多少?...

類似問題答案2016年廈門理工學院計算機類(含計算機科學與技術、網絡工程、空間信息與專業最低分...學校 地 區 專業 年份 批次 類型 分數 廈門理工學院 福建 計算機類(含計算機科學與技術、網絡工程、空間信息與 2016 一批 理科 491 學校 地 區 專業 年份 批次 類型 分數 廈門理…

Flask 第三方組件之 script

Flask Script擴展提供向Flask插入外部腳本的功能,包括運行一個開發用的服務器,一個定制的Python shell,設置數據庫的腳本,cronjobs,及其他運行在web應用之外的命令行任務;使得腳本和系統分開; …

CentOS四種方法自建yum倉庫

將ISO光盤鏡像作為yum本地倉庫(適用于不能聯外網的環境): 1、 禁用所有可用的yum倉庫,為方便演示,直接全部刪除: # cd /etc/yum.repos.d # ls # rm -rf * 2、 創建光盤掛載點,掛載光盤&#x…

python substr_python數據分析-數據對象(一)

Python基本數據類型一般分為:數字、字符串、列表、元組、字典、集合這六種基本數據類型。不可變(3 個):Number(數字)、String(字符串)、Tuple(元組)&#xff…

VLC框架分析

功能部份: VLC媒體播放器的核心是libvlc ,它提供了界面,應用處理功能,如播放列表管理,音頻和視頻解碼和輸出,線程系統。所有libvlc源文件設在的/src目錄及其子目錄: # config/ :從命令行和配置…

html表格里的超鏈接點不了,Excel如何添加和取消超鏈接 Excel超鏈接打不開是怎么回事...

很多用戶在制作excel表格的時候都會添加一些超鏈接,在制作完成后發布到網頁,閱讀者可以通過超鏈接打開指引的網頁或者文件,超鏈接對制作excel表格的用戶有非常大的幫助,雖然添加超鏈接的步驟非常簡單,不過還是有些exce…

yum 安裝apache php mysql

安裝: yum install -y httpd php 查看版本:、 rpm -qa httpd php httpd-2.2.15-54.el6.centos.x86_64 php-5.3.3-48.el6_8.x86_64 修改apache配置文件: vim /etc/httpd/conf/httpd.conf 在#ServerName www.example.com:80行下添加一行 Server…

Python 散點圖線性擬合_機器學習之利用Python進行簡單線性回歸分析

前言:在利用機器學習方法進行數據分析時經常要了解變量的相關性,有時還需要對變量進行回歸分析。本文首先對人工智能/機器學習/深度學習、相關分析/因果分析/回歸分析等易混淆的概念進行區分,最后結合案例介紹如何利用Python進行簡單線性回歸…