Xuggler視頻處理簡介

注意:這是我們的“ Xuggler開發教程 ”系列的一部分。

隨著互聯網上視頻的爆炸式增長,開發人員經常需要在其應用程序中操縱視頻內容。 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374939.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件測試中條件覆蓋,路徑覆蓋,語句覆蓋,分支覆蓋的區別

轉&#xff1a;軟件測試中條件覆蓋&#xff0c;路徑覆蓋&#xff0c;語句覆蓋&#xff0c;分支覆蓋的區別 舉個例子吧 if A and B then Action1 if C or D then Action2 語句覆蓋最弱&#xff0c;只需要讓程序中的語句都執行一遍即可 …

Spring_講解

http://s&#xff0c;i&#xff0c;s&#xff0c;h&#xff0c;u&#xff0c;o&#xff0c;k.com/forum/blogPost/list/6174.html轉載于:https://www.cnblogs.com/gisblogs/p/4579162.html

使用Spring AspectJ和Maven進行面向方面的編程

Spring框架附帶AOP支持。 實際上&#xff0c;如Spring參考文檔中所述 &#xff0c; “ Spring的關鍵組件之一是AOP框架。 盡管Spring IoC容器不依賴于AOP&#xff0c;這意味著您不需要使用AOP&#xff0c;但AOP是對Spring IoC的補充&#xff0c;以提供功能強大的中間件解決方案…

hadoop5--mapreduce設計模式

運行結果附圖 本節課程主要內容為學習MapReduc設計模式&#xff0c;并編寫java程序對日志文件進行處理。 課本上介紹的MapReduce的設計模式主要包含:計數(Counting),分類(Classification),過濾處理(Filtering),排序(Sorting),去重計數(Distinct Counting),相關計數(Cross-Corre…

ES5中新增的Array方法詳細說明

http://www.zhangxinxu.com/wordpress/2013/04/es5%E6%96%B0%E5%A2%9E%E6%95%B0%E7%BB%84%E6%96%B9%E6%B3%95/轉載于:https://www.cnblogs.com/lmw425317/p/5339539.html

jqGrid,REST,AJAX和Spring MVC集成

兩年多以前&#xff0c;我寫了一篇關于兩個如何在Struts2中實現優雅的CRUD的文章。 實際上&#xff0c;我必須就該主題寫兩篇文章&#xff0c;因為該主題如此廣泛。 今天&#xff0c;我采用了一套更為流行的&#xff0c;完善的框架和庫&#xff0c;采用了更為輕量級的現代方法。…

Java-馬士兵設計模式學習筆記-代理模式--動態代理 修改成可以代理任意接口

一、概述 1.目標&#xff1a;把Proxy修改成可以代理任意接口及其任意方法 2.思路&#xff1a; (1)代理任意接口&#xff1a;把接口類型作為參數傳給Proxy的newProxyInstance(Class interfze) (2)代理任意方法&#xff1a;用interfze.getMethods()取出所有方法&#xff0c;拼接實…

PTA習題

PTA習題 PTA浙大版《C語言程序設計&#xff08;第3版&#xff09;》 題目集5-6 水仙花數是指一個N位正整數&#xff08;N≥3&#xff09;&#xff0c;它的每個位上的數字的N次冪之和等于它本身。 本題要求編寫兩個函數&#xff0c;一個判斷給定整數是否水仙花數&#xff0c;…

acdream 1409 Musical 狀壓DP

鏈接&#xff1a;http://acdream.info/problem?pid1409 題意&#xff1a;整個國家有n座城市&#xff0c;每座城市有三種粉絲。 第一種一周看一場音樂劇&#xff0c;挑選的音樂劇是已經在周圍城市播放上演過的次數最多的音樂劇中的隨機一個。 另外一種每天看一場音樂劇&#xf…

真正的模塊化Web應用程序:為什么沒有開發標準?

OSGI &#xff0c; SpringSource &#xff0c; Jboss模塊 &#xff0c;J2EE和清單永遠不會結束。所有這些技術都向他們的最終用戶/開發人員保證了相同的東西&#xff0c;或多或少是Java模塊化Web應用程序&#xff08;&#xff1f;&#xff09;。 但是&#xff0c;我們當中有多少…

