隨著互聯網上視頻的爆炸式增長,開發人員經常需要在其應用程序中操縱視頻內容。 Xuggler是Java開發人員的免費開放源代碼庫,可用于實時解壓縮,處理和壓縮錄制的視頻或實時視頻。 Xuggler在后臺使用了功能非常強大的FFmpeg媒體處理庫,實際上在它們周圍扮演著Java包裝器的角色。 這是從Java解壓縮,修改和重新壓縮任何媒體文件(或流)的簡單方法。
FFmpeg是一個完整的跨平臺解決方案,用于記錄,轉換和流式傳輸音頻和視頻,并支持多種格式。 即使您不知道它,也很可能已經在計算機上使用它。 但是,Xuggler的用途不僅限于提供對復雜FFmpeg本機庫的輕松訪問。 Xuggler開發團隊還不斷對FFmpeg進行改進。 您可以在Xuggle博客上找到最新消息,該博客中還發布了許多教程。 千萬不要錯過這些家伙的過分簡單的互聯網視頻指南 。
讓我們繼續獲取FFmpeg。 請注意,Xuggler帶有自己的(改進的)FFmpeg版本,以避免配置錯誤,因此您不必手動獲取FFmpeg。 在此過程中,我們將在將控制權交給Xuggler之前直接使用FFmpeg進行一些測試,因此您可能希望將原始版本作為單獨的可執行文件使用。
轉到FFmpeg下載頁面并獲取最新發行版,當時的版本為0.6.1。 對于Linux,您可以從tarball下載源代碼并繼續進行編譯。 在Windows中,您可能應該獲得預編譯的二進制文件。 我使用了Mplayer-win32提供的一個,可以從這里獲得。 您將在此處找到ffmpeg.exe可執行文件。 將其復制到一個特定的文件夾中,我選擇“ C:\ programs \ ffmpeg”,如果不想每次都寫完整的路徑,可以選擇將ffmpeg.exe添加到系統路徑中。
要測試可執行文件是否正常工作,請打開終端并在不帶參數的情況下運行它。 您應該看到類似于以下的輸出:
FFmpeg版本SVN-r21231-Sherpya,版權所有(c)2000-2010 Fabrice Bellard等。
建于2010年1月16日05:42:31與gcc 4.2.5 20080919(預發行)[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 [選項] [[infile選項] -i infile]…{[outfile選項] outfile}…
使用-h獲得完整的幫助,或者甚至更好地運行'man ffmpeg'
您也可以使用輸出建議的“ -h”開關來接收一堆冗長的參數和選項。 最好查看在線FFmpeg文檔 。
下一步是對您的第一個視頻進行轉碼 ,可能是從預錄制的文件中轉碼 。 我的輸入文件是一個4分鐘20秒長的MP4視頻,大小為18.1MB,稱為“ myvideo.mp4”。 我想將其轉換為Flash視頻,從而大大降低其質量。 使用FFmpeg可以很容易地通過發出以下命令來完成此操作(注意對路徑使用正斜杠):
ffmpeg.exe -i C:/myvideo.mp4 C:/myvideo.flv
控制臺輸出如下所示:
FFmpeg版本SVN-r21231-Sherpya,版權所有(c)2000-2010 Fabrice Bellard等。
建于2010年1月16日05:42:31與gcc 4.2.5 20080919(預發行)[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:
元數據: major_brand:mp42 minor_version:0 兼容品牌:isomavc1mp42 持續時間: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:輸出緩沖區太小(緩沖區索引:9404,可用字節:388) 音頻編碼失敗
忽略“音頻編碼失敗”消息,沒有錯誤。 結果是一個不錯的,可播放的FLV文件,名為“ myvideo.flv”,大小為10.1MB。
太酷了,讓我們繼續安裝Xuggler。 首先,我們從Xuggler下載頁面獲取最新版本。 如此處所述:
Xuggler由兩個主要部分組成; 一組Java jar文件和一組本機共享庫(Windows上的.dll文件,Linux上的.so文件或Mac上的.dylib文件)。 要使用它,您需要先安裝本機庫,然后才能編寫使用Xuggler的程序。
確保下載與操作系統的體系結構和Java版本匹配的正確文件。 例如,我下載了Windows的32位(對于Windows沒有64位),Java 1.5或更高版本,它基本上是一個安裝程序。
您可以在下載頁面中找到有關如何安裝本機庫的說明。 對于Windows,您可以卸載任何以前的版本,然后運行安裝程序,當然還要重新啟動計算機 。 還有一個視頻介紹了如何在Microsoft Windows上安裝Xuggler 。 重新啟動后,讓我們測試安裝是否成功。 首先,我們檢查Xuggle路徑變量是否已設置:
C:\>回聲%XUGGLE_HOME%
C:\ Program檔案(x86)\ Xuggle
路徑已正確設置。 請注意,Xuggler FFmpeg可執行文件位于“%XUGGLE_HOME%/ bin”文件夾中。
讓我們通過發出以下命令來播放我們的第一個視頻(將“ c:/myvideo.mp4”替換為您的文件):
java -cp“%XUGGLE_HOME%\ share \ java \ jars \ xuggle-xuggler.jar” com.xuggle.xuggler.demos.DecodeAndPlayVideo c:/myvideo.mp4
是時候使用Xuggler編寫我們的第一個代碼了。 我們將檢查視頻文件,找到其媒體容器,并打印出內容摘要。 同時,將Xuggle API Javadocs加入書簽,以備將來參考。
啟動您喜歡的IDE,創建一個新項目,然后導入在“%XUGGLE_HOME%/ share / java / jars”文件夾中找到的所有JAR文件。 該示例類似于如何在Eclipse中編寫您的第一個Xuggler應用程序一文中提供的示例。
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 ***");}}}
我們首先獲得一個IContainer實例,該實例是一個數據源,其中包含一個或多個音頻和視頻數據流。 然后,我們嘗試打開媒體文件并使其可供讀取。 如果操作成功,我們可以輕松地檢索信息,例如包含的流數 , 總持續時間 , 文件大小和比特率 。
請注意,此信息響應容器本身。 但是,我們可以獲得有關容器組成的各個流的元數據。 我們使用getStream方法來引用相應的流,然后使用IstreamCoder(它是可以解碼特定流的解碼器)。 從該對象中,我們可以找到流的編解碼器類型 , 編解碼器ID和其他信息。
最后,我們能夠區分音頻和視頻流。 對于音頻流,我們可以找到使用的采樣率 , 通道數和音頻采樣格式 。 同樣,對于視頻流,我們可以獲得尺寸( 寬度和高度 ), 像素格式和幀頻 。
樣本輸出如下所示:
流數:2
持續時間(毫秒):260963888
檔案大小(位元組):19007074
比特率:582672
***流信息開始***
流0:類型:CODEC_TYPE_AUDIO; 編解碼器:CODEC_ID_AAC; 持續時間:11507712; 開始時間:0; 時基:1/44100; 編碼器tb:1/44100;
采樣率:44100; 頻道:2; 格式:FMT_S16
***流信息結束***
***流信息開始***
流1:類型:CODEC_TYPE_VIDEO; 編解碼器:CODEC_ID_H264; 持續時間:7819000; 開始時間:0; 時基:1/29962; 編碼器tb:250/14981;
寬度:480; 高度:270; 格式:YUV420P; 幀頻:29.96;
***流信息結束***
伙計們。 Xuggler的視頻處理軟件簡介。 與往常一樣,您可以下載為本教程創建的Eclipse項目 。
在接下來的教程中,我將向您展示Xuggler和FFmpeg可以完成的一些更酷的工作,例如視頻轉換和修改。 因此,請繼續關注JavaCodeGeeks ! 別忘了分享!
相關文章:
- 使用wowza和xuggler將RTMP轉換為RTSP
- Xuggler教程:轉碼和媒體修改
- Xuggler教程:幀捕獲和視頻創建
- 使用VirtualBox在PC上安裝Android OS
翻譯自: https://www.javacodegeeks.com/2011/02/introduction-xuggler-video-manipulation.html