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

基于FFmpeg的H.264格式轉換器的設計與實現

2016-08-22 09:42:37李芳芳蘇凱雄
電視技術 2016年7期

李芳芳,蘇凱雄

(福州大學 物理與信息工程學院,福建 福州 350108)

?

基于FFmpeg的H.264格式轉換器的設計與實現

李芳芳,蘇凱雄

(福州大學 物理與信息工程學院,福建 福州 350108)

針對視頻編碼壓縮傳輸需要,給出了一種基于FFmpeg的H.264格式轉換器的設計方法,實現了對H.264碼流數據的快速解碼、壓縮、再編碼的功能。該轉換器具有工作效率較高等特點,適合于實時傳輸應用。實驗結果表明,轉換后的碼流經過一系列處理之后,在客戶端接收到的視頻畫面穩定無抖動、播放流暢。

FFmpeg;格式轉換器;H.264;實時傳輸;移植;壓縮

隨著信息技術的迅速發展,網絡視頻監控技術已經廣泛地應用于各個領域。目前視頻數據產生的數據量也是越來越大,如何在有限的資源下更好地利用這些數據,成為了大家研究的重點[1]。視頻壓縮與視頻格式轉換是解決上述問題的重要手段。H.264是近年來被廣泛應用的視頻壓縮編碼標準,具有壓縮率高、網絡適應性強、抗干擾性能好等優點。傳統的遠程視頻監控系統所需軟硬件資源大,系統傳輸帶寬要求高、時延長、實時性不高[2],本文給出了一種適用于實時視頻監控系統采集端軟件,在Windows系統上基于FFmpeg的H.264格式轉換器的解決方法,著重介紹了FFmpeg的移植與實時視頻編碼模塊的實現。

1 編解碼相關技術

1.1H.264編碼標準

H.264是一種新的視頻編碼標準,它在保留原有視頻編碼優點的基礎上,提出了以往視頻編解碼無法比擬的一些優點,如低誤碼率、網絡適應能力強、容錯能力強等[3]。H.264分為視頻編解碼層(VCL)和網絡抽象層(NAL),VCL包含codec的信令處理功能如轉換、量化、運動補償預測機制以及循環過濾器,NAL封裝VCL編碼器輸出的片段到網絡抽象層單元(NAL Units),它適用于通過包網路傳輸或面向包的多路復用環境中,用于實際的傳輸[4]。NALU的頭結構由一個字節組成,主要包含以下3種信息:

forbidden_zero_bit:1個比特,在H.264中這一位必須為0。

nal_ref_idc:2個比特,取值范圍是00~11,用來表示NAL的優先級。取值越大表示該NAL越重要,需要優先受到保護。如果NAL是屬于參考幀的片或序列參數集(SPS)、圖像參數集(PPS)這些重要的單位時,nal_ref_idc的值必須為0。

nal_unit_type:5個比特,用來表示NALU單元的類型。

1.2FFmpeg簡介

FFmpeg是一套基于Linux操作系統的,集音視頻錄制、格式轉換與編解碼為一體的開源解決方案,也可在大多數操作系統中編譯和使用[5]。它不僅包含了多種音視頻編解碼庫,同時還支持基于流媒體的實時流的傳送。FFmpeg包含了幾個與視頻處理相關的結構體,其中,AVFrame是數據流在視頻編解碼過程中用來保存數據緩存的結構體,從數據流讀出的數據首先保存在AVPacket中。結構體AVPacket中定義有包的大小、流索引(決定該流為視頻流還是音頻流)、顯示時間戳(Presentation Time Stamp,PTS)、解碼時間戳(Decoding Time Stamp,DTS)等與音視頻相關的屬性值[6]。

2 FFmpeg在Windows平臺的移植

基于FFmpeg的H.264格式轉換器是視頻監控系統中PC采集端軟件的一個功能模塊,需要將FFmpeg編譯成DLL(動態鏈接庫)文件供PC采集端編解碼和壓縮時使用。移植過程是在Windows XP、已安裝VS2008軟件的計算機上進行的,編譯過程中采用的是ffmpeg-1.2.1,x264-snapshot-20141218-2245,mysy-1.0版本。移植流程主要分為以下幾個步驟:

