1. 程式人生 > >33.APP後端處理視訊的方案

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