FLV视频格式解码软件开发
生活随笔
收集整理的這篇文章主要介紹了
FLV视频格式解码软件开发
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??????????????????? ???(? 作者:孫德生?????????? 深大碩士研究生??)
FLV流媒體格式是一種新的視頻格式,全稱為Flash Video。Flash MX 2004對其提供了完美的支持,它的出現有效地解決了視頻文件導入Flash后,使導出的SWF文件體積龐大,不能在網絡上很好的使用等缺點。FLV 是Macromedia?公司開發的屬于自己流式視頻格式。這種格式是在sorenson?公司的壓縮算法的基礎上開發出來的[20]。FLV 壓縮與轉換非常方便,適合做短片。一般FLV 包在 SWF PLAYER 的殼里,并且 FLV 可以很好的保護原始地址,不容易下載到起到保護版權的目的。
Macromedia為了盡早用FLV格式來壟斷Web Video應用,取代RM在線視頻播放的霸主地位,在FlashMX2004中匆匆增加了一個Video類,短短兩三年的時間,FLV就成為了目前最主流的在線視頻播放格式,隨著被新一代的視頻播客網站廣泛采用,自從youtube火了以后,flv格式也開始火暴,目前國內視頻分享網站,比如六間房、5Show、56、優酷等都使用flv了這個文件技術來實現的。目前 GOOGLE ?YOUTUBE 采用FLV ,SOUV.NET 集合全亞洲最多的 FLV,以及百度、新浪、騰訊、貓撲、Maxthon、雅虎等國際國內著名互聯網公司的相繼投入與看好,以及國際資本大量進入視頻播客領域,FLV格式被極大的推廣,甚至新浪在自己的BBS也開通了FLV影片上傳播放服務[21]。
5.5.1 FLV與RMVB對比
我們都知道一般的視頻文件,要不就是asf格式、wmv格式使用mediaplayer進行播放,要不就是rm格式用RealPlayer播放。這樣的問題是,格式的不同就需要選擇不同的播放器,這對于本地計算機沒有安裝相應播放器的用戶來說,這些視頻根本無法收看。并且,還由于這些文件的容量過大,下載慢,查看也不很流暢。所以,解決播放器和容量的問題,運用Flash有個方法:將各類視頻文件轉換成Flash視頻文件。容量方面,從FlashMX2004Pro起就支持了轉換為Flash視頻的功能,經過相關設置后,可縮小原有視頻的容量,最終轉換的文件擴展名是FLV。
下面就把RMVB和FLV這兩種主流視頻文件格式簡單對比分析如表5-5。對于兩種格式,誰更出色,而另一個主要方面就是哪種格式更適合便攜式產品采用。
表5-5?RMVB和FLV兩種視頻文件比較分析:
我們可以看到目前RMVB影片的最大優勢是分辨率更高,在電腦上實際播放效果更出色,視頻影片多為長片,文件體積較大,需要通過BT或者電驢軟件下載。FLV的最大優勢是資源類型豐富與文件體積較小,由于分辨率低,在電腦上播放畫面質量不如RMVB。但是在PMP上取決于LCD屏的分辨率,因為PMP產品的LCD屏不可能很大,所以在這方面FLV格式的優勢還是有很大優勢的。
由于網絡播客網站越來越受消費者歡迎,FLV視頻已經已經無限量,比RMVB更豐富、種類更多的FLV視頻資源可直接下載到PMP中播放。
5.5.2FLV解碼軟件開發
FLV解碼軟件開發的開發,在本課題中是利用的FFmpeg為基礎的。FFmpeg是一個集錄制、轉換、音/視頻編碼解碼功能為一體的完整的開源解決方案[23]。FFmpeg的開發是基于Linux操作系統,但是可以在大多數操作系統中編譯和使用。FFmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等40多種編碼,AVI、MPEG、OGG、Matroska、ASF等90多種解碼。TCPMP, VLC, MPlayer等開源播放器都用到了FFmpeg [24]。FFmpeg主目錄下主要有libavcodec、libavformat和libavutil等子目錄。其中libavcodec用于存放各個encode/decode模塊,libavformat用于存放muxer/demuxer模塊,libavutil用于存放內存操作等常用模塊。
以flash movie的flv文件格式為例, muxer/demuxer的flvenc.c和flvdec.c文件在libavformat目錄下,encode/decode的mpegvideo.c和h263de.c在libavcodec目錄下。
FLV視頻文件格式實際上并沒有明確指出應該使用哪種編碼來解析音頻和視頻數據;它們只是定義了音頻流和視頻流(或者,有可能是多個音頻視頻流)如何被綁定在一個文件里面。這就是為什么有時候,當你打開了一個FLV文件時,你只能聽到聲音,卻不能看到圖象--因為沒有合適的視頻解碼器。所以,libavformat 用來處理解析視頻文件并將包含在其中的流分離出來,而libavcodec 則處理原始音頻和視頻流的解碼。
解碼處理流程:
1、?? 通過函數flvdec_init(void)注冊初始化編碼器,通過REGISTER_MUXDEMUX(FLV, flv)完成對FLV格式的注冊,內含音頻視頻編解碼的初始化;
2、?? 打開視頻文件,通過av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)實現,
通過av_find_stream_info(pFormatCtx)、dump_format(pFormatCtx, 0, filename, false)分析文件數據包編碼格式,再把pFormatCtx的流域填滿;
3、通過avcodec_find_decoder(pCodecCtx->codec_id)找到相應的解碼器,
?4、打開解碼器,通過函數(avcodec_open(pCodecCtx, pCodec); 5、視頻數據解碼通過avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, rawData, bytesRemaining)解析視頻數據包,得到視頻幀,GetNextFrame(AVFormatContext *pFormatCtx, AVCodecContext *pCodecCtx, int videoStream, AVFrame *pFrame );視頻編碼格式為FLV1; 6、音頻數據包通過avcodec_decode_audio()解碼,得到的數據存入buffer中,根據時間戳來實現音視頻的同步;音頻編碼格式有PCM、ADPCM、MP3; 7、釋放解碼器,關閉解碼器(codec),avcodec_close(pCodecCtx); 關閉視頻文件av_close_input_file(pFormatCtx); 表5-6?FLV解碼軟件中部分重要處理函數接口
5.5.3 FLV開發體會???????????????????????????????????????????
在開發中,是利用的基礎的FFMPEG開源的開發包,在其中提取FLV相關代碼進行開發實踐,得到最后的解碼軟件,對于解碼代碼的編寫都是利用開發包里面的,主要工作還是在于移植到本課題的開發平臺。因為本課題用的硬件系統的局限性,以及FFMPEG開發包本來也是沒有經過嚴格測試的,最后得到的解碼軟件在機子上播放,會有卡機現象,不是很流暢。
為了開發出質量更高,符合市場需求的FLV解碼軟件,除了通過購買編解碼庫,就只能通過一些開源的包再做深入的開發,得到需要的解碼軟件產品。
| RMVB格式 | FLV格式 | |
| 分辨率 | (700-800)*(272-350)之間 | 一般播課網影片分辨率為320*240 |
| 幀速度 | 24、25FPS | 20FPS左右 |
| 文件體積 | 約5M/分鐘,一個影片文件體積在400-700M之間 | 約1.5M/分鐘,一個影片體積在200M左右 |
| 視頻主要類型 | 電影/電視劇(動漫)/綜藝節目為主 | 電影、電視劇(動漫)、游戲、新聞、體育視頻錄象、綜藝節目視頻、網友自拍影片、視頻等 |
| 下載行為 | 在BT網站論壇檢索,獲得影視下載信息,使得P2P模式BT軟件下載 | 從WEB2.0播客獲得,可使用多FLV下載軟件 |
?4、打開解碼器,通過函數(avcodec_open(pCodecCtx, pCodec); 5、視頻數據解碼通過avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, rawData, bytesRemaining)解析視頻數據包,得到視頻幀,GetNextFrame(AVFormatContext *pFormatCtx, AVCodecContext *pCodecCtx, int videoStream, AVFrame *pFrame );視頻編碼格式為FLV1; 6、音頻數據包通過avcodec_decode_audio()解碼,得到的數據存入buffer中,根據時間戳來實現音視頻的同步;音頻編碼格式有PCM、ADPCM、MP3; 7、釋放解碼器,關閉解碼器(codec),avcodec_close(pCodecCtx); 關閉視頻文件av_close_input_file(pFormatCtx); 表5-6?FLV解碼軟件中部分重要處理函數接口
| 函數接口 | 作用 |
| flv_probe() | 探測文件是否為FLV文件 |
| flv_read_packet ( ) | 讀入數據包,分析數據包 |
| flv_read_close( ) | 關閉讀操作 |
| flv_read_header() | 讀入頭數據 |
| av_register_input_format() | 初始化輸入格式 |
總結
以上是生活随笔為你收集整理的FLV视频格式解码软件开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软考中级考试信息系统管理工程师怎么样??
- 下一篇: RGB彩色空间和YIQ、灰度等的转化