1)MinGW編譯

將yasm.exe以及c99wrap.exe、c99conv.exe的路徑添加到計算機環境變量PATH中;修改MinGW解壓路徑下的fstab文件。如果不存在fstab文件,則復制一份fstab.sample到當前目錄,然后改名為fstab,再修改其內容為相對應的解壓路徑與安裝路徑;修改MinGWmsys1.0路徑下的msys.bat文件,在文件開頭加入VS2008的安裝路徑。

2)x264編譯

由于FFmpge不支持H.264格式編碼,因此要用FFmpeg庫的函數和數據結構進行H.264格式編解碼,需要結合x264庫使用[7]。首先下載last_x264.tar.bz2,運行msys.bat,并切換到x264所在目錄,運行以下命令:

./configure --enable-shared --enable-static --disable-asm --prefix=/mingw/x264_build

/mingw/x264_build是最后生成文件的保存目錄,需要事先創建x264_build文件夾。可在x264目錄中的config.log查看運行日志。接著運行make和make install,完成后會在x264_build的lib文件夾中生成庫文件。

3)FFmpeg編譯

下載ffmpeg-1.2.1.tar.bz2并且解壓縮,運行msys.bat,切換到ffmpeg目錄下,運行相應的./configure命令。/mingw/ffmpeg_build是生成文件的保存目錄,需要事先定義;/mingw/x264_build/include和/mingw/x264_build/lib是編譯x264生成的頭文件和庫文件路徑。configure成功后,運行make和make install,完成后在ffmpeg_build文件夾中生成所需文件。

3 視頻格式轉換器的實現

視頻格式轉換器主要實現的功能是將前端攝像頭實時采集的H.264格式的視頻流解碼成YUV格式的數據,然后對YUV數據進行再壓縮編碼形成新的視頻數據流,最后將碼流數據發送給實時視頻監控系統的客戶端。該過程主要調用上一節封裝好的FFmpeg的動態鏈接庫的接口,完成對輸入視頻的解碼、壓縮與再編碼的功能。如圖1所示,前端攝像頭輸出的H.264視頻數據傳送給采集端,采集端的格式轉換器通過調用On_RecvRalu()回調函數獲得H.264數據格式的原始碼流,再實例化一個FfmpegVideoDec類的對象,該類的主要功能是對H.264格式碼流數據解碼成YUV數據格式,然后將解碼得到的YUV數據傳入VideoEncCallback()函數中,通過實例化FfmpegVideoResize類,調用該方法對YUV數據進行壓縮,最后對FfmpegVid-eoEnc類進行實例化并對壓縮后的YUV數據再一次編碼成H.264格式數據的碼流。

圖1 格式轉換器的設計與實現流程

3.1解碼模塊

解碼模塊主要功能是將H.264格式的視頻數據解碼成YUV格式的數據,相比RGB色彩空間要求3個獨立的視頻信號同時傳輸,YUV占用的傳輸帶寬更少,并且易于實現與壓縮,方便傳輸與處理,所以更加適合于在實時視頻監控系統中使用。

解碼模塊的實現如圖2所示,首先通過調用Ffmpeg庫中的avcodec_register_all()對編解碼器進行注冊,再向avcodec_find_decoder() 函數中傳入相應的參數信息AVCodecID選擇H.264解碼器。通過avcodec_alloc_context3()函數分配一個AVCodecContext上下文環境,并調用avcodec_open2()對其進行初始化。AVCodecContext是描述編解碼器上下文的數據結構,它可以向編解碼器提供許多需要的參數信息,是一個十分重要的數據結構類型。通過調用avcodec_alloc_frame()為AVFrame類型的數據結構pFrame分配空間以便用于存儲解碼后的數據。在進行解碼前需要判斷數據是否為一幀的開頭,H.264的一幀數據是通過觀察二進制碼流分析出來的,它是由一個AU(Access Unit)構成,一個AU是由多個連續的NALU組成。每一幀圖像一般在開頭有一個單元分隔符,兩個單元分隔符之間的數據包就是一幀圖像。如果NALU對應為一幀的開始,則用4個字節表示,即0x00000001。在H.264規定有一種類型為09的NALU,即編碼器在完成一個AU編碼后,會在碼流中插入一個類型為09的NALU。如果使用了該標識符,幀將由0x0000000109作為結尾。所以解碼器只需要從碼流中搜索類型為09的NALU即可判斷一個AU。判斷數據為一幀的開始后再調用av_init_packet()對AVPacket類型的數據進行初始化。然后通過調用avcodec_decode_video2()函數解碼一幀數據,輸入AVPacket類型的數據,輸出后的數據存入AVFrame類型的結構體,函數的返回值即解碼所使用的碼流字節數。最后再判斷got_pic的值是否為1,其中got_pic是avcodec_decode_video2()的第三個參數int*got_picture_ptr數據類型的變量,該變量指示是否有解碼數據輸出。當got_pic為1時拷貝保存解碼出來的數據完成解碼功能。

