JAVE?官方的jar包帶了ffmpeg的exe程序,所以在windows上可以直接使用,
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),昭通企業(yè)網(wǎng)站建設(shè),昭通品牌網(wǎng)站建設(shè),網(wǎng)站定制,昭通網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,昭通網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
但是如果要在Linux上用就得先把ffmpeg的環(huán)境裝好。
File?source?=?new?File("source.wav");
File?target?=?new?File("target.mp3");
AudioAttributes?audio?=?new?AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(new?Integer(128000));
audio.setChannels(new?Integer(2));
audio.setSamplingRate(new?Integer(44100));
EncodingAttributes?attrs?=?new?EncodingAttributes();
attrs.setFormat("mp3");
attrs.setAudioAttributes(audio);
Encoder?encoder?=?new?Encoder();
encoder.encode(source,?target,?attrs);
Jar下載地址:
步驟
運(yùn)行添加視頻文件。打開貍(liwo)窩全能轉(zhuǎn)換器后,單擊界面左上角的第一個(gè)按鈕“添加視頻”,瀏覽打開文件夾并將amr音樂文件導(dǎo)入到軟件。有的用戶可以會(huì)疏忽的,就是在打開文件夾時(shí)沒發(fā)現(xiàn)有amr文件,其實(shí)有可能忘掉選擇文件類型了,選擇All Files(*.*),即所有文件,就可以看到了。
視頻編輯。軟件提供有視頻編輯和3D效果的功能,這是對(duì)視頻而言的。對(duì)于音頻,我們可以使用軟件的視頻編輯功能。單擊主界面左上方第二個(gè)按鈕“視頻編輯”,即可進(jìn)入編輯窗口。如圖所示,可以對(duì)音頻進(jìn)行切割,比如音樂太大的時(shí)候可以用,剪掉不需要的一段,保存需要的一段。
選擇預(yù)置方案。軟件支持輸出aac、ac3、aiff、amr、m4a、mp2、mp3、ogg、ra、au、wav、wma、mka、flac(無損)、wav(無損)等格式音頻。這里在分類“常用音頻”中就可以找到需要轉(zhuǎn)換的mp3格式-MP3-MPEG Layer-3 Audio (*.mp3) 流行的音頻格式,具有很好的音質(zhì)和很小的體積。
參數(shù)設(shè)置。在“預(yù)置方案”右邊是“高級(jí)設(shè)置”,單擊進(jìn)入設(shè)置窗口,可以進(jìn)行音頻參數(shù)設(shè)置。新手不用進(jìn)行此項(xiàng)設(shè)置,因?yàn)檐浖呀?jīng)按照常用格式,使用范圍等進(jìn)行分類設(shè)置了,其參數(shù)相差不大。只是按照所需要的在預(yù)置方案中選擇相應(yīng)格式即可。
5
開始轉(zhuǎn)換。設(shè)置完畢后,單擊主界面右下角的圓形按鈕,軟件開始轉(zhuǎn)換音頻文件。轉(zhuǎn)換沒有先后順序,是同時(shí)進(jìn)行轉(zhuǎn)換。軟件轉(zhuǎn)換速度較快,加上音頻文件體積本來就不大,最多的一分鐘即可轉(zhuǎn)換完畢
真正的萬能視頻轉(zhuǎn)換工具,扔掉那些所謂的什么白金大師吧!!!
綠色(安裝到其他機(jī)器,拷過來也可以使用)!無插件!同濟(jì)學(xué)子開發(fā)的免費(fèi)軟件,更新快!
MediaCoder是一個(gè)免費(fèi)的通用音頻/視頻批量轉(zhuǎn)碼工具,它將眾多來自開源社區(qū)的優(yōu)秀音頻視頻編解碼器和工具整合為一個(gè)通用的解決方案,它可以將音頻、視頻文件在各種格式之間進(jìn)行轉(zhuǎn)換。
特點(diǎn)聚焦:
直接、批量地在眾多音頻視頻壓縮格式和容器格式之間進(jìn)行轉(zhuǎn)換
無需安裝任何媒體播放器或編碼器
純綠色軟件,不在系統(tǒng)中注冊(cè)任何組件
完全使用Win32
SDK開發(fā),高效、緊湊,不依賴于任何中間層(如.NET,
JAVA等)
典型應(yīng)用:
提高壓縮率/減小文件尺寸
將無損音頻或者高碼率的有損音頻轉(zhuǎn)換轉(zhuǎn)換為較低碼率的有損音頻,以便用便攜式數(shù)字音樂播放設(shè)備欣賞
轉(zhuǎn)換至可在各種設(shè)備(如手機(jī)、PDA、MP4播放器、VCD/DVD播放機(jī))上播放的格式
提取視頻文件中的音軌
保存CD/VCD/DVD
支持的輸入格式:
MP3,
Ogg
Vorbis,
AAC,
AAC+/Parametric
Stereo,
AMR
NB/WB,
MusePack,
WMA,
RealAudio
FLAC,
WavPack,
Monkey's
Audio
(APE,
APL),
OptimFrog,
AAC
Lossless,
WMA
Lossless,
WAV
H.264,
Xvid,
DivX
4/5,
MPEG
1/2/4,
H.263,
3ivx,
RealVideo,
Windows
Media
Video
7/8/9,
DV
AVI,
MPEG/VOB,
Matroska,
MP4,
RealMedia,
ASF/WMV,
Quicktime
MOV,
OGM
CD,
VCD,
DVD,
CUE
Sheets
支持的輸出格式:
MP3,
Ogg
Vorbis,
AAC,
AAC+/Parametric
Stereo,
AMR
NB/WB,
MusePack,
WMA
FLAC,
WavPack,
Monkey's
Audio
(APE,
APL),
OptimFrog,
WMA
Lossless,
WAV
H.264,
Xvid,
DivX
4/5,
MPEG
1/2/4,
H.263,
Flash
Video,
etc.
AVI,
MPEG/VOB,
Matroska,
MP4,
PMP
(PSP媒體播放器格式)
另外,虛機(jī)團(tuán)上產(chǎn)品團(tuán)購(gòu),超級(jí)便宜
/*
*?實(shí)現(xiàn)錄音機(jī)的功能
*/
package?com.liuyun.MyRecord1;
import?java.awt.*;
import?javax.swing.*;
import?java.awt.event.*;
import?java.io.*;
import?javax.sound.sampled.*;
import?java.lang.*;
public?class?MyRecord?extends?JFrame?implements?ActionListener{
//定義錄音格式
AudioFormat?af?=?null;
//定義目標(biāo)數(shù)據(jù)行,可以從中讀取音頻數(shù)據(jù),該?TargetDataLine?接口提供從目標(biāo)數(shù)據(jù)行的緩沖區(qū)讀取所捕獲數(shù)據(jù)的方法。
TargetDataLine?td?=?null;
//定義源數(shù)據(jù)行,源數(shù)據(jù)行是可以寫入數(shù)據(jù)的數(shù)據(jù)行。它充當(dāng)其混頻器的源。應(yīng)用程序?qū)⒁纛l字節(jié)寫入源數(shù)據(jù)行,這樣可處理字節(jié)緩沖并將它們傳遞給混頻器。
SourceDataLine?sd?=?null;
//定義字節(jié)數(shù)組輸入輸出流
ByteArrayInputStream?bais?=?null;
ByteArrayOutputStream?baos?=?null;
//定義音頻輸入流
AudioInputStream?ais?=?null;
//定義停止錄音的標(biāo)志,來控制錄音線程的運(yùn)行
Boolean?stopflag?=?false;
//記錄開始錄音的時(shí)間
long?startPlay;
//定義所需要的組件
JPanel?jp1,jp2,jp3;
JLabel?jl1=null;
JButton?captureBtn,stopBtn,playBtn,saveBtn;
public?static?void?main(String[]?args)?{
//創(chuàng)造一個(gè)實(shí)例
MyRecord?mr?=?new?MyRecord();
}
//構(gòu)造函數(shù)
public?MyRecord()
{
//組件初始化
jp1?=?new?JPanel();
jp2?=?new?JPanel();
jp3?=?new?JPanel();
//定義字體
Font?myFont?=?new?Font("華文新魏",Font.BOLD,30);
jl1?=?new?JLabel("錄音機(jī)功能的實(shí)現(xiàn)");
jl1.setFont(myFont);
jp1.add(jl1);
captureBtn?=?new?JButton("開始錄音");
//對(duì)開始錄音按鈕進(jìn)行注冊(cè)監(jiān)聽
captureBtn.addActionListener(this);
captureBtn.setActionCommand("captureBtn");
//對(duì)停止錄音進(jìn)行注冊(cè)監(jiān)聽
stopBtn?=?new?JButton("停止錄音");
stopBtn.addActionListener(this);
stopBtn.setActionCommand("stopBtn");
//對(duì)播放錄音進(jìn)行注冊(cè)監(jiān)聽
playBtn?=?new?JButton("播放錄音");
playBtn.addActionListener(this);
playBtn.setActionCommand("playBtn");
//對(duì)保存錄音進(jìn)行注冊(cè)監(jiān)聽
saveBtn?=?new?JButton("保存錄音");
saveBtn.addActionListener(this);
saveBtn.setActionCommand("saveBtn");
this.add(jp1,BorderLayout.NORTH);
this.add(jp2,BorderLayout.CENTER);
this.add(jp3,BorderLayout.SOUTH);
jp3.setLayout(null);
jp3.setLayout(new?GridLayout(1,?4,10,10));
jp3.add(captureBtn);
jp3.add(stopBtn);
jp3.add(playBtn);
jp3.add(saveBtn);
//設(shè)置按鈕的屬性
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(false);
saveBtn.setEnabled(false);
//設(shè)置窗口的屬性
this.setSize(400,300);
this.setTitle("錄音機(jī)");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public?void?actionPerformed(ActionEvent?e)?{
if(e.getActionCommand().equals("captureBtn"))
{
//點(diǎn)擊開始錄音按鈕后的動(dòng)作
//停止按鈕可以啟動(dòng)
captureBtn.setEnabled(false);
stopBtn.setEnabled(true);
playBtn.setEnabled(false);
saveBtn.setEnabled(false);
//調(diào)用錄音的方法
capture();
//記錄開始錄音的時(shí)間
startPlay?=?System.currentTimeMillis();
}else?if?(e.getActionCommand().equals("stopBtn"))?{
//點(diǎn)擊停止錄音按鈕的動(dòng)作
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(true);
saveBtn.setEnabled(true);
//調(diào)用停止錄音的方法
stop();
//記錄停止錄音的時(shí)間
long?stopPlay?=?System.currentTimeMillis();
//輸出錄音的時(shí)間
System.out.println("Play?continues?"?+?(stopPlay-startPlay));
}else?if(e.getActionCommand().equals("playBtn"))
{
//調(diào)用播放錄音的方法
play();
}else?if(e.getActionCommand().equals("saveBtn"))
{
//調(diào)用保存錄音的方法
save();
}
}
//開始錄音
public?void?capture()
{
try?{
//af為AudioFormat也就是音頻格式
af?=?getAudioFormat();
DataLine.Info?info?=?new?DataLine.Info(TargetDataLine.class,af);
td?=?(TargetDataLine)(AudioSystem.getLine(info));
//打開具有指定格式的行,這樣可使行獲得所有所需的系統(tǒng)資源并變得可操作。
td.open(af);
//允許某一數(shù)據(jù)行執(zhí)行數(shù)據(jù)?I/O
td.start();
//創(chuàng)建播放錄音的線程
Record?record?=?new?Record();
Thread?t1?=?new?Thread(record);
t1.start();
}?catch?(LineUnavailableException?ex)?{
ex.printStackTrace();
return;
}
}
//停止錄音
public?void?stop()
{
stopflag?=?true;
}
//播放錄音
public?void?play()
{
//將baos中的數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)據(jù)
byte?audioData[]?=?baos.toByteArray();
//轉(zhuǎn)換為輸入流
bais?=?new?ByteArrayInputStream(audioData);
af?=?getAudioFormat();
ais?=?new?AudioInputStream(bais,?af,?audioData.length/af.getFrameSize());
try?{
DataLine.Info?dataLineInfo?=?new?DataLine.Info(SourceDataLine.class,?af);
sd?=?(SourceDataLine)?AudioSystem.getLine(dataLineInfo);
sd.open(af);
sd.start();
//創(chuàng)建播放進(jìn)程
Play?py?=?new?Play();
Thread?t2?=?new?Thread(py);
t2.start();
}?catch?(Exception?e)?{
e.printStackTrace();
}finally{
try?{
//關(guān)閉流
if(ais?!=?null)
{
ais.close();
}
if(bais?!=?null)
{
bais.close();
}
if(baos?!=?null)
{
baos.close();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
}
}
//保存錄音
public?void?save()
{
//取得錄音輸入流
af?=?getAudioFormat();
byte?audioData[]?=?baos.toByteArray();
bais?=?new?ByteArrayInputStream(audioData);
ais?=?new?AudioInputStream(bais,af,?audioData.length?/?af.getFrameSize());
//定義最終保存的文件名
File?file?=?null;
//寫入文件
try?{
//以當(dāng)前的時(shí)間命名錄音的名字
//將錄音的文件存放到F盤下語音文件夾下
File?filePath?=?new?File("F:/語音文件");
if(!filePath.exists())
{//如果文件不存在,則創(chuàng)建該目錄
filePath.mkdir();
}
long?time?=?System.currentTimeMillis();
file?=?new?File(filePath+"/"+time+".wav");
AudioSystem.write(ais,?AudioFileFormat.Type.WAVE,?file);
//將錄音產(chǎn)生的wav文件轉(zhuǎn)換為容量較小的mp3格式
//定義產(chǎn)生后文件名
String?tarFileName?=?time+".mp3";
Runtime?run?=?null;
try?{
run?=?Runtime.getRuntime();
long?start=System.currentTimeMillis();
//調(diào)用解碼器來將wav文件轉(zhuǎn)換為mp3文件
strongspan?style="color:#ff0000;"Process?p=run.exec(filePath+"/"+"lame?-b?16?"+filePath+"/"+file.getName()+"?"+filePath+"/"+tarFileName);?//16為碼率,可自行修改
/span/strong//釋放進(jìn)程
p.getOutputStream().close();
p.getInputStream().close();
p.getErrorStream().close();
p.waitFor();
long?end=System.currentTimeMillis();
System.out.println("convert?need?costs:"+(end-start)+"ms");
//刪除無用的wav文件
if(file.exists())
{
file.delete();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}finally{
//最后都要執(zhí)行的語句
//run調(diào)用lame解碼器最后釋放內(nèi)存
run.freeMemory();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}finally{
//關(guān)閉流
try?{
if(bais?!=?null)
{
bais.close();
}
if(ais?!=?null)
{
ais.close();
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
}
}
//設(shè)置AudioFormat的參數(shù)
public?AudioFormat?getAudioFormat()
{
//下面注釋部分是另外一種音頻格式,兩者都可以
AudioFormat.Encoding?encoding?=?AudioFormat.Encoding.
PCM_SIGNED?;
float?rate?=?8000f;
int?sampleSize?=?16;
String?signedString?=?"signed";
boolean?bigEndian?=?true;
int?channels?=?1;
return?new?AudioFormat(encoding,?rate,?sampleSize,?channels,
(sampleSize?/?8)?*?channels,?rate,?bigEndian);
//??????//采樣率是每秒播放和錄制的樣本數(shù)
//??????float?sampleRate?=?16000.0F;
//??????//?采樣率8000,11025,16000,22050,44100
//??????//sampleSizeInBits表示每個(gè)具有此格式的聲音樣本中的位數(shù)
//??????int?sampleSizeInBits?=?16;
//??????//?8,16
//??????int?channels?=?1;
//??????//?單聲道為1,立體聲為2
//??????boolean?signed?=?true;
//??????//?true,false
//??????boolean?bigEndian?=?true;
//??????//?true,false
//??????return?new?AudioFormat(sampleRate,?sampleSizeInBits,?channels,?signed,bigEndian);
}
//錄音類,因?yàn)橐玫組yRecord類中的變量,所以將其做成內(nèi)部類
class?Record?implements?Runnable
{
//定義存放錄音的字節(jié)數(shù)組,作為緩沖區(qū)
byte?bts[]?=?new?byte[10000];
//將字節(jié)數(shù)組包裝到流里,最終存入到baos中
//重寫run函數(shù)
public?void?run()?{
baos?=?new?ByteArrayOutputStream();
try?{
stopflag?=?false;
while(stopflag?!=?true)
{
//當(dāng)停止錄音沒按下時(shí),該線程一直執(zhí)行
//從數(shù)據(jù)行的輸入緩沖區(qū)讀取音頻數(shù)據(jù)。
//要讀取bts.length長(zhǎng)度的字節(jié),cnt?是實(shí)際讀取的字節(jié)數(shù)
int?cnt?=?td.read(bts,?0,?bts.length);
if(cnt??0)
{
baos.write(bts,?0,?cnt);
}
}
}?catch?(Exception?e)?{
e.printStackTrace();
}finally{
try?{
//關(guān)閉打開的字節(jié)數(shù)組流
if(baos?!=?null)
{
baos.close();
}
}?catch?(IOException?e)?{
e.printStackTrace();
}finally{
td.drain();
td.close();
}
}
}
}
//播放類,同樣也做成內(nèi)部類
class?Play?implements?Runnable
{
//播放baos中的數(shù)據(jù)即可
public?void?run()?{
byte?bts[]?=?new?byte[10000];
try?{
int?cnt;
//讀取數(shù)據(jù)到緩存數(shù)據(jù)
while?((cnt?=?ais.read(bts,?0,?bts.length))?!=?-1)
{
if?(cnt??0)
{
//寫入緩存數(shù)據(jù)
//將音頻數(shù)據(jù)寫入到混頻器
sd.write(bts,?0,?cnt);
}
}
}?catch?(Exception?e)?{
e.printStackTrace();
}finally{
sd.drain();
sd.close();
}
}
}
}