tft每日頭條

 > 科技

 > java音頻處理

java音頻處理

科技 更新时间:2024-08-04 19:17:09

  Jave2是什麼

  JAVE2(java音頻視頻編碼器)庫是ffmpeg項目上的Java包裝器。開發人員可以利用JAVE2将音頻和視頻文件從一種格式轉碼為另一種格式。在示例中,您可以将AVI文件轉換為MPEG文件,可以将DivX視頻流轉換為(類似YouTube的)Flash FLV文件,可以将WAV音頻文件轉換為MP3或Ogg Vorbis文件,可以分離并 對音頻和視頻軌道進行轉碼,您可以調整視頻的大小,更改其大小和比例等。JAVE2支持許多其他格式,容器和操作。Jave2 的首頁上介紹:

  JAVE2是一個小的Java庫,它将ffmpeg包裝到java類中。它是基于Carlo Pelliccia的傑作。由于不再維護該代碼,因此我們采用了該代碼,并用當前版本替換了ffmpeg可執行文件,并修改了代碼以使其與新的二進制文件一起使用。

  Jave2 是在Jave的基礎上進行開發的,Jave基于Carlo Pelliccia的 Jave版本,帶有源代碼的原始項目頁面可以在這裡找到:http://www.sauronsoftware.it/projects/jave/ 。我點擊或許塵封很久的 Jave 網站,很慶幸打開了,然後看了下介紹個文檔,真的是很久沒更新了。

  java音頻處理(推薦一款Java音頻編碼器)(1)

  大緻看了下Documentation,如下安裝要求。

  Installation and requirements

  In order to use JAVE in your Java application, you have to add the Filejave-1.0.jar in your application CLASSPATH.JAVE runs on a Java Runtime Environment J2SE v.1.4 or later.

  意思也就是要用JAVE的話,需要将jave-1.0.jar 加入到應該的CLASSPATH下,然後JRE 的版本是J2SE v.1.4 。看了這句描述,你就應該知道這個項目是“古董”級别的項目了。

  J2SE v.1.4 ,估計很多小夥伴隻是聽過,根本沒有用過。

  文檔中其他的一些使用說明就不詳細展開了,感興趣的夥伴可以看下。地址上面已經貼出來。

  Jave2 怎麼玩

  jave2 github :httgt;

  如果你想在一個或多個平台上使用,那麼必須要引入 jave-core ,

  dependencygroupIdws.schild/groupIdartifactIdjave-core/artifactIdversion2.7.3/version/dependency

  然後是平台的特定jar。

  如果僅在 Linux 64Bit 平台,則加入下面的依賴配置。 dependencygroupIdws.schild/groupIdartifactIdjave-nativebin-linux64/artifactIdversion2.7.3/version/dependency

  如果僅在 Windows 64Bit 平台,則加入下面的依賴配置。 dependencygroupIdws.schild/groupIdartifactIdjave-nativebin-win64/artifactIdversion2.7.3/version/dependency

  如果僅在 MACOS 64Bit 平台,則加入下面的依賴配置。 dependencygroupIdws.schild/groupIdartifactIdjave-nativebin-osx64/artifactIdversion2.7.3/version/dependency

  Gradle方式這裡就不做介紹 ,自行看文檔說明,也比較簡單。

  實戰演練

  我用的是window 64 ,引入了最新 2.7.3版本 jave-core 、 jave-nativebin-win6

  将arm文件轉為mp3文件

  publicclassArmToMp3Test{ privatestaticLoggerlogger=LoggerFactory.getLogger(ArmToMp3Test.class); publicstaticvoidmain(String[]args){ try{ Filesource=newFile(D:\\tmp\\Java編程技術樂園.amr Filetarget=newFile(D:\\tmp\\java編程技術樂園amrToMp3.mp3 //audioAttributes AudioAttributesaudio=newAudioAttributes(); audio.setCodec(libmp3lame audio.setBitRate(128000); audio.setChannels(2); audio.setSamplingRate(44100); //Encodingattributes EncodingAttributesattrs=newEncodingAttributes(); attrs.setFormat(mp3 attrs.setAudioAttributes(audio); //Encode Encoderencoder=newEncoder(); encoder.encode(newMultimediaObject(source),target,attrs); }catch(Exceptionex){ logger.error(ArmToMp3Test#main異常 } } } //執行完,在D:\\tmp\Java編程技術樂園amrToMp3.mp3

  使用監聽器監聽轉換進度-高級一點的用法

  用到 ws.schild.jave.EncoderProgressListener 接口:編碼進度偵聽器接口。實現類的實例可以用來聽的編碼過程。

  publicinterfaceEncoderProgressListener{ /** *Thismethodiscalledbeforetheencodingprocessstarts,reporting *informationaboutthesourcestreamthatwillbedecodedandre-encoded. *這種方法是在編碼過程開始之前被調用,報告關于将被解碼和再編碼的源數據位流的信息. *@paraminfoInformationsaboutthesourcemultimediastream. */ publicvoidsourceInfo(MultimediaInfoinfo); /** *Thismethodiscalledtonotifyaprogressintheencodingprocess. *這種方法被稱為通知在編碼過程中的進度。 *@parampermilApermilvaluerepresentingtheencodingprocessprogress. */ publicvoidprogress(intpermil); /** *Thismethodiscalledeverytimetheencoderneedtosendamessage *(usually,awarning). *這種方法被稱為每次編碼器需要發送一條消息(通常,一個警告)。 *@parammessageThemessagesentbytheencoder. */ publicvoidmessage(Stringmessage); }

  MyChanageEncoderProgressListener /** *自定義實現{@LinkEncoderProgressListener}監聽編碼進度 *@Author:dufy */ publicclassMyChanageEncoderProgressListenerimplementsEncoderProgressListener{ privatestaticLoggerlogger=LoggerFactory.getLogger(MyChanageEncoderProgressListener.class); @Override publicvoidsourceInfo(MultimediaInfoinfo){ longls=info.getDuration()/1000; inthour=(int)(ls/3600); intminute=(int)(ls%3600)/60; intsecond=(int)(ls-hour*3600-minute*60); Stringlength=hour 時 minute 分 second 秒 logger.info(MyChanageEncoderProgressListener#sourceInfo---,info.toString()); logger.info(MyChanageEncoderProgressListener#length---,length); } @Override publicvoidprogress(intpermil){ logger.info(MyChanageEncoderProgressListener#progress---,permil); } @Override publicvoidmessage(Stringmessage){ logger.info(MyChanageEncoderProgressListener#message---,message); } }

  MovToMp4ListenerTest publicclassMovToMp4ListenerTest{ privatestaticLoggerlogger=LoggerFactory.getLogger(MovToMp4ListenerTest.class); publicstaticvoidmain(String[]args){ try{ Filesource=newFile(D:\\tmp\\高清有碼-小電影.mov Filetarget=newFile(D:\\tmp\\高清無碼-小電影.mp4 AudioAttributesaudio=newAudioAttributes(); audio.setCodec(libvorbis VideoAttributesvideo=newVideoAttributes(); video.setCodec(mpeg4 video.setBitRate(newInteger(160000)); video.setFrameRate(newInteger(30)); EncodingAttributesattrs=newEncodingAttributes(); attrs.setFormat(mp4 attrs.setAudioAttributes(audio); attrs.setVideoAttributes(video); //Encode Encoderencoder=newEncoder(); encoder.encode(newMultimediaObject(source),target,attrs,newMyChanageEncoderProgressListener()); }catch(Exceptionex){ logger.error(MovToMp4ListenerTest#main異常 } } }

  這裡 有兩個點說明下:

  使用了監聽器,能夠監聽 視頻轉換的進度 java音頻處理(推薦一款Java音頻編碼器)(4)

  獲取了視頻的時長,其實大小也是可以獲取的。 hour 時 minute 分 second 秒

  注:因為音視頻的編碼格式挺多,很多編解碼協議還沒看。上面例子也是找的文檔配置,如有不對,歡迎指出。

  其實jave2還有很多高端的操作,後續有機會在整理出來。

  問題收集

  1、有小夥伴在執行的時候遇到了如下報錯:

  Cannot run program

  C:\xxx\Local\Temp\jave\ffmpeg-amd64-2.7.3.exe

  ws.schild.jave.EncoderException:java.io.IOException:CannotrunprogramC:\Users\acer\AppData\Local\Temp\jave\ffmpeg-amd64-2.7.3.exe:CreateProcesserror=2, 系統找不到指定的文件。 atws.schild.jave.Encoder.encode(Encoder.java:640) atws.schild.jave.Encoder.encode(Encoder.java:398) atws.schild.jave.Encoder.encode(Encoder.java:363) atorg.learn.jave2.ArmToMp3Test.main(ArmToMp3Test.java:35)

  報這個錯這就是沒加 jave-nativebin-win64 這個依賴。這裡說明下,添加了win-64 jar,執行的時候會默認在本地下載一個 ffmpeg-amd64-2.7.3.exe 。

  java音頻處理(推薦一款Java音頻編碼器)(5)

  相關源碼:

  Encoderencoder=newEncoder(); publicEncoder(){ this.locator=newDefaultFFMPEGLocator(); } //DefaultFFMPEGLocator publicDefaultFFMPEGLocator(){ //獲取操作系統類型 Stringos=System.getProperty(os.name).toLowerCase(); booleanisWindows=os.contains(windows booleanisMac=os.contains(mac LOG.debug(OsnameisisWindows:{}isMac:{},newObject[]{os,isWindows,isMac}); FiledirFolder=newFile(System.getProperty(java.io.tmpdirjave/ if(!dirFolder.exists()){ LOG.debug(Creatingjavetempfoldertoplaceexecutablesin,dirFolder.getAbsolutePath()); dirFolder.mkdirs(); }else{ LOG.debug(Javetempfolderexistsin,dirFolder.getAbsolutePath()); } //獲取文件的後綴 Stringsuffix=isWindows?.exe:(isMac?-osx Stringarch=System.getProperty(os.arch //獲取ffmpeg文件, FileffmpegFile=newFile(dirFolder,ffmpeg- arch 2.7.3 suffix); LOG.debug(Executablepath:{},ffmpegFile.getAbsolutePath()); if(ffmpegFile.exists()){ LOG.debug(Executableexistsin,ffmpegFile.getAbsolutePath()); }else{ LOG.debug(Needtocopyexecutableto,ffmpegFile.getAbsolutePath()); this.copyFile(ffmpeg- arch suffix,ffmpegFile); } if(!isWindows){ try{ Runtime.getRuntime().exec(newString[]{/bin/chmod755,ffmpegFile.getAbsolutePath()}); }catch(IOExceptionvar9){ LOG.error(Errorsettingexecutableviachmod } } //知道了文件的路徑 this.path=ffmpegFile.getAbsolutePath(); LOG.debug(ffmpegexecutablefound:{},this.path); } privatevoidcopyFile(Stringpath,Filedest){ //拷貝文件代碼,具體略 }

  ,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved