Xuggler视频处理简介
隨著互聯(lián)網(wǎng)上視頻的爆炸式增長(zhǎng),開發(fā)人員經(jīng)常需要在其應(yīng)用程序中操縱視頻內(nèi)容。 Xuggler是Java開發(fā)人員的免費(fèi)開放源代碼庫(kù),可用于實(shí)時(shí)解壓縮,處理和壓縮錄制的視頻或?qū)崟r(shí)視頻。 Xuggler在后臺(tái)使用了功能非常強(qiáng)大的FFmpeg媒體處理庫(kù),實(shí)際上在它們周圍扮演著Java包裝器的角色。 這是從Java解壓縮,修改和重新壓縮任何媒體文件(或流)的簡(jiǎn)單方法。
FFmpeg是一個(gè)完整的跨平臺(tái)解決方案,用于記錄,轉(zhuǎn)換和流式傳輸音頻和視頻,并支持多種格式。 即使您不知道它,也很可能已經(jīng)在計(jì)算機(jī)上使用它。 但是,Xuggler的用途不僅限于提供對(duì)復(fù)雜FFmpeg本機(jī)庫(kù)的輕松訪問。 Xuggler開發(fā)團(tuán)隊(duì)還不斷對(duì)FFmpeg進(jìn)行改進(jìn)。 您可以在Xuggle博客上找到最新消息,該博客中還發(fā)布了許多教程。 千萬不要錯(cuò)過這些家伙的過分簡(jiǎn)單的互聯(lián)網(wǎng)視頻指南 。
讓我們繼續(xù)獲取FFmpeg。 請(qǐng)注意,Xuggler帶有自己的(改進(jìn)的)FFmpeg版本,以避免配置錯(cuò)誤,因此您不必手動(dòng)獲取FFmpeg。 在此過程中,我們將在將控制權(quán)交給Xuggler之前直接使用FFmpeg進(jìn)行一些測(cè)試,因此您可能希望將原始版本作為單獨(dú)的可執(zhí)行文件使用。
轉(zhuǎn)到FFmpeg下載頁(yè)面并獲取最新發(fā)行版,當(dāng)時(shí)的版本為0.6.1。 對(duì)于Linux,您可以從tarball下載源代碼并繼續(xù)進(jìn)行編譯。 在Windows中,您可能應(yīng)該獲得預(yù)編譯的二進(jìn)制文件。 我使用了Mplayer-win32提供的一個(gè),可以從這里獲得。 您將在此處找到ffmpeg.exe可執(zhí)行文件。 將其復(fù)制到一個(gè)特定的文件夾中,我選擇“ C:\ programs \ ffmpeg”,如果不想每次都寫完整的路徑,可以選擇將ffmpeg.exe添加到系統(tǒng)路徑中。
要測(cè)試可執(zhí)行文件是否正常工作,請(qǐng)打開終端并在不帶參數(shù)的情況下運(yùn)行它。 您應(yīng)該看到類似于以下的輸出:
FFmpeg版本SVN-r21231-Sherpya,版權(quán)所有(c)2000-2010 Fabrice Bellard等。
建于2010年1月16日05:42:31與gcc 4.2.5 20080919(預(yù)發(fā)行)[Sherpya] libavutil 50. 7. 0 / 50. 7. 0
libavcodec 52.47。 0 / 52.47。 0
libavformat 52.47。 0 / 52.47。 0
libavdevice 52. 2. 0 / 52. 2. 0
libavfilter 1.15。 0 / 1.15。 0
libswscale 0. 8. 0 / 0. 8. 0
libpostproc 51. 2. 0 / 51. 2. 0
超快速音頻和視頻編碼器
用法:ffmpeg [選項(xiàng)] [[infile選項(xiàng)] -i infile]…{[outfile選項(xiàng)] outfile}…
使用-h獲得完整的幫助,或者甚至更好地運(yùn)行'man ffmpeg'
您也可以使用輸出建議的“ -h”開關(guān)來接收一堆冗長(zhǎng)的參數(shù)和選項(xiàng)。 最好查看在線FFmpeg文檔 。
下一步是對(duì)您的第一個(gè)視頻進(jìn)行轉(zhuǎn)碼 ,可能是從預(yù)錄制的文件中轉(zhuǎn)碼 。 我的輸入文件是一個(gè)4分鐘20秒長(zhǎng)的MP4視頻,大小為18.1MB,稱為“ myvideo.mp4”。 我想將其轉(zhuǎn)換為Flash視頻,從而大大降低其質(zhì)量。 使用FFmpeg可以很容易地通過發(fā)出以下命令來完成此操作(注意對(duì)路徑使用正斜杠):
ffmpeg.exe -i C:/myvideo.mp4 C:/myvideo.flv
控制臺(tái)輸出如下所示:
FFmpeg版本SVN-r21231-Sherpya,版權(quán)所有(c)2000-2010 Fabrice Bellard等。
建于2010年1月16日05:42:31與gcc 4.2.5 20080919(預(yù)發(fā)行)[Sherpya] libavutil 50. 7. 0 / 50. 7. 0
libavcodec 52.47。 0 / 52.47。 0
libavformat 52.47。 0 / 52.47。 0
libavdevice 52. 2. 0 / 52. 2. 0
libavfilter 1.15。 0 / 1.15。 0
libswscale 0. 8. 0 / 0. 8. 0
libpostproc 51. 2. 0 / 51. 2. 0
似乎流1編解碼器的幀速率與容器的幀速率不同:59.92(14981/250)-> 29.96(14981/500)
從'C:/myvideo.mp4'輸入#0,mov,mp4,m4a,3gp,3g2,mj2:
元數(shù)據(jù): major_brand:mp42 minor_version:0 兼容品牌:isomavc1mp42 持續(xù)時(shí)間:00:04:20.96,開始:0.000000,比特率:582 kb / s 流#0.0(und):音頻:aac,44100 Hz,立體聲,s16、115 kb / s 流#0.1(und):視頻:h264,yuv420p,480×270 [PAR 1:1 DAR 16:9],464 kb / s,29.96 fps,29.96 tbr,29962 tbn,59.92 tbc 輸出#0 flv到'C:/myvideo.flv': 流#0.0(und):視頻:flv,yuv420p,480×270 [PAR 1:1 DAR 16:9],q = 2-31,200 kb / s,1k tbn,29.96 tbc 流#0.1(und):音頻:libmp3lame,44100 Hz,立體聲,s16,64 kb / s 流映射: 流#0.1->#0.0 流#0.0->#0.1 按[q]停止編碼 [libmp3lame @ 0038f3a0] lame:輸出緩沖區(qū)太小(緩沖區(qū)索引:9404,可用字節(jié):388) 音頻編碼失敗
忽略“音頻編碼失敗”消息,沒有錯(cuò)誤。 結(jié)果是一個(gè)不錯(cuò)的,可播放的FLV文件,名為“ myvideo.flv”,大小為10.1MB。
太酷了,讓我們繼續(xù)安裝Xuggler。 首先,我們從Xuggler下載頁(yè)面獲取最新版本。 如此處所述:
Xuggler由兩個(gè)主要部分組成; 一組Java jar文件和一組本機(jī)共享庫(kù)(Windows上的.dll文件,Linux上的.so文件或Mac上的.dylib文件)。 要使用它,您需要先安裝本機(jī)庫(kù),然后才能編寫使用Xuggler的程序。
確保下載與操作系統(tǒng)的體系結(jié)構(gòu)和Java版本匹配的正確文件。 例如,我下載了Windows的32位(對(duì)于Windows沒有64位),Java 1.5或更高版本,它基本上是一個(gè)安裝程序。
您可以在下載頁(yè)面中找到有關(guān)如何安裝本機(jī)庫(kù)的說明。 對(duì)于Windows,您可以卸載任何以前的版本,然后運(yùn)行安裝程序,當(dāng)然還要重新啟動(dòng)計(jì)算機(jī) 。 還有一個(gè)視頻介紹了如何在Microsoft Windows上安裝Xuggler 。 重新啟動(dòng)后,讓我們測(cè)試安裝是否成功。 首先,我們檢查Xuggle路徑變量是否已設(shè)置:
C:\>回聲%XUGGLE_HOME%
C:\ Program檔案(x86)\ Xuggle
路徑已正確設(shè)置。 請(qǐng)注意,Xuggler FFmpeg可執(zhí)行文件位于“%XUGGLE_HOME%/ bin”文件夾中。
讓我們通過發(fā)出以下命令來播放我們的第一個(gè)視頻(將“ c:/myvideo.mp4”替換為您的文件):
java -cp“%XUGGLE_HOME%\ share \ java \ jars \ xuggle-xuggler.jar” com.xuggle.xuggler.demos.DecodeAndPlayVideo c:/myvideo.mp4
是時(shí)候使用Xuggler編寫我們的第一個(gè)代碼了。 我們將檢查視頻文件,找到其媒體容器,并打印出內(nèi)容摘要。 同時(shí),將Xuggle API Javadocs加入書簽,以備將來參考。
啟動(dòng)您喜歡的IDE,創(chuàng)建一個(gè)新項(xiàng)目,然后導(dǎo)入在“%XUGGLE_HOME%/ share / java / jars”文件夾中找到的所有JAR文件。 該示例類似于如何在Eclipse中編寫您的第一個(gè)Xuggler應(yīng)用程序一文中提供的示例。
package com.javacodegeeks.xuggler.intro;import com.xuggle.xuggler.ICodec; import com.xuggle.xuggler.IContainer; import com.xuggle.xuggler.IStream; import com.xuggle.xuggler.IStreamCoder;public class VideoInfo {private static final String filename = "c:/myvideo.mp4";public static void main(String[] args) {// first we create a Xuggler container objectIContainer container = IContainer.make();// we attempt to open up the containerint result = container.open(filename, IContainer.Type.READ, null);// check if the operation was successfulif (result<0)throw new RuntimeException("Failed to open media file");// query how many streams the call to open foundint numStreams = container.getNumStreams();// query for the total durationlong duration = container.getDuration();// query for the file sizelong fileSize = container.getFileSize();// query for the bit ratelong bitRate = container.getBitRate();System.out.println("Number of streams: " + numStreams);System.out.println("Duration (ms): " + duration);System.out.println("File Size (bytes): " + fileSize);System.out.println("Bit Rate: " + bitRate);// iterate through the streams to print their meta datafor (int i=0; i<numStreams; i++) {// find the stream objectIStream stream = container.getStream(i);// get the pre-configured decoder that can decode this stream;IStreamCoder coder = stream.getStreamCoder();System.out.println("*** Start of Stream Info ***");System.out.printf("stream %d: ", i);System.out.printf("type: %s; ", coder.getCodecType());System.out.printf("codec: %s; ", coder.getCodecID());System.out.printf("duration: %s; ", stream.getDuration());System.out.printf("start time: %s; ", container.getStartTime());System.out.printf("timebase: %d/%d; ",stream.getTimeBase().getNumerator(),stream.getTimeBase().getDenominator());System.out.printf("coder tb: %d/%d; ",coder.getTimeBase().getNumerator(),coder.getTimeBase().getDenominator());System.out.println();if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) {System.out.printf("sample rate: %d; ", coder.getSampleRate());System.out.printf("channels: %d; ", coder.getChannels());System.out.printf("format: %s", coder.getSampleFormat());} else if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) {System.out.printf("width: %d; ", coder.getWidth());System.out.printf("height: %d; ", coder.getHeight());System.out.printf("format: %s; ", coder.getPixelType());System.out.printf("frame-rate: %5.2f; ", coder.getFrameRate().getDouble());}System.out.println();System.out.println("*** End of Stream Info ***");}}}我們首先獲得一個(gè)IContainer實(shí)例,該實(shí)例是一個(gè)數(shù)據(jù)源,其中包含一個(gè)或多個(gè)音頻和視頻數(shù)據(jù)流。 然后,我們嘗試打開媒體文件并使其可供讀取。 如果操作成功,我們可以輕松地檢索信息,例如包含的流數(shù) , 總持續(xù)時(shí)間 , 文件大小和比特率 。
請(qǐng)注意,此信息響應(yīng)容器本身。 但是,我們可以獲得有關(guān)容器組成的各個(gè)流的元數(shù)據(jù)。 我們使用getStream方法來引用相應(yīng)的流,然后使用IstreamCoder(它是可以解碼特定流的解碼器)。 從該對(duì)象中,我們可以找到流的編解碼器類型 , 編解碼器ID和其他信息。
最后,我們能夠區(qū)分音頻和視頻流。 對(duì)于音頻流,我們可以找到使用的采樣率 , 通道數(shù)和音頻采樣格式 。 同樣,對(duì)于視頻流,我們可以獲得尺寸( 寬度和高度 ), 像素格式和幀頻 。
樣本輸出如下所示:
流數(shù):2
持續(xù)時(shí)間(毫秒):260963888
檔案大小(位元組):19007074
比特率:582672
***流信息開始***
流0:類型:CODEC_TYPE_AUDIO; 編解碼器:CODEC_ID_AAC; 持續(xù)時(shí)間:11507712; 開始時(shí)間:0; 時(shí)基:1/44100; 編碼器tb:1/44100;
采樣率:44100; 頻道:2; 格式:FMT_S16
***流信息結(jié)束***
***流信息開始***
流1:類型:CODEC_TYPE_VIDEO; 編解碼器:CODEC_ID_H264; 持續(xù)時(shí)間:7819000; 開始時(shí)間:0; 時(shí)基:1/29962; 編碼器tb:250/14981;
寬度:480; 高度:270; 格式:YUV420P; 幀頻:29.96;
***流信息結(jié)束***
伙計(jì)們。 Xuggler的視頻處理軟件簡(jiǎn)介。 與往常一樣,您可以下載為本教程創(chuàng)建的Eclipse項(xiàng)目 。
在接下來的教程中,我將向您展示Xuggler和FFmpeg可以完成的一些更酷的工作,例如視頻轉(zhuǎn)換和修改。 因此,請(qǐng)繼續(xù)關(guān)注JavaCodeGeeks ! 別忘了分享!
相關(guān)文章:
- 使用wowza和xuggler將RTMP轉(zhuǎn)換為RTSP
- Xuggler教程:轉(zhuǎn)碼和媒體修改
- Xuggler教程:幀捕獲和視頻創(chuàng)建
- 使用VirtualBox在PC上安裝Android OS
翻譯自: https://www.javacodegeeks.com/2011/02/introduction-xuggler-video-manipulation.html
總結(jié)
以上是生活随笔為你收集整理的Xuggler视频处理简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Swing –日期选择器对话框
- 下一篇: 真正的模块化Web应用程序:为什么没有开