圖2 解碼模塊實現流程

3.2壓縮及編碼模塊

在壓縮編碼過程中,主要是將YUV數據進行壓縮,再將壓縮后的數據編碼成H.264格式的視頻數據。壓縮及編碼模塊的實現流程如圖3所示,首先調用sws_getContext()函數返回上下文句柄,并設置原始圖像的寬和高以及輸出圖像的寬和高,然后通過執行函數sws_scale()函數對原始YUV視頻數據進行壓縮,初始圖像的分辨率為1 280×720,設定輸出的圖像分辨率為352×288。使用avcodec_find_encoder()函數選擇設定的ID相應的編碼器。在初始化上下文環境并對其設置默認值以后,初始化一個數據類型AVFrame的變量并設置參數,然后調用av_init_packet()函數對AVPakcet類型的變量進行初始化,用于編碼存儲數據使用。然后通過調用ret=avcodec_encode_video2()編碼一幀視頻數據,最后判斷ret的值,如果大于或者等于0即將指針指向下一幀數據等待編碼。

圖3 壓縮及編碼模塊實現流程

4 測試結果

測試環境是在一臺內存為2 Gbyte并在裝有XP系統的PC上,前端攝像頭型號為海康威視DS-2CD3210D-13,運行環境是VS2008。經測試,解碼器解碼一次最長時間約16 ms,編碼器編碼速率為10 f/s(幀/秒),碼率為120 kbit/s,原始分辨率是1 280×720,壓縮后分辨率為352×288,即cif編碼分辨率。原始攝像頭采集的視頻圖像與經過格式轉換器處理后接收的圖像如圖4和圖5所示,原始圖像較為清晰,傳輸后的圖像相比圖4較為模糊,具體可見兩圖中的“Camera 01”字樣和小電視邊緣等細節部分。實現的格式轉換器在視頻監控系統中正常使用,效果良好。

圖4 前端攝像頭采集的原始視頻圖像

圖5 經壓縮編碼傳輸后的視頻圖像

5 結束語

本文論述了基于FFmpeg開源視頻解決方案在Windows平臺上的H.264格式轉換器的設計與實現。為了提高編解碼效率,將FFmpeg移植到Windows平臺上,便于格式轉換器的開發與使用。文中主要實現了將前端攝像頭采集的H.264格式視頻數據進行解碼、壓縮并再編碼,最后傳送到客戶端。本文實現的H.264格式轉換器可以很好地適用于實時傳輸系統當中,并且經轉換器處理后的畫面較為清晰,編解碼速率快,在Windows平臺上移植的FFmpeg動態鏈接庫使用方便,大大提高開發效率。

[1]李薔.H.264視頻編碼碼率控制技術研究[D].上海:上海交通大學,2005.

[2]肖遠東,蔡聲鎮.基于iOS平臺的移動視頻監控軟件設計[J].計算機工程,2015,41(2):268-271.

[3]SRINIVASAN K S.The effects of priority levels and buffering on the statistical multiplexing of singe-layer H.264/AVC and SVC en-coded video stream[J].IEEE transactions on broadcasting,2011,56(3):281-286.

[4]陳陽.基于ffmpeg內核的H.264實時視頻解碼器開發[J].四川兵工學報,2014,35(9):103-104.

