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

從上圖可看出,ffmpeg就占用了CPU差不多90%的資源。
後端要快速地處理視訊,需要高性能的伺服器叢集,但是,對于創業型公司來說,這點支出是非常不合算的。是以,可充分運用雲服務,例如,七牛提供的服務就包含音視訊格式的轉換,調用非常友善。
如何聯系我:【萬裡虎】www.bravetiger.cn
【QQ】3396726884 (咨詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/