33.APP後端處理視訊的方案
在當前的app應用中,到處都能看到視訊的身影,例如,在社交類的app上,使用者可以拍攝屬於自己的小視訊,併發布到相應得欄目,增加和好友們互動的機會。
後臺常見的視訊處理有以下幾種:
· 視訊的截圖,很多視訊列表上顯示的一張圖片,這張圖片就是通過擷取視訊的某一幀(通常是第一幀)得到的。
· 視訊加水印,出於版權保護的目的,需要新增水印。
· 視訊轉碼,允許使用者上傳手機上的視訊,並轉換為app後端支援的格式。
視訊的處理對於大多數程式設計師來說是個很陌生的領域, 這裡介紹一個視訊處理最常用的工具:ffmpeg。
(1)ffmpeg簡介
Ffmpeg的官網(http://ffmpeg.org/)是這樣介紹的:Acomplete, cross-platform solution to record, convert and stream audio and video。一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式。
Ffmpeg是個跨平臺的軟體,可以在linux下使用,也可以在window,mac下使用。
這個專案最早由FabriceBellard發起,現在由Michael Niedermayer維護。許多FFmpeg的開發人員都來自MPlayer專案,而且當前FFmpeg也是放在MPlayer專案組的伺服器上。專案的名稱來自MPEG視訊編碼標準,前面的"FF"代表"Fast Forward"。
著名的播放器KMPlayer, 暴風影音,qq影音,都曾經使用過ffmpeg的程式碼。國內的七牛雲端儲存,音視訊處理的核心模組也是ffmpeg。
Ffmpeg可以實現的功能有:
l 視訊採集
l 音視訊格式轉換
l 視訊抓圖
l 給視訊加水印
FFmpeg主要由一下幾個部分組成:
libavcodec:包含了所有FFmpeg音視訊編解碼器的庫。 為了保證最優效能和高可複用性,大多數編解碼器從頭開發的。
libavformat:包含了所有的普通音視格式的解析器和 產生器的庫。
三個例項程式:
ffmpeg:命令列的視訊格式轉換程式(一般就直接呼叫這個檔案)
ffplay:視訊播放程式。(需要SDL支援)
ffserver:多媒體伺服器
(2)程式呼叫ffmpeg的功能
使用ffmpeg的進行視訊轉換很簡單,例如,把avi轉換為MP4,使用命令列:
ffmpeg -i source.avi -f psp -r 29.97-b 768k -ar 24000 -ab
64k -s 320×240 destination.mp4
那麼,在後臺語言中,應該怎麼呼叫ffmpeg進行格式轉換呢?
一個常見的思路,就用通過構造命令列的方式,把上面命令列構造出來,然後在後臺語言中呼叫ffmpeg執行檔案。
有個java呼叫ffmpeg開源專案 jave (主頁:http://www.sauronsoftware.it/projects/jave/)就是這樣實現的。
例如,下面的例子是avi轉換成flv:
File source = newFile("source.avi");
File target = newFile("target.flv");
AudioAttributes audio = newAudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(newInteger(64000));
audio.setChannels(new Integer(1));
audio.setSamplingRate(newInteger(22050));
VideoAttributes video = newVideoAttributes();
video.setCodec("flv");
video.setBitRate(newInteger(160000));
video.setFrameRate(new Integer(15));
video.setSize(new VideoSize(400,300));
EncodingAttributes attrs = newEncodingAttributes();
attrs.setFormat("flv");
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(video);
Encoder encoder = new Encoder();
encoder.encode(source,target, attrs);
通過類AudioAttributes和VideoAttributes設定了相關的引數,在類Encoder中把這些引數構造成命令列執行FFmpeg相關的命令。
注意了,視訊音訊相關的操作一般都是非常耗費CPU資源,例如上面的例子,在avi轉換成flv的過程中,系統的相關資源狀況如下:
從上圖可看出,ffmpeg就佔用了CPU差不多90%的資源。
後端要快速地處理視訊,需要高效能的伺服器叢集,但是,對於創業型公司來說,這點支出是非常不合算的。因此,可充分運用雲服務,例如,七牛提供的服務就包含音視訊格式的轉換,呼叫非常方便。
----------------------------------------------------------
本人把網路上發表的一系列“app後端”文章加以整理並增加了運維和架構方面的內容,出版了書籍《App 後臺開發運維和架構實踐》,該書已在京東,噹噹和亞馬遜上銷售。
《App後臺開發運維和架構實踐》的購買連結
-------------------------------------------------------------------------------------------------
開啟連結 app後端系列文章總目錄 總目錄 ,能檢視本人發表過的所有原創“app後端”文章。
【作者】曾健生【QQ】190678908
【app後端qq群】254659220
【微信公眾號】 appbackend
【新浪微博】 @newjueqi
【部落格】http://blog.csdn.net/newjueqi