[5]胡聰,周甜,唐璐丹.基于FFMPEG的跨平臺視頻編解碼研究[J].武漢理工大學學報,2011,33(11):139-142.

[6]梁發云,陳志文,王婧,等.基于FFmpeg的立體視頻播放技術研究[J].電視技術,2013,37(11):27-29.

[7]韋崇嶺,裴海龍.基于無人機H264視頻傳輸系統的設計與實現[J].計算機測量與控制,2012,20(1):209-211.

責任編輯:閆雯雯

Design and implementation of H.264 format converter based on FFmpeg

LI Fangfang,SU Kaixiong

(CollegeofPhysicsandInformationEngineering,FuzhouUniversity,Fuzhou350108,China)

For the need of video coding compression and transmission,the method of H.264 format converter based on FFmpeg to achieve the fast decoding,compression,re-encoding functions to the H.264 data stream is given.The converter has high efficiency and other charecteristics which is suitable for the real time transmission applications.The result shows that the converted data stream after a series of processes,the video images which is client received are stable and playback smoothly.

FFmpeg; format converter;H.264; real-time transmission;transplant;compression

TN919.8

ADOI:10.16280/j.videoe.2016.07.008

福建省產學重大項目(2015H6014)

2015-10-21

文獻引用格式:李芳芳,蘇凱雄. 基于FFmpeg的H.264格式轉換器的設計與實現[J].電視技術,2016,40(7):32-35.

LI F F,SU K X. Design and implementation of H.264 format converter based on FFmpeg [J].Video engineering,2016,40(7):32-35.

主站蜘蛛池模板: 丝袜高跟美脚国产1区| 麻豆精品久久久久久久99蜜桃| 中文字幕天无码久久精品视频免费| 国产欧美精品一区二区| 91精品小视频| 成人免费午间影院在线观看| 免费Aⅴ片在线观看蜜芽Tⅴ| 在线观看欧美精品二区| 国产一区二区人大臿蕉香蕉| 日韩无码视频播放| 国产人前露出系列视频| 国产亚洲欧美日韩在线一区| 亚洲精品福利网站| 亚洲区欧美区| 5555国产在线观看| 精品人妻系列无码专区久久| 欧美69视频在线| 一本久道热中字伊人| 国产视频a| 高潮毛片免费观看| 国产免费福利网站| 九九香蕉视频| 久久综合伊人77777| 国产精品无码制服丝袜| 色综合天天综合中文网| 99久久精品免费观看国产| 热思思久久免费视频| 99精品久久精品| 女高中生自慰污污网站| 播五月综合| 久久久久无码精品国产免费| 美女被狂躁www在线观看| 日本精品影院| www欧美在线观看| 极品国产在线| 香蕉视频在线精品| 国产91在线|日本| aaa国产一级毛片| 亚洲VA中文字幕| 国产黄色视频综合| 亚洲福利视频网址| 55夜色66夜色国产精品视频| 综合色亚洲| 91视频国产高清| 女人一级毛片| 亚洲美女久久| 国产丝袜精品| 国产午夜不卡| 日本妇乱子伦视频| 亚洲男人天堂网址| 日韩天堂网| 农村乱人伦一区二区| 日本一区二区三区精品视频| 亚洲男人天堂网址| 色婷婷电影网| 久久精品人人做人人综合试看| 日韩在线1| 天天婬欲婬香婬色婬视频播放| 一级毛片免费不卡在线| 国产微拍精品| 午夜精品久久久久久久无码软件 | 国产精品成人一区二区| 四虎永久在线| 亚洲一区二区视频在线观看| 在线五月婷婷| 成人国产精品网站在线看| 特级精品毛片免费观看| 亚洲免费人成影院| 女人一级毛片| 国产成人综合久久精品下载| 成人午夜久久| 国产成人1024精品下载| 91啪在线| 亚洲一区二区三区在线视频| 欧美日韩国产成人在线观看| 免费99精品国产自在现线| 国产黄网站在线观看| 久久精品欧美一区二区| 99re这里只有国产中文精品国产精品| 国产欧美专区在线观看| 国产极品美女在线观看| 国产免费精彩视频|