天天看點

APP後端處理視訊的方案 (1)ffmpeg簡介 (2)程式調用ffmpeg的功能

   在目前的app應用中,到處都能看到視訊的身影,例如,在社交類的app上,使用者可以拍攝屬于自己的小視訊,并釋出到相應得欄目,增加和好友們互動的機會。

         背景常見的視訊處理有以下幾種:

·          視訊的截圖,很多視訊清單上顯示的一張圖檔,這張圖檔就是通過截取視訊的某一幀(通常是第一幀)得到的。

·          視訊加水印,出于版權保護的目的,需要添加水印。

·          視訊轉碼,允許使用者上傳手機上的視訊,并轉換為app後端支援的格式。

視訊的處理對于大多數程式員來說是個很陌生的領域, 這裡介紹一個視訊處理最常用的工具: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:多媒體伺服器

         使用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的過程中,系統的相關資源狀況如下:

APP後端處理視訊的方案 (1)ffmpeg簡介 (2)程式調用ffmpeg的功能

         從上圖可看出,ffmpeg就占用了CPU差不多90%的資源。

         後端要快速地處理視訊,需要高性能的伺服器叢集,但是,對于創業型公司來說,這點支出是非常不合算的。是以,可充分運用雲服務,例如,七牛提供的服務就包含音視訊格式的轉換,調用非常友善。

如何聯系我:【萬裡虎】www.bravetiger.cn

【QQ】3396726884 (咨詢問題100元起,幫助解決問題500元起)

【部落格】http://www.cnblogs.com/kenshinobiy/