這個只要你引用自己背地的MediaPlayer就可以了;代碼:
創新互聯是一家專業提供北票企業網站建設,專注與成都做網站、成都網站建設、H5響應式網站、小程序制作等業務。10年已為北票眾多企業、政府機構等服務。創新互聯專業的建站公司優惠進行中。
div id="FlashFile"
object id="player" height="170" width="220"
classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6"
param NAME="AutoStart" VALUE="1"
!--是否自動播放--
param NAME="Balance" VALUE="0"
!--調整左右聲道平衡,同上面舊播放器代碼--
param name="enabled" value="-1"
!--播放器是否可人為控制--
param NAME="EnableContextMenu" VALUE="-1"
!--是否啟用上下文菜單--
param NAME="url" value="soft/%=file%"http://源文件路徑
!--播放的文件地址--
param NAME="PlayCount" VALUE="1"
!--播放次數控制,為整數--
param name="rate" value="1"
!--播放速率控制,1為正常,允許小數,1.0-2.0--
param name="currentPosition" value="0"
!--控件設置:當前位置--
param name="currentMarker" value="0"
!--控件設置:當前標記--
param name="defaultFrame" value=""
!--顯示默認框架--
param name="invokeURLs" value="0"
!--腳本命令設置:是否調用URL--
param name="baseURL" value=""
!--腳本命令設置:被調用的URL--
param name="stretchToFit" value="0"
!--是否按比例伸展--
param name="volume" value="50"
!--默認聲音大小0%-100%,50則為50%--
param name="mute" value="0"
!--是否靜音--
param name="uiMode" value="mini"
!--顯示模式:Full顯示全部;mini簡化;None不顯示控制;invisible全部不顯示--
param name="windowlessVideo" value="0"
!--如果是0可以允許全屏,否則只能在窗口中查看--
param name="fullScreen" value="1"
!--開始播放是否自動全屏--
param name="enableErrorDialogs" value="-1"
!--是否啟用錯誤提示報告--
param name="SAMIStyle" value
!--SAMI樣式--
param name="SAMILang" value
!--SAMI語言--
param name="SAMIFilename" value
!--字幕ID--
/object
/div
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.PrefetchCompleteEvent;
import javax.media.RealizeCompleteEvent;
import javax.media.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MediaPlayer extends JFrame implements ActionListener,
ItemListener, ControllerListener {
String title;
Player player;
boolean first = true, loop = false;
Component vc, cc;
String currentDirectory=null;
// 構造函數,其中包括了設置響應窗口事件的監聽器。
MediaPlayer(String title) {
super(title);
/* 關閉按鈕的實現。。 */
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
}
public void windowClosed(WindowEvent e) {
if (player != null)
player.close();
System.exit(0);
}
});
// 調用程序菜單欄的方法成員完成菜單的布置
setupMenu();
setSize(400, 400);
setVisible(true);
}
// 本方法用以設置程序菜單欄
public void setupMenu() {
// 設置一個菜單
Menu f = new Menu("文件");
// 往設置的菜單添加菜單項
MenuItem mi = new MenuItem("打開");
f.add(mi);
mi.addActionListener(this);
f.addSeparator();
CheckboxMenuItem cbmi = new CheckboxMenuItem("循環", false);
cbmi.addActionListener(this);
f.add(cbmi);
f.addSeparator();
MenuItem ee = new MenuItem("退出");
ee.addActionListener(this);
f.add(ee);
f.addSeparator();
Menu l = new Menu("播放列表");
Menu c = new Menu("播放控制");
MenuItem move = new MenuItem("播放");
move.addActionListener(this);
c.add(move);
c.addSeparator();
MenuItem pause = new MenuItem("暫停");
pause.addActionListener(this);
c.add(pause);
c.addSeparator();
MenuItem stop = new MenuItem("停止");
stop.addActionListener(this);
c.add(stop);
c.addSeparator();
// 設置一個菜單欄
MenuBar mb = new MenuBar();
mb.add(f);
mb.add?;
mb.add(l);
// 將構造完成的菜單欄交給當前程序的窗口;
setMenuBar(mb);
}
// 動作時間響應成員;捕捉發送到本對象的各種事件;
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String cufile, selectfile, currentDirectory;
if (e.getActionCommand().equals("退出")) {
// 調用dispose以便執行windowClosed
dispose();
return;
}
// 此事表明擁護選擇了“播放”命令;
// 如果當前有一個文件可以播放則執行播放命令;
if (e.getActionCommand().equals("播放")) {
if (player != null) {
player.start();
}
return;
}
// 如果當前正在播放某一文件,則執行暫停;
if (e.getActionCommand().equals("暫停")) {
if (player != null) {
player.stop();
}
return;
}
// 停止命令的響應;
if (e.getActionCommand().equals("停止")) {
if (player != null) {
player.stop();
player.setMediaTime(new Time(0));
}
return;
}
// 用戶選擇要播放的媒體文件
if (e.getActionCommand().equals("打開")) {
FileDialog fd = new FileDialog(this, "打開媒體文件", FileDialog.LOAD);
// fd.setDirectory(currentDirectory);
2008-2-6 02:46 回復
肆方茉莉
62位粉絲
6樓
fd.setVisible(true);
// 如果用戶放棄選擇文件,則返回
if (fd.getFile() == null) {
return;
}
// 保存了所選文件的名稱及其路徑名稱已被稍后使用
// 同時設置當前文件夾路徑
selectfile = fd.getFile();
currentDirectory = fd.getDirectory();
cufile = currentDirectory + selectfile;
// 將用戶選擇的文件作為一個菜單項加入播放列表,該菜單項名為該文件名;
// 被點擊后給出的命令串是該文件的全路徑名
MenuItem mi = new MenuItem(selectfile);
mi.setActionCommand(cufile);
MenuBar mb = getMenuBar();
Menu m = mb.getMenu(2);
mi.addActionListener(this);
m.add(mi);
} else {
// 程序邏輯運行到次表示用戶選擇了一個“播放列表”中的媒體文件
// 此時可以通過如下動作獲得該文件的全路徑名
cufile = e.getActionCommand();
selectfile = cufile;
}
// 如果存在一個播放器,則先將其關閉,稍后再重新創建
// 創建播放器時需要捕捉一些異常
if (player != null) {
player.close();
}
try {
player = Manager.createPlayer(new MediaLocator("file:" + cufile));
} catch (Exception e2) {
System.out.println(e2);
return;
}/*
* catch(NoPlayerException e2){ System.out.println("不能找到播放器");
* return ; }
*/
if (player == null) {
System.out.println("無法創建播放器");
return;
}
first = false;
setTitle(selectfile);
// 設置處理播放控制器實際的對象;
/**/
player.addControllerListener(this);
player.prefetch();
}
// 菜單狀態改變事件的響應函數;
public void itemStateChanged(ItemEvent arg0) {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new MediaPlayer("播放器");
}
// 調用繪圖函數進行界面的繪制 // public void update() {
// }
// 繪圖函數成員 //public void paint(Graphics g) {
// }
public void controllerUpdate(ControllerEvent e) {
// TODO Auto-generated method stub
Container tainer = getContentPane();
// 調用player.close()時ControllerClosedEvent事件出現
// 如果存在視覺部件,則該部件應該拆除(為了一致起見,我們對控制面版部件也執行同樣的操作,下一次需要時再構造)
if (e instanceof ControllerClosedEvent) {
if (vc != null) {
remove(vc);
vc = null;
}
if (cc != null) {
remove(cc);
cc = null;
}
}
// 播放結束時,將播放指針置于文件之首,如果設定了循環播放,則再次啟動播放器;
if (e instanceof EndOfMediaEvent) {
player.setMediaTime(new Time(0));
if (loop) {
player.start();
}
return;
}
// PrefetchCompletEvent事件發生后調用start,正式啟動播放
if (e instanceof PrefetchCompleteEvent) {
player.start();
return;
}
// 本事件表示由于播放的資源已經確定;此時要將媒體的圖形conmopnent
// 如果有顯示出來,同時將播放器player的控制顯示到窗口里;
if (e instanceof RealizeCompleteEvent) {
// 如果媒體中有圖像,將對應圖像component載入窗體;
vc = player.getVisualComponent();
if (vc != null)
tainer.add(vc, BorderLayout.CENTER);
// 將對應控制器component載入窗體;
cc = player.getControlPanelComponent();
cc.setBackground(Color.blue);
if (cc != null)
tainer.add(cc, BorderLayout.SOUTH);
// 有一些特殊媒體在播放時提供另外的控制手段,將控制器一并加入窗口;
/*
* gc=player.getGainControl(); gcc=gc.getControlComponent();
* if(gcc!=null) tainer.add(gcc,BorderLayout.NORTH);
*/
// 根據媒體文件中是否有圖像,設定相應的窗口大小
if (vc != null) {
pack();
return;
} else {
setSize(300, 75);
setVisible(true);
return;
}
}
} }
在 applet 中播放聲音文件非常簡單,一般需要以下步驟:創建一個 AudioClip 對象
裝入 .au 聲音文件到 AudioClip 對象
一次播放或者不停循環播放聲音
停止播放
下面是相應的代碼:import java.applet.*;AudioClip ac = getAudioClip(getCodeBase(), soundFile);
ac.play(); //play once
ac.stop(); //stop playing
解決這個問題的竅門是利用由 Sun 及 其JDK 提供的某些 undocumented 的特征。先看看 Sun JDK 中的文件 classes.zip (使用任何解壓工具即可),發現其中不僅包含標準的 Java 包如 java.applet 而且還存在包 sun.audio. (在 sun/audio 的目錄下.)
包 sun.audio 中包含了用于播放聲音文件所需的所有東西!下面是示例代碼:import sun.audio.*; //import the sun.audio package
import java.io.*;//** add this into your application code as appropriate// Open an input stream to the audio file.
InputStream in = new FileInputStream(Filename);// Create an AudioStream object from the input stream.
AudioStream as = new AudioStream(in);// Use the static class member "player" from class AudioPlayer to play
// clip.
AudioPlayer.player.start(as);// Similarly, to stop the audio.
AudioPlayer.player.stop(as);如果要用一個 URL 做為聲音流的源(source),則用下面的代碼所示替換輸入流來創建聲音流:AudioStream as = new AudioStream (url.openStream());如果需要持續播放聲音文件,則要稍稍復雜一點:// Create audio stream as discussed previously.
// Create AudioData source.
AudioData data = as.getData();// Create ContinuousAudioDataStream.
ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data);// Play audio.
import?javax.sound.sampled.*;?
AudioInputStream?audioInputStream?=?AudioSystem.getAudioInputStream(new?File("some_file.wav"));??//some_file.wav是你需要修改的文件名
Clip?clip?=?AudioSystem.getClip();
clip.open(audioInputStream);
FloatControl?gainControl?=?(FloatControl)
clip.getControl(FloatControl.Type.MASTER_GAIN);
long?dbValue=gainControl.getValue();//獲取原音量值?,你要獲取所有的話,自己寫循環,每次循環都把樣本音量放到集合或者數組去
gainControl.setValue(-10.0f);?//?-10.0f就是減少10分貝的意思,自己看需要調整
clip.start();
(JMF)
Java媒體架構(JMF)是一個令人激動的通用的API,它允許Java開發者用許多不同的方法處理媒體。本指南主要通過使用工作的例子提供一個JMF的一些主要的特征的概述。閱讀完本指南后,你將會明白JMF體系結構中的主要播放功能。你同樣能正確的使用JMF,使用現存的例子和可為更多特殊功能擴展的源代碼。
本指南包含著以下主題:
· 下載和安裝JMF
· 主要的JMF類以及它們在JMF體系結構中的應用
· 播放本地的媒體文件
· 為媒體的存取和操作制作以和圖形用戶界面(GUI)
· 通過網絡傳播媒體
· 通過網絡接收媒體
幾乎所有的媒體類型的操作和處理都可以通過JMF來實現。全面的討論JMF所提供的所有特征已經超過了本指南的范圍,我們將使用三個簡單的媒體應用程序來學習此框架的構建模塊。通過這個方法,本指南將為你未來學習和實施更多特殊的應用提供準備。
我應該使用此指南嗎?
本指南會帶你學習使用JMF工作的基礎。為完成這些,我們會創建三個的獨立工作的例程序。每個例子都會建立前一個例子的基礎上,顯示JMF功能性的不同方面。
在本指南中的例子假定你曾經使用過并且已經熟悉了Java程序語言。除了Java核心和JMF的類之外,我們會使用一些Java AWT和Swing類(用于創建GUI),也會有一些Java網絡類(用于在網絡中傳輸媒體)。對GUI和網絡類一些熟悉有助于你更快的明白觀點和這里的例子,但并非是閱讀本指南必須的。
我們將學習的例程序如下
· 一個簡單的音頻播放器(JMF的HelloWorld應用):這個字符界面的播放器通過在命令行中簡單的輸入媒體文件的名字就可以播放大多數的音頻類型。此音頻播放器的演示大體上顯示了JMF的特有的類。
· 一個圖形界面的媒體播放器:我們將使用JMF內置的接口組件來建立圖形界面,所以在此練習中必須有一些圖形界面的編程經驗。這個媒體閱覽器演示使用了一些Java AWT和Swing類來為用戶顯示圖形組件。
· 一個媒體廣播應用:此應用程序允許一個本地媒體文件通過網絡傳播。此程序能靈活的使媒體只傳輸到指定的網絡節點,或者傳輸到一個子網絡中的所有節點。此演示使用了一些Java的網絡APIs來在網絡中傳輸媒體。
作為第三個練習的一部分,我們將修改圖形界面的播放器,讓其能接收并且播放媒體。
跳至23頁觀看Resources,文章,指南,和其他參考書目的列表,這會幫助你學習到更到關于此指南包括的主題。
安裝需求
要運行此指南中的例程序,你需要如下的工具和組件:
· Java 2 平臺,標準版,編譯和運行演示程序
· Java媒體框架,版本2.1.1a或者更高
· 一塊已經安裝并且配置號的適當的聲卡
· 一臺或者多臺測試機器
· 演示的源代碼文件在mediaplayer.jar中
最后的一個演示應用顯示了JMF在網絡中的應用。如果需要,此演示能運行在一個獨立的機器上,使用此機器即是傳輸方也是接收方。可是要觀察到在網絡中使用JMF的所有功能,你仍然需要至少兩臺聯網的機器。
在23頁中的Resources可下載Java 2平臺,完整的源代碼文件,以及其他一些完成本指南所需要的工具。
下載安裝文件
將JMF安裝到你的計算機中的第一步是在JMF的主頁中下載安裝文件,它同樣包括了JMF源代碼和API文檔的鏈接。23頁的Resources中有下載JMF的鏈接。
目前,JMF有Windows, Solaris, Linux等版本,以及可運行在任何裝有虛擬機的計算機上一個純Java版本。為了增加性能,你需要下載一個與你操作系統所適應的版本。任何在一個操作系統JMF版本下書寫和編譯的代碼都可以方便的移植到另外的操作系統上。例如,如果你下載了一個Solaris版本的JMF并且編譯了一個類,這些類就可以在Linux上使用,不會有任何問題。
作為選擇,你可以選擇下載純Java版本,或者跨平臺版本的JMF。這些版本沒有使用操作系統特有的庫文件。如果沒有合適的JMF版本適合的操作系統,那么跨平臺版本就是一個不錯的選擇。
安裝JMF
下載完JMF安裝程序后,雙擊安裝程序的圖標。
大部分安裝程序都會有個選項,安裝本地庫到系統目錄中;例如,Windows版本安裝程序會有一個選項“Move DLLs to Windows/System directory.”。最好將此選項選中,因為它能確保這些操作系統的庫文件能正確的安裝
在安裝的過程中,你還需要選擇項目來更新系統的CLASSPATH和PATH變量。如果這些選項被關閉,那么在你編譯和運行本指南的例程序的時候就需要在classpath中引入JMF的jar文件。
關于作者
Eric Olson在Retek Inc工作的軟件工程師。它在Java平臺上有四年的工作經驗,并且在不同的基于Java的技術上富有經驗,包括JMF, Jini, Jiro, JSP, servlets, and EJBs。Eric畢業于St. Paul, MN的St. Thomas大學,獲得計算機科學的學位。他在IBM的SanFrancisco項目組工作,負責WebSphere商業組件。他同時再為Imation Corp.工作,負責存儲應用。現在,他正在開發零售行業的基于web的軟件解決方案。再業余的時間,Eric和Paul
Monday在Stereo Beacon上合作—一個分布式的點對點的基于JMF的媒體播放器。聯系
Eric zpalffy@yahoo.com.
第二節. 一個簡單的音頻播放器
瀏覽
在本節中,我們將進行創建一個簡單的音頻播放器的第一個練習。本例將介紹Manager類和Player接口,中兩個都是建立大多數基于JMF應用的重要部分。
本例的功能目標是在字符界面下播放本地的音頻文件。我們將學習此源代碼,并了解每一行所做的任務。完成本節后,你將會有一個基于JMF的可播放包括MP3, WAV, AU等多種音頻文件的演示程序。
在本練習后的源代碼分類種可查詢文件SimpleAudioPlayer.java。
引入必要的類
SimpleAudioPlayer類中包括了一些調用,在其前幾行中需要引入所有必要的類:
import javax.media.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.MalformedURLException;
The javax.media包是由JMF定義的多個包之一。javax.media是一個核心包,包括了定義Manager類和Player接口等。本節中,我們主要學習Manager類和Player接口,其余的javax.media類放在后面的章節中。
除了引入javax.media聲明外,以上的代碼片斷引入了一些創建媒體播放器的輸入的聲明。
Player接口
在下面的代碼片斷中,創建一個公共類SimpleAudioPlayer并舉例定義一個Player變量:
public class SimpleAudioPlayer {private Player audioPlayer = null;
術語Player聽起來由點熟悉,因為它是建立在我們公用的音頻或者視頻播放器的基礎上的。事實上,這個接口的例子就像是當作它們的真實的副本。 Players揭示了一個實體上的媒體播放器(如立體音箱系統或者VCR)涉及到功能上的方法。例如,一個JMF媒體播放器可以開始和結束一個媒體流。在本節種,我們將使用Player的開始和結束功能。
在一個文件上創建一個Player
使用JMF獲得一個特定媒體文件的Player實例非常簡單。Manager類在JMF中如同一個工廠制作許多的特殊接口類型,包括Player接口。因此,Manager類的責任就是創建Player實例,如下例:
public SimpleAudioPlayer(URL url) throws IOException,NoPlayerException,CannotRealizeException public SimpleAudioPlayer(File file) throws IOException,NoPlayerException,CannotRealizeException
如果你看完本節的代碼,你可以注意到Manager類包含了創建一個Player實例的其他方法。我們會研究其中的一些,如在后面的章節中的DataSource或者MediaLocator的實例化。
Player的狀態
JMF定義了大量的一個Player實例可能存在的不同狀態。如下:
· Prefetched
· Prefetching
· Realized
· Realizing
· Started
· Unrealized
使用這些狀態
因為使用媒體常常是資源非常密集的,由JMF對象揭示的許多方法都是不閉塞的,允許一系列事件監聽的狀態改變的異步通知。例如,一個Player在它可以啟動之前,必須經過Prefetched和Realized狀態。由于這些狀態的改變都需要一些時間來完成,JMF媒體應用可以分配一個線程來初始化創建 Player實例,然后再繼續其他的操作。當Player準備就緒的時候,它會通知應用程序其狀態已經改變。
在一個如同我們的這樣簡單的程序中,多功能性的類型并不是很重要。處于這個原因,Manager類也提供了一些創建Realized player的有用方法。調用一個createRealizedPlayer()方法來阻塞調用線程,直到player達到Realized狀態。為了調用一個無阻塞的創建player的方法,我們在Manager類中使用了一個createPlayer()方法。下面的一行代碼中創建了一個我們需要在例程序中使用的
Realized player:audioPlayer = Manager.createRealizedPlayer(url);
啟動和停止Player
設定一個Player實例的啟動或是停止就如同調用Player的一個簡單的認證方法,如下所示:
public void play() public void stop()
調用SimpleAudioPlayer類中的play()方法來實現調用Player實例的start()方法。調用此方法后,你能聽到本地的喇叭的聲音文件。同樣的,stop()方法使player停止并且關閉掉Player對象。
對于讀取和或者播放本地媒體文件來說,關閉Player實例釋放所有資源是一個有用的方法。因為這是一個簡單的例子,關閉Player是終止一個會話可接受的方法。但是在實際的應用中,你需要小心的確認在除掉Player之前必須要關閉掉。一但你已經關閉掉player,在再次播放一個媒體之前你必須要創建一個新的Player實例(等待它的狀態改變)。
建立一個SimpleAudioPlayer
最后,這個媒體播放應用程序要包含一個可以從命令提示行中輸入命令而調用的main()方法。在此main()方法中,我們將調用創建SimpleAudioPlayer的方法:
File audioFile = new File(args[0]);SimpleAudioPlayer player = new SimpleAudioPlayer(audioFile);
在播放音頻文件之前的唯一的一些事情就是調用已經創建的音頻player的方法play(),如下所示:
player.play();
要停止和清除掉音頻player,在main()方法中也應該有如下調用:
player.stop();
編譯和運行SimpleAudioPlayer
通過在命令提示行輸入javac SimpleAudioPlayer.java來編譯例程序。所創建的文件SimpleAudioPlayer.class在當前工作目錄中。
然后在命令提示行中鍵入如下命令來運行例程序:
java SimpleAudioPlayer audioFile
將audioFile替換成你本地機器上的音頻文件。所有的相對文件名都試相對于當前的工作目錄。你會看到一些當前正在播放文件的標志信息。要終止播放,按下回車鍵。
如果編譯失敗,確認JMF的jar文件已經正確的包含在CLASSPATH環境變量中。
第三節. JMF用戶界面組件
播放視頻
在前一節中,我們學習了建立一個通過字符界面播放音頻文件的應用程序。JMF中一個最重要的特點就是你不需要為了配置媒體播放器而去了解媒體文件的格式;一切都內置了。舉一個例子,再我們前面的例子中,需要使用MP3格式的時候,我們不需要讓應用程序為一個MP3文件建立一個特殊的Player。
如同你將會再本節所見到的,對于視頻文件的操作同樣有效。JMF有所有媒體文件類型接口的詳細資料。
處理視頻媒體與音頻最大的不同就是,我們必須建立一個能播放視頻的顯示屏幕。幸運的是,JMF能處理許多的這些資料。如同再上例一樣我們會建立一個Player對象,并且使用很多的可視組件來直接從JMF對象中創建我們的可視的媒體瀏覽器。
本節中,我們將學習兩個例程序。In this section, weaposll walk through the second example application. 請再后面的練習的源代碼分布中查閱MediaPlayerFrame.java。
關于例子
在本節中,我們將創建一個能顯示和運行本地音頻和視頻媒體的應用程序。作為練習的一部分,我們將研究JMF內置的一些GUI組件。熟悉AWT和Swing將有助于你理解本例,但這并不是必須的。除非需要直接涉及到JMF的GUI組件,或者我們是不會詳細介紹源代碼的。你可以在源代碼的注釋中找到這里未涉及的詳細說明。
本例中我們使用的許多概念,類和方法都和第一個例子的類似。建立Player的基本操作大都一樣。最大的不同就是我們需要對Player對象專研更深一點,特別當需要從Player獲取媒體信息的時候。
如何開始
視頻播放器例子被設計得如同音頻播放例子一樣通過命令行來運行,但是本例需要建立在GUI基礎上。如同在上節一樣,我們先通過媒體文件名調用應用。然后,應用程序顯示一個帶有可操作媒體組件的窗體。
在MediaPlayerFrame開始的一行中我們定義了類并擴展自,javax.swing.Jframe類。這就是使媒體播放器如同一個在桌面上的單獨窗體的方法。任何客戶機程序創建了本媒體播放對象后都可以通過調用Jframe類中定義的show()方法來顯示。
下面是一個MediaPlayerFrame正在播放MPEG電影的屏幕截圖:
獲取GUI組件
Player界面有一些方法來獲取已選擇可視組件的涉及。在MediaPlayerFrame中,我們使用如下組件:
· player.getVisualComponent()是一個播放所有視頻媒體的可視組件。
· player.getControlPanelComponent() 是一個操作時間軸的可視組件(包括開始,停止,回放),也包含了一些媒體流的有用信息。
· player.getGainControl().getControlComponent() 是操作音量(增加)的可視組件。getGainControl()方法返回一個GainControl實例,可用于改變節目的增加等級。
使用可視化組件
上面的界面方法都返回一個java.awt.Component類的實例。沒個實例都視可加載到我們窗體上的可視組件。這些組件都與Player有直接的聯系,所以在這些組件上的所有可視元素的處理都會產生Player播放媒體后相應的變化。
在我們將這些組件加入到我們的窗體的之前,必須要保證它們不為空。因為并不是所有的媒體播放器包括每一種可視組件,我們只需添加相關播放器類型的組件。比如,一般來說一個音頻播放器沒有可視組件,所以getVisualComponent()就要返回空。你不會想在音頻播放器窗體上添加可視組件的。
獲得媒體的特殊控制
一個Player實例也可以通過getControl()和getControls()方法來暴露其控制,getControls()返回一個控制對象集,而getControl()返回一個控制。不同的播放器類型可選擇為特殊的操作來暴露控制集去指定的媒體類型,或者用于獲取該媒體的傳輸機制。如果你在寫一個只支持某些媒體類型的播放器,你需要依靠某些在Player實例中可用Control對象。
由于我們的播放器是非常抽象的,被設計于播放多種不同媒體類型,我們簡單的為用戶暴露所有的Control對象。如果找到任何擴展的控制集,我們就可使用getControlComponent()方法來增加相應的可視控件到標簽面板上。通過這個辦法,用戶就可以觀察播放器上的所有組件。以下代碼片斷將所有的控制對象暴露給用戶:
Control[] controls = player.getControls();for (int i = 0; i controls.length; i++) }
為了使一個真實的應用程序能用Control實例做一些有用的事(除了能顯示可視組件之外),應用程序需要知道該Control的特殊類型,并分配它。此后,應用程序就可使用這些control來控制媒體節目了。例如,如果你知道你經常使用的媒體暴露 javax.media.control.QualityControl類型的Control,你能使用QualityControl界面,之后在 QualityControl界面上通過調用各種方法來改變性質設定。
使用一個MediaLocator
在我們新的基于GUI的媒體播放器和我們的第一個簡單播放器之間最大的不同就是,我們使用一個MediaLocator對象而不是URL來創建Player實例,如下所示:
public void setMediaLocator(MediaLocator locator) throws IOException,NoPlayerException, CannotRealizeException
我們將在稍后的章節中討論這個變化的原因。目前,在網絡上資源站點上,關于MediaLocator對象和URL的描述被認為是非常相似的。事實上,你可以從一個URL創建一個MediaLocator,也可以從MediaLocator獲取到URL。我們的新媒體播放器一個URL中創建一個 MediaLocator,并使用該MediaLocator通過文件創建了一個Player。
編譯和運行MediaPlayerFrame
通過在命令提示行輸入javac MediaPlayerFrame.java來編譯例程序。在工作目錄下將創建一個名為MediaPlayerFrame.class的文件。
在命令提示行中鍵入如下來運行例程序:
java MediaPlayerFrame mediaFile
你需要用你本機上的一個媒體文件來替換掉mediaFile(音頻或者視頻文件都可以)。所有的相對文件名都是相對于當前工作目錄。你會看見一個顯示控制媒體文件的GUI控制集的窗口。欲了解JMF支持的音頻和視頻文件列表,在23頁的資源。
如果初始編譯時失敗,請確認JMF的jar文件已經包含在當前的CLASSPATH環境變量中。
MediaPlayerFrame在行動
在本節前你看見的一個視頻播放器正在播放MPEG視頻文件的屏幕截圖。下面的屏幕截圖顯示了一個音頻播放器正在播放一個MP3文件:
要更多的學習本練習中的例子,查看完成的MediaPlayerFrame源代碼。
第四節. JMF概念
JMF體系結構
你曾見過了使用JMF播放本地媒體文件是多么的容易,現在我們將后退一步,來看看一幅是如何通過JMF創建了如此成熟的基于媒體的應用程序的大的畫面,是如何通過JMF創建了如此成熟的基于媒體的應用程序。全面的了解JMF體系結構是沒有意義的,本節將給你一個大體的概念,關于高級的JMF組件是如何組合起來創建想得到的東西。
JMF的組件結構非常的靈活,它的組件一般可以分成三個部分:
· Input描述某種被用于在進程休息的時候作為一個輸入的媒體。
· process執行某些輸入上的活動。一個過程有一個明確的輸入和輸出。大量的過程可用, 能被用于一個輸入或者一批輸入。這些過程能被聯系起來,一個過程的輸出被用于另外一個過程的輸入。在這種風格中,大量的過程可能被應用于一個輸入。(這段期間是可選擇的——我們開始的兩個例子沒有包含真正的數據過程,只有一個來自文件的輸入和一個通過Player的輸出。)
· Output 描述了媒體的某些目的地。
從這些描述中,你可以想象到JMF組件體系結構聽起來就好像在一個典型的立體聲系統或者VCR之后。很容易設想到,使用JMF就如同打開電視或者在立體聲音箱系統下調節聲音的風格。例如,錄制喜愛的電視節目的簡單的動作能在這些組件的基礎中:
· Input 是電視廣播流,在同一個頻道運輸音頻和視頻。
· Process 是一個記錄設備(就是,一個VCR或者許多的數字設備)轉換模擬或者數字音頻視頻廣播流成適合復制到磁帶或其他媒體上的格式。
· Output 是記錄已格式化軌跡(音頻和視頻)到某些類型的媒體上。
JMF資料處理模式
以下圖片說明了JMF數據處理模塊并對每個類型給出了例子:
使用此模式,很容易明白我們前面的兩個例子,從文件中輸入音頻和視頻并輸出到本地計算機上。在后面的章節中,我們也會談論一些通過傳播和接收音頻媒體的JMF網絡功能。
處理模型例子
將JMF 的輸入,處理和輸出模式聯系起來,我們能開始想象許多基于媒體的操作都可能通過JMF完成。一個例子,轉換一種媒體類型為其他類型并將其輸出存儲到一個新的文件。舉一個例子,我們想要在不損壞原始文件的前提下轉化一個WAV格式的音頻文件為MP3格式。以下的過程模式插圖,就是我們將開始執行轉換的步驟:
本例的輸入是一個WAV文件。它被一個媒體格式轉換工具加工,并輸出到一個新的文件。現在,讓我們看看JMF API中的這個模式的每一步。我們使用輸入,處理和輸出模式作為概念上的路標。
JMF輸入
再JMF中,一般由一個MediaLocator對象來描述一個輸入。如先前規定的,
MediaLocator的外觀和行為都非常象一個URL,這樣它可以唯一確定網絡上的一個資源。事實上,使用一個URL來創建一個MediaLocator是完全可能的;我們在前面的兩個例子中就是這樣做的。
為了我們的媒體轉換例子,我們需要建立一個MediaLocator來描述最初的WAV文件。如同我們將在后面的章節中見到的,一個 MediaLocator也可以用于描述一個跨越網絡中媒體流。在這個案例中,MediaLocator會描述傳播的URL――很像一個被URL指定的在 Web上的資源,用于取代指定一個本地文件系統的文件來建立MediaLocator。
一個MediaLocator和一個URL之間的不同
要成功的建立一個URL對象,需要適當的java.net.URLStreamHandler安裝于系統中。這個流處理的用途是能夠處理被URL描述的流類型。一個MediaLocator對象并沒有這個需要。例如,我們的下個應用程序將使用實時傳輸協議(RTP)在網絡上傳輸音頻。由于多數的系統都未為 RTP協議安裝一個URLStreamHandler,所以創建一個URL對象會失敗。在這個應用中,只有MediaLocator對象會成功。
要理解更多關于URL對象以及創建和注冊一個URLStreamHandler的信息,查閱JDK幫助文檔(查看23頁資源)。
JMF處理機
當我們使用JMF的時候,應用程序的處理機組件被Processor接口實例描述。你需要已有些熟悉Processor,它擴展至Player接口。由于 Processor繼承直Player接口,它同樣也從Player繼承所有可用屬性。另外,Processor增加了兩個屬性:Configuring 和Configured。這些擴展的屬性(和與之關聯的方法)用于Processor從輸入流收集信息時的通信。
在我們的最后的例程序中,我們將建立一個Processor用于將MP3編碼格式的音頻轉換成適合在網絡上傳播的格式。在稍后的板塊中我們會討論創建一個簡單的Processor的步驟。
JMF輸出
有少許的方法用于描述JMF中處理模式的輸出狀態。最簡單的(并且我們將在最后一個例子中使用的)是javax.media.DataSink接口。一個 DataSink讀取媒體內容并且將其傳送到一些目的地。本節中最開始的音頻格式轉換過程中,MP3(輸出)文件將被DataSink描述。在我們最后一個例子中,我們將使用一個DataSink在實際上完成網絡中傳播音頻媒體的工作。一個DataSink是在Manager類中,由指定一個 DataSource(輸入到DataSink)和一個MediaLocator(輸出到DataSink)完成的。
一個DataSource實例描述可用于Players,Processors和DataSinks的輸入數據。一個處理機的輸出也被描述成一個DataSource對象。
這就是為什么處理器能彼此聯系起來,在同一媒體數據中完成多種操作。這也是來自Processor的輸出能作為輸入被Player或者DataSink使用的原因(它可將媒體傳遞到輸出目的地)。
一個DataSink的最后目的文件由一個MediaLocator對象說明。如同前面一樣,MediaLocator描述一個網絡資源;這就是媒體流將被傳遞的地方。
第五節.傳播接收媒體
JMF和實時傳輸協議(RTP)
許多的友善網絡的特征直接建立在JMF中,這些使為客戶端程序通過網絡傳輸和接收媒體非常容易。當在一個網絡上的一個用戶想要接收任何種類的媒體流的時候,它不需要在觀看媒體前等待全部的廣播下載到機器上;用戶可以實時的觀看廣播。在流媒體中些提出了這個概念。通過流媒體,一個網絡客戶端能接收到其他機器上廣播的音頻,甚至獲取正在發生的實況視頻廣播。
在IETF RFC 1889中定義了實時傳輸協議(RTP)。發展在快速和可靠的狀態下通過網絡傳輸時間極其敏感的數據,RTP在JMF中用于提供給用戶向其他網絡節點中傳輸媒體流的方法。
在本節中,我們將學習我們的最后一個例程序。這里,你將學習到如何傳輸一個存儲在一臺機器上的MP3文件到另外的在同一個網絡的機器上去。實際的MP3源文件并不從主計算機上移除,它也不使復制到其他機器上去;事實上它將會轉換成能使用RTP傳輸的文件格式并通過網絡發送。一旦被一個客戶端接收到,源文件(現在是RTP信息包的形式)可以再次傳輸,這一次是在接收機器上可播放的一種格式。
在MediaTransmitter.java文件中源代碼查看學習以下練習。
設置處理模式
我們可以在前面的章節中定義的處理模式的基礎下來討論我們的最終的例子。在傳輸機器上,處理模式看起來像這樣:
事實上,MediaTransmitter對象源代碼包括了以下三行:
private MediaLocator mediaLocator = null;private DataSink dataSink = null;private Processor mediaProcessor = null;
這三個實例變量可以直接映射到前面的處理模式圖表,如下:
· mediaProcessor變量是我們的處理器;它將負責轉換音頻文件從MP3文件模式到一個適合通過RTP協議傳輸的格式。
· dataSink變量是我們的輸出塊。
· 當我們建立DataSink時我們需要指定一個MediaLocator,它是DataSink的目的文件。
當我們通過運行DataSink我們的處理過的媒體,它將傳輸到我們在MediaLocator中指定的地點。
當前標題:JAVA調節音量源代碼,java調節音量源代碼怎么用
轉載來于:http://vcdvsql.cn/article38/heccpp.html
成都網站建設公司_創新互聯,為您提供ChatGPT、動態網站、網頁設計公司、域名注冊、云服務器、App設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