C語言5-7習題

本題要求實現一個函數&#xff0c;用下列公式求cos(x)的近似值&#xff0c;精確到最后一項的絕對值小于e&#xff1a; #include <stdio.h> #include <math.h>double funcos( double e, double x );int main() { double e, x;scanf("%lf %lf", &…

JDBC批處理executeBatch

JDBC運行SQL聲明&#xff0c;有兩個處理接口&#xff0c;一PreparedStatement,Statement,一般程序JDBC有多少仍然比較PreparedStatement 只要運行批處理&#xff0c;PreparedStatement少一點Statement ps conn.prepareStatement(sql); for(int i 0;i<10;i){ ps.setString(…

BC div2補題以及 復習模除 逆元__BestCoder Round #78 (div.2)

第一題沒話說 智商欠費 加老柴輔導終于過了 需要在意的是數據范圍為2的63次方-1 三個數相加肯定爆了 四邊形的定義  任意邊小于其余三邊之和 換句話說就是  最長邊小于其余三邊之和 這樣的話問題轉化為 最長邊依次減其余三邊的結果是否小于等于0 還有一點是題目出現0邊 即最…

習題6-1 分類統計字符個數 (15 分)

本題要求實現一個函數&#xff0c;統計給定字符串中英文字母、空格或回車、數字字符和其他字符的個數。 函數接口定義&#xff1a; void StringCount( char s[] );其中 char s[] 是用戶傳入的字符串。函數StringCount須在一行內按照 letter 英文字母個數, blank 空格或回車…

Servlet 3.0異步處理可將服務器吞吐量提高十倍

Servlet是Java中處理服務器端邏輯的主要組件&#xff0c;新的3.0規范引入了一些非常有趣的功能&#xff0c;其中異步處理是最重要的功能之一。 可以利用異步處理來開發高度可伸縮的Web應用程序。 使用此功能可以有效地構建Web 2.0站點和AJAX應用程序。 我們的JCG合作伙伴之一To…

使用secureCRT連接VMware-Ubuntukylin虛擬機

使用SecureCRT連接VMware時總是提醒主機拒絕連接。這時可以使用sudo apt-get install openssh-server openssh-client&#xff0c;在主機上安裝ssh. 安裝成功后&#xff0c;可以連接到主機了。 如果顯示遠程主機拒絕連接。則可以使用如下方法。 VMware里面裝的是Ubuntukylin版本…

加載音頻Audio

var cameraAudio new Audio(); cameraAudio.src camera.wav;// 設置音頻對象的屬性,預加載視頻 var options_audio { preload : auto } for(var key in options_audio){ if(options_audio.hasOwnProperty(key) && (key in cameraAudio)){ cameraAudio[key] opti…

習題6-2 使用函數求特殊a串數列和 (20 分)

給定兩個均不超過9的正整數a和n&#xff0c;要求編寫函數求aaaaaa?aa?a&#xff08;n個a&#xff09;之和。 int fn( int a, int n ); int SumA( int a, int n );其中函數fn須返回的是n個a組成的數字&#xff1b;SumA返回要求的和。 我的代碼&#xff1a; int fn( int a, i…

Java中可怕的雙重檢查鎖定成語

本文討論的問題不是新問題&#xff0c;但即使是經驗豐富的開發人員也仍然很棘手。 單例模式是常見的編程習慣。 但是&#xff0c;當與多個線程一起使用時&#xff0c;必須進行某種類型的同步&#xff0c;以免破壞代碼。 Khangaonkar報告中的 JCG合作伙伴Manoj Khangaonkar在一篇…

國內有哪些好的刷題網站?

http://www.zhihu.com/question/25574458 Luau Lawrence&#xff0c;Data Mining 弱雞 / PhDNTU 溫夢強、石一帆、知乎用戶 等人贊同 - Welcome To PKU JudgeOnline 北京大學的Online Judge。POJ上面的題目有點老了&#xff0c;但好處是做的人多&#xff0c;經典算法題多&…