最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JAVA調(diào)節(jié)音量源代碼,java調(diào)節(jié)音量源代碼怎么用

求一個java視頻播放器源代碼

這個只要你引用自己背地的MediaPlayer就可以了;代碼:

創(chuàng)新互聯(lián)是一家專業(yè)提供北票企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為北票眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。

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"

!--調(diào)整左右聲道平衡,同上面舊播放器代碼--

param name="enabled" value="-1"

!--播放器是否可人為控制--

param NAME="EnableContextMenu" VALUE="-1"

!--是否啟用上下文菜單--

param NAME="url" value="soft/%=file%"http://源文件路徑

!--播放的文件地址--

param NAME="PlayCount" VALUE="1"

!--播放次數(shù)控制,為整數(shù)--

param name="rate" value="1"

!--播放速率控制,1為正常,允許小數(shù),1.0-2.0--

param name="currentPosition" value="0"

!--控件設(shè)置:當(dāng)前位置--

param name="currentMarker" value="0"

!--控件設(shè)置:當(dāng)前標(biāo)記--

param name="defaultFrame" value=""

!--顯示默認(rèn)框架--

param name="invokeURLs" value="0"

!--腳本命令設(shè)置:是否調(diào)用URL--

param name="baseURL" value=""

!--腳本命令設(shè)置:被調(diào)用的URL--

param name="stretchToFit" value="0"

!--是否按比例伸展--

param name="volume" value="50"

!--默認(rèn)聲音大小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

求一個JAVA音樂播放器的源代碼

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;

// 構(gòu)造函數(shù),其中包括了設(shè)置響應(yīng)窗口事件的監(jiān)聽器。

MediaPlayer(String title) {

super(title);

/* 關(guān)閉按鈕的實現(xiàn)。。 */

addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

dispose();

}

public void windowClosed(WindowEvent e) {

if (player != null)

player.close();

System.exit(0);

}

});

// 調(diào)用程序菜單欄的方法成員完成菜單的布置

setupMenu();

setSize(400, 400);

setVisible(true);

}

// 本方法用以設(shè)置程序菜單欄

public void setupMenu() {

// 設(shè)置一個菜單

Menu f = new Menu("文件");

// 往設(shè)置的菜單添加菜單項

MenuItem mi = new MenuItem("打開");

f.add(mi);

mi.addActionListener(this);

f.addSeparator();

CheckboxMenuItem cbmi = new CheckboxMenuItem("循環(huán)", 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();

// 設(shè)置一個菜單欄

MenuBar mb = new MenuBar();

mb.add(f);

mb.add?;

mb.add(l);

// 將構(gòu)造完成的菜單欄交給當(dāng)前程序的窗口;

setMenuBar(mb);

}

// 動作時間響應(yīng)成員;捕捉發(fā)送到本對象的各種事件;

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

String cufile, selectfile, currentDirectory;

if (e.getActionCommand().equals("退出")) {

// 調(diào)用dispose以便執(zhí)行windowClosed

dispose();

return;

}

// 此事表明擁護選擇了“播放”命令;

// 如果當(dāng)前有一個文件可以播放則執(zhí)行播放命令;

if (e.getActionCommand().equals("播放")) {

if (player != null) {

player.start();

}

return;

}

// 如果當(dāng)前正在播放某一文件,則執(zhí)行暫停;

if (e.getActionCommand().equals("暫停")) {

if (player != null) {

player.stop();

}

return;

}

// 停止命令的響應(yīng);

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 回復(fù)

肆方茉莉

62位粉絲

6樓

fd.setVisible(true);

// 如果用戶放棄選擇文件,則返回

if (fd.getFile() == null) {

return;

}

// 保存了所選文件的名稱及其路徑名稱已被稍后使用

// 同時設(shè)置當(dāng)前文件夾路徑

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;

}

// 如果存在一個播放器,則先將其關(guān)閉,稍后再重新創(chuàng)建

// 創(chuàng)建播放器時需要捕捉一些異常

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("無法創(chuàng)建播放器");

return;

}

first = false;

setTitle(selectfile);

// 設(shè)置處理播放控制器實際的對象;

/**/

player.addControllerListener(this);

player.prefetch();

}

// 菜單狀態(tài)改變事件的響應(yīng)函數(shù);

public void itemStateChanged(ItemEvent arg0) {

// TODO Auto-generated method stub

}

public static void main(String[] args) {

// TODO Auto-generated method stub

new MediaPlayer("播放器");

}

// 調(diào)用繪圖函數(shù)進行界面的繪制 // public void update() {

// }

// 繪圖函數(shù)成員 //public void paint(Graphics g) {

// }

public void controllerUpdate(ControllerEvent e) {

// TODO Auto-generated method stub

Container tainer = getContentPane();

// 調(diào)用player.close()時ControllerClosedEvent事件出現(xiàn)

// 如果存在視覺部件,則該部件應(yīng)該拆除(為了一致起見,我們對控制面版部件也執(zhí)行同樣的操作,下一次需要時再構(gòu)造)

if (e instanceof ControllerClosedEvent) {

if (vc != null) {

remove(vc);

vc = null;

}

if (cc != null) {

remove(cc);

cc = null;

}

}

// 播放結(jié)束時,將播放指針置于文件之首,如果設(shè)定了循環(huán)播放,則再次啟動播放器;

if (e instanceof EndOfMediaEvent) {

player.setMediaTime(new Time(0));

if (loop) {

player.start();

}

return;

}

// PrefetchCompletEvent事件發(fā)生后調(diào)用start,正式啟動播放

if (e instanceof PrefetchCompleteEvent) {

player.start();

return;

}

// 本事件表示由于播放的資源已經(jīng)確定;此時要將媒體的圖形conmopnent

// 如果有顯示出來,同時將播放器player的控制顯示到窗口里;

if (e instanceof RealizeCompleteEvent) {

// 如果媒體中有圖像,將對應(yīng)圖像component載入窗體;

vc = player.getVisualComponent();

if (vc != null)

tainer.add(vc, BorderLayout.CENTER);

// 將對應(yīng)控制器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);

*/

// 根據(jù)媒體文件中是否有圖像,設(shè)定相應(yīng)的窗口大小

if (vc != null) {

pack();

return;

} else {

setSize(300, 75);

setVisible(true);

return;

}

}

} }

java 控制臺程序怎么調(diào)用聲音文件?

在 applet 中播放聲音文件非常簡單,一般需要以下步驟:創(chuàng)建一個 AudioClip 對象

裝入 .au 聲音文件到 AudioClip 對象

一次播放或者不停循環(huán)播放聲音

停止播放

下面是相應(yīng)的代碼:import java.applet.*;AudioClip ac = getAudioClip(getCodeBase(), soundFile);

ac.play(); //play once

ac.stop(); //stop playing

解決這個問題的竅門是利用由 Sun 及 其JDK 提供的某些 undocumented 的特征。先看看 Sun JDK 中的文件 classes.zip (使用任何解壓工具即可),發(fā)現(xiàn)其中不僅包含標(biāo)準(zhǔn)的 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),則用下面的代碼所示替換輸入流來創(chuàng)建聲音流:AudioStream as = new AudioStream (url.openStream());如果需要持續(xù)播放聲音文件,則要稍稍復(fù)雜一點:// Create audio stream as discussed previously.

// Create AudioData source.

AudioData data = as.getData();// Create ContinuousAudioDataStream.

ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data);// Play audio.

java如何調(diào)整MP3文件的音量值

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();//獲取原音量值?,你要獲取所有的話,自己寫循環(huán),每次循環(huán)都把樣本音量放到集合或者數(shù)組去

gainControl.setValue(-10.0f);?//?-10.0f就是減少10分貝的意思,自己看需要調(diào)整

clip.start();

求JAVA 關(guān)于jmf(包括Player等等類)的API文檔,[email protected]

(JMF)

Java媒體架構(gòu)(JMF)是一個令人激動的通用的API,它允許Java開發(fā)者用許多不同的方法處理媒體。本指南主要通過使用工作的例子提供一個JMF的一些主要的特征的概述。閱讀完本指南后,你將會明白JMF體系結(jié)構(gòu)中的主要播放功能。你同樣能正確的使用JMF,使用現(xiàn)存的例子和可為更多特殊功能擴展的源代碼。

本指南包含著以下主題:

· 下載和安裝JMF

· 主要的JMF類以及它們在JMF體系結(jié)構(gòu)中的應(yīng)用

· 播放本地的媒體文件

· 為媒體的存取和操作制作以和圖形用戶界面(GUI)

· 通過網(wǎng)絡(luò)傳播媒體

· 通過網(wǎng)絡(luò)接收媒體

幾乎所有的媒體類型的操作和處理都可以通過JMF來實現(xiàn)。全面的討論JMF所提供的所有特征已經(jīng)超過了本指南的范圍,我們將使用三個簡單的媒體應(yīng)用程序來學(xué)習(xí)此框架的構(gòu)建模塊。通過這個方法,本指南將為你未來學(xué)習(xí)和實施更多特殊的應(yīng)用提供準(zhǔn)備。

我應(yīng)該使用此指南嗎?

本指南會帶你學(xué)習(xí)使用JMF工作的基礎(chǔ)。為完成這些,我們會創(chuàng)建三個的獨立工作的例程序。每個例子都會建立前一個例子的基礎(chǔ)上,顯示JMF功能性的不同方面。

在本指南中的例子假定你曾經(jīng)使用過并且已經(jīng)熟悉了Java程序語言。除了Java核心和JMF的類之外,我們會使用一些Java AWT和Swing類(用于創(chuàng)建GUI),也會有一些Java網(wǎng)絡(luò)類(用于在網(wǎng)絡(luò)中傳輸媒體)。對GUI和網(wǎng)絡(luò)類一些熟悉有助于你更快的明白觀點和這里的例子,但并非是閱讀本指南必須的。

我們將學(xué)習(xí)的例程序如下

· 一個簡單的音頻播放器(JMF的HelloWorld應(yīng)用):這個字符界面的播放器通過在命令行中簡單的輸入媒體文件的名字就可以播放大多數(shù)的音頻類型。此音頻播放器的演示大體上顯示了JMF的特有的類。

· 一個圖形界面的媒體播放器:我們將使用JMF內(nèi)置的接口組件來建立圖形界面,所以在此練習(xí)中必須有一些圖形界面的編程經(jīng)驗。這個媒體閱覽器演示使用了一些Java AWT和Swing類來為用戶顯示圖形組件。

· 一個媒體廣播應(yīng)用:此應(yīng)用程序允許一個本地媒體文件通過網(wǎng)絡(luò)傳播。此程序能靈活的使媒體只傳輸?shù)街付ǖ木W(wǎng)絡(luò)節(jié)點,或者傳輸?shù)揭粋€子網(wǎng)絡(luò)中的所有節(jié)點。此演示使用了一些Java的網(wǎng)絡(luò)APIs來在網(wǎng)絡(luò)中傳輸媒體。

作為第三個練習(xí)的一部分,我們將修改圖形界面的播放器,讓其能接收并且播放媒體。

跳至23頁觀看Resources,文章,指南,和其他參考書目的列表,這會幫助你學(xué)習(xí)到更到關(guān)于此指南包括的主題。

安裝需求

要運行此指南中的例程序,你需要如下的工具和組件:

· Java 2 平臺,標(biāo)準(zhǔn)版,編譯和運行演示程序

· Java媒體框架,版本2.1.1a或者更高

· 一塊已經(jīng)安裝并且配置號的適當(dāng)?shù)穆暱?/p>

· 一臺或者多臺測試機器

· 演示的源代碼文件在mediaplayer.jar中

最后的一個演示應(yīng)用顯示了JMF在網(wǎng)絡(luò)中的應(yīng)用。如果需要,此演示能運行在一個獨立的機器上,使用此機器即是傳輸方也是接收方。可是要觀察到在網(wǎng)絡(luò)中使用JMF的所有功能,你仍然需要至少兩臺聯(lián)網(wǎng)的機器。

在23頁中的Resources可下載Java 2平臺,完整的源代碼文件,以及其他一些完成本指南所需要的工具。

下載安裝文件

將JMF安裝到你的計算機中的第一步是在JMF的主頁中下載安裝文件,它同樣包括了JMF源代碼和API文檔的鏈接。23頁的Resources中有下載JMF的鏈接。

目前,JMF有Windows, Solaris, Linux等版本,以及可運行在任何裝有虛擬機的計算機上一個純Java版本。為了增加性能,你需要下載一個與你操作系統(tǒng)所適應(yīng)的版本。任何在一個操作系統(tǒng)JMF版本下書寫和編譯的代碼都可以方便的移植到另外的操作系統(tǒng)上。例如,如果你下載了一個Solaris版本的JMF并且編譯了一個類,這些類就可以在Linux上使用,不會有任何問題。

作為選擇,你可以選擇下載純Java版本,或者跨平臺版本的JMF。這些版本沒有使用操作系統(tǒng)特有的庫文件。如果沒有合適的JMF版本適合的操作系統(tǒng),那么跨平臺版本就是一個不錯的選擇。

安裝JMF

下載完JMF安裝程序后,雙擊安裝程序的圖標(biāo)。

大部分安裝程序都會有個選項,安裝本地庫到系統(tǒng)目錄中;例如,Windows版本安裝程序會有一個選項“Move DLLs to Windows/System directory.”。最好將此選項選中,因為它能確保這些操作系統(tǒng)的庫文件能正確的安裝

在安裝的過程中,你還需要選擇項目來更新系統(tǒng)的CLASSPATH和PATH變量。如果這些選項被關(guān)閉,那么在你編譯和運行本指南的例程序的時候就需要在classpath中引入JMF的jar文件。

關(guān)于作者

Eric Olson在Retek Inc工作的軟件工程師。它在Java平臺上有四年的工作經(jīng)驗,并且在不同的基于Java的技術(shù)上富有經(jīng)驗,包括JMF, Jini, Jiro, JSP, servlets, and EJBs。Eric畢業(yè)于St. Paul, MN的St. Thomas大學(xué),獲得計算機科學(xué)的學(xué)位。他在IBM的SanFrancisco項目組工作,負責(zé)WebSphere商業(yè)組件。他同時再為Imation Corp.工作,負責(zé)存儲應(yīng)用?,F(xiàn)在,他正在開發(fā)零售行業(yè)的基于web的軟件解決方案。再業(yè)余的時間,Eric和Paul

Monday在Stereo Beacon上合作—一個分布式的點對點的基于JMF的媒體播放器。聯(lián)系

Eric [email protected].

第二節(jié). 一個簡單的音頻播放器

瀏覽

在本節(jié)中,我們將進行創(chuàng)建一個簡單的音頻播放器的第一個練習(xí)。本例將介紹Manager類和Player接口,中兩個都是建立大多數(shù)基于JMF應(yīng)用的重要部分。

本例的功能目標(biāo)是在字符界面下播放本地的音頻文件。我們將學(xué)習(xí)此源代碼,并了解每一行所做的任務(wù)。完成本節(jié)后,你將會有一個基于JMF的可播放包括MP3, WAV, AU等多種音頻文件的演示程序。

在本練習(xí)后的源代碼分類種可查詢文件SimpleAudioPlayer.java。

引入必要的類

SimpleAudioPlayer類中包括了一些調(diào)用,在其前幾行中需要引入所有必要的類:

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接口等。本節(jié)中,我們主要學(xué)習(xí)Manager類和Player接口,其余的javax.media類放在后面的章節(jié)中。

除了引入javax.media聲明外,以上的代碼片斷引入了一些創(chuàng)建媒體播放器的輸入的聲明。

Player接口

在下面的代碼片斷中,創(chuàng)建一個公共類SimpleAudioPlayer并舉例定義一個Player變量:

public class SimpleAudioPlayer {private Player audioPlayer = null;

術(shù)語Player聽起來由點熟悉,因為它是建立在我們公用的音頻或者視頻播放器的基礎(chǔ)上的。事實上,這個接口的例子就像是當(dāng)作它們的真實的副本。 Players揭示了一個實體上的媒體播放器(如立體音箱系統(tǒng)或者VCR)涉及到功能上的方法。例如,一個JMF媒體播放器可以開始和結(jié)束一個媒體流。在本節(jié)種,我們將使用Player的開始和結(jié)束功能。

在一個文件上創(chuàng)建一個Player

使用JMF獲得一個特定媒體文件的Player實例非常簡單。Manager類在JMF中如同一個工廠制作許多的特殊接口類型,包括Player接口。因此,Manager類的責(zé)任就是創(chuàng)建Player實例,如下例:

public SimpleAudioPlayer(URL url) throws IOException,NoPlayerException,CannotRealizeException public SimpleAudioPlayer(File file) throws IOException,NoPlayerException,CannotRealizeException

如果你看完本節(jié)的代碼,你可以注意到Manager類包含了創(chuàng)建一個Player實例的其他方法。我們會研究其中的一些,如在后面的章節(jié)中的DataSource或者MediaLocator的實例化。

Player的狀態(tài)

JMF定義了大量的一個Player實例可能存在的不同狀態(tài)。如下:

· Prefetched

· Prefetching

· Realized

· Realizing

· Started

· Unrealized

使用這些狀態(tài)

因為使用媒體常常是資源非常密集的,由JMF對象揭示的許多方法都是不閉塞的,允許一系列事件監(jiān)聽的狀態(tài)改變的異步通知。例如,一個Player在它可以啟動之前,必須經(jīng)過Prefetched和Realized狀態(tài)。由于這些狀態(tài)的改變都需要一些時間來完成,JMF媒體應(yīng)用可以分配一個線程來初始化創(chuàng)建 Player實例,然后再繼續(xù)其他的操作。當(dāng)Player準(zhǔn)備就緒的時候,它會通知應(yīng)用程序其狀態(tài)已經(jīng)改變。

在一個如同我們的這樣簡單的程序中,多功能性的類型并不是很重要。處于這個原因,Manager類也提供了一些創(chuàng)建Realized player的有用方法。調(diào)用一個createRealizedPlayer()方法來阻塞調(diào)用線程,直到player達到Realized狀態(tài)。為了調(diào)用一個無阻塞的創(chuàng)建player的方法,我們在Manager類中使用了一個createPlayer()方法。下面的一行代碼中創(chuàng)建了一個我們需要在例程序中使用的

Realized player:audioPlayer = Manager.createRealizedPlayer(url);

啟動和停止Player

設(shè)定一個Player實例的啟動或是停止就如同調(diào)用Player的一個簡單的認(rèn)證方法,如下所示:

public void play() public void stop()

調(diào)用SimpleAudioPlayer類中的play()方法來實現(xiàn)調(diào)用Player實例的start()方法。調(diào)用此方法后,你能聽到本地的喇叭的聲音文件。同樣的,stop()方法使player停止并且關(guān)閉掉Player對象。

對于讀取和或者播放本地媒體文件來說,關(guān)閉Player實例釋放所有資源是一個有用的方法。因為這是一個簡單的例子,關(guān)閉Player是終止一個會話可接受的方法。但是在實際的應(yīng)用中,你需要小心的確認(rèn)在除掉Player之前必須要關(guān)閉掉。一但你已經(jīng)關(guān)閉掉player,在再次播放一個媒體之前你必須要創(chuàng)建一個新的Player實例(等待它的狀態(tài)改變)。

建立一個SimpleAudioPlayer

最后,這個媒體播放應(yīng)用程序要包含一個可以從命令提示行中輸入命令而調(diào)用的main()方法。在此main()方法中,我們將調(diào)用創(chuàng)建SimpleAudioPlayer的方法:

File audioFile = new File(args[0]);SimpleAudioPlayer player = new SimpleAudioPlayer(audioFile);

在播放音頻文件之前的唯一的一些事情就是調(diào)用已經(jīng)創(chuàng)建的音頻player的方法play(),如下所示:

player.play();

要停止和清除掉音頻player,在main()方法中也應(yīng)該有如下調(diào)用:

player.stop();

編譯和運行SimpleAudioPlayer

通過在命令提示行輸入javac SimpleAudioPlayer.java來編譯例程序。所創(chuàng)建的文件SimpleAudioPlayer.class在當(dāng)前工作目錄中。

然后在命令提示行中鍵入如下命令來運行例程序:

java SimpleAudioPlayer audioFile

將audioFile替換成你本地機器上的音頻文件。所有的相對文件名都試相對于當(dāng)前的工作目錄。你會看到一些當(dāng)前正在播放文件的標(biāo)志信息。要終止播放,按下回車鍵。

如果編譯失敗,確認(rèn)JMF的jar文件已經(jīng)正確的包含在CLASSPATH環(huán)境變量中。

第三節(jié). JMF用戶界面組件

播放視頻

在前一節(jié)中,我們學(xué)習(xí)了建立一個通過字符界面播放音頻文件的應(yīng)用程序。JMF中一個最重要的特點就是你不需要為了配置媒體播放器而去了解媒體文件的格式;一切都內(nèi)置了。舉一個例子,再我們前面的例子中,需要使用MP3格式的時候,我們不需要讓應(yīng)用程序為一個MP3文件建立一個特殊的Player。

如同你將會再本節(jié)所見到的,對于視頻文件的操作同樣有效。JMF有所有媒體文件類型接口的詳細資料。

處理視頻媒體與音頻最大的不同就是,我們必須建立一個能播放視頻的顯示屏幕。幸運的是,JMF能處理許多的這些資料。如同再上例一樣我們會建立一個Player對象,并且使用很多的可視組件來直接從JMF對象中創(chuàng)建我們的可視的媒體瀏覽器。

本節(jié)中,我們將學(xué)習(xí)兩個例程序。In this section, weaposll walk through the second example application. 請再后面的練習(xí)的源代碼分布中查閱MediaPlayerFrame.java。

關(guān)于例子

在本節(jié)中,我們將創(chuàng)建一個能顯示和運行本地音頻和視頻媒體的應(yīng)用程序。作為練習(xí)的一部分,我們將研究JMF內(nèi)置的一些GUI組件。熟悉AWT和Swing將有助于你理解本例,但這并不是必須的。除非需要直接涉及到JMF的GUI組件,或者我們是不會詳細介紹源代碼的。你可以在源代碼的注釋中找到這里未涉及的詳細說明。

本例中我們使用的許多概念,類和方法都和第一個例子的類似。建立Player的基本操作大都一樣。最大的不同就是我們需要對Player對象專研更深一點,特別當(dāng)需要從Player獲取媒體信息的時候。

如何開始

視頻播放器例子被設(shè)計得如同音頻播放例子一樣通過命令行來運行,但是本例需要建立在GUI基礎(chǔ)上。如同在上節(jié)一樣,我們先通過媒體文件名調(diào)用應(yīng)用。然后,應(yīng)用程序顯示一個帶有可操作媒體組件的窗體。

在MediaPlayerFrame開始的一行中我們定義了類并擴展自,javax.swing.Jframe類。這就是使媒體播放器如同一個在桌面上的單獨窗體的方法。任何客戶機程序創(chuàng)建了本媒體播放對象后都可以通過調(diào)用Jframe類中定義的show()方法來顯示。

下面是一個MediaPlayerFrame正在播放MPEG電影的屏幕截圖:

獲取GUI組件

Player界面有一些方法來獲取已選擇可視組件的涉及。在MediaPlayerFrame中,我們使用如下組件:

· player.getVisualComponent()是一個播放所有視頻媒體的可視組件。

· player.getControlPanelComponent() 是一個操作時間軸的可視組件(包括開始,停止,回放),也包含了一些媒體流的有用信息。

· player.getGainControl().getControlComponent() 是操作音量(增加)的可視組件。getGainControl()方法返回一個GainControl實例,可用于改變節(jié)目的增加等級。

使用可視化組件

上面的界面方法都返回一個java.awt.Component類的實例。沒個實例都視可加載到我們窗體上的可視組件。這些組件都與Player有直接的聯(lián)系,所以在這些組件上的所有可視元素的處理都會產(chǎn)生Player播放媒體后相應(yīng)的變化。

在我們將這些組件加入到我們的窗體的之前,必須要保證它們不為空。因為并不是所有的媒體播放器包括每一種可視組件,我們只需添加相關(guān)播放器類型的組件。比如,一般來說一個音頻播放器沒有可視組件,所以getVisualComponent()就要返回空。你不會想在音頻播放器窗體上添加可視組件的。

獲得媒體的特殊控制

一個Player實例也可以通過getControl()和getControls()方法來暴露其控制,getControls()返回一個控制對象集,而getControl()返回一個控制。不同的播放器類型可選擇為特殊的操作來暴露控制集去指定的媒體類型,或者用于獲取該媒體的傳輸機制。如果你在寫一個只支持某些媒體類型的播放器,你需要依靠某些在Player實例中可用Control對象。

由于我們的播放器是非常抽象的,被設(shè)計于播放多種不同媒體類型,我們簡單的為用戶暴露所有的Control對象。如果找到任何擴展的控制集,我們就可使用getControlComponent()方法來增加相應(yīng)的可視控件到標(biāo)簽面板上。通過這個辦法,用戶就可以觀察播放器上的所有組件。以下代碼片斷將所有的控制對象暴露給用戶:

Control[] controls = player.getControls();for (int i = 0; i controls.length; i++) }

為了使一個真實的應(yīng)用程序能用Control實例做一些有用的事(除了能顯示可視組件之外),應(yīng)用程序需要知道該Control的特殊類型,并分配它。此后,應(yīng)用程序就可使用這些control來控制媒體節(jié)目了。例如,如果你知道你經(jīng)常使用的媒體暴露 javax.media.control.QualityControl類型的Control,你能使用QualityControl界面,之后在 QualityControl界面上通過調(diào)用各種方法來改變性質(zhì)設(shè)定。

使用一個MediaLocator

在我們新的基于GUI的媒體播放器和我們的第一個簡單播放器之間最大的不同就是,我們使用一個MediaLocator對象而不是URL來創(chuàng)建Player實例,如下所示:

public void setMediaLocator(MediaLocator locator) throws IOException,NoPlayerException, CannotRealizeException

我們將在稍后的章節(jié)中討論這個變化的原因。目前,在網(wǎng)絡(luò)上資源站點上,關(guān)于MediaLocator對象和URL的描述被認(rèn)為是非常相似的。事實上,你可以從一個URL創(chuàng)建一個MediaLocator,也可以從MediaLocator獲取到URL。我們的新媒體播放器一個URL中創(chuàng)建一個 MediaLocator,并使用該MediaLocator通過文件創(chuàng)建了一個Player。

編譯和運行MediaPlayerFrame

通過在命令提示行輸入javac MediaPlayerFrame.java來編譯例程序。在工作目錄下將創(chuàng)建一個名為MediaPlayerFrame.class的文件。

在命令提示行中鍵入如下來運行例程序:

java MediaPlayerFrame mediaFile

你需要用你本機上的一個媒體文件來替換掉mediaFile(音頻或者視頻文件都可以)。所有的相對文件名都是相對于當(dāng)前工作目錄。你會看見一個顯示控制媒體文件的GUI控制集的窗口。欲了解JMF支持的音頻和視頻文件列表,在23頁的資源。

如果初始編譯時失敗,請確認(rèn)JMF的jar文件已經(jīng)包含在當(dāng)前的CLASSPATH環(huán)境變量中。

MediaPlayerFrame在行動

在本節(jié)前你看見的一個視頻播放器正在播放MPEG視頻文件的屏幕截圖。下面的屏幕截圖顯示了一個音頻播放器正在播放一個MP3文件:

要更多的學(xué)習(xí)本練習(xí)中的例子,查看完成的MediaPlayerFrame源代碼。

第四節(jié). JMF概念

JMF體系結(jié)構(gòu)

你曾見過了使用JMF播放本地媒體文件是多么的容易,現(xiàn)在我們將后退一步,來看看一幅是如何通過JMF創(chuàng)建了如此成熟的基于媒體的應(yīng)用程序的大的畫面,是如何通過JMF創(chuàng)建了如此成熟的基于媒體的應(yīng)用程序。全面的了解JMF體系結(jié)構(gòu)是沒有意義的,本節(jié)將給你一個大體的概念,關(guān)于高級的JMF組件是如何組合起來創(chuàng)建想得到的東西。

JMF的組件結(jié)構(gòu)非常的靈活,它的組件一般可以分成三個部分:

· Input描述某種被用于在進程休息的時候作為一個輸入的媒體。

· process執(zhí)行某些輸入上的活動。一個過程有一個明確的輸入和輸出。大量的過程可用, 能被用于一個輸入或者一批輸入。這些過程能被聯(lián)系起來,一個過程的輸出被用于另外一個過程的輸入。在這種風(fēng)格中,大量的過程可能被應(yīng)用于一個輸入。(這段期間是可選擇的——我們開始的兩個例子沒有包含真正的數(shù)據(jù)過程,只有一個來自文件的輸入和一個通過Player的輸出。)

· Output 描述了媒體的某些目的地。

從這些描述中,你可以想象到JMF組件體系結(jié)構(gòu)聽起來就好像在一個典型的立體聲系統(tǒng)或者VCR之后。很容易設(shè)想到,使用JMF就如同打開電視或者在立體聲音箱系統(tǒng)下調(diào)節(jié)聲音的風(fēng)格。例如,錄制喜愛的電視節(jié)目的簡單的動作能在這些組件的基礎(chǔ)中:

· Input 是電視廣播流,在同一個頻道運輸音頻和視頻。

· Process 是一個記錄設(shè)備(就是,一個VCR或者許多的數(shù)字設(shè)備)轉(zhuǎn)換模擬或者數(shù)字音頻視頻廣播流成適合復(fù)制到磁帶或其他媒體上的格式。

· Output 是記錄已格式化軌跡(音頻和視頻)到某些類型的媒體上。

JMF資料處理模式

以下圖片說明了JMF數(shù)據(jù)處理模塊并對每個類型給出了例子:

使用此模式,很容易明白我們前面的兩個例子,從文件中輸入音頻和視頻并輸出到本地計算機上。在后面的章節(jié)中,我們也會談?wù)撘恍┩ㄟ^傳播和接收音頻媒體的JMF網(wǎng)絡(luò)功能。

處理模型例子

將JMF 的輸入,處理和輸出模式聯(lián)系起來,我們能開始想象許多基于媒體的操作都可能通過JMF完成。一個例子,轉(zhuǎn)換一種媒體類型為其他類型并將其輸出存儲到一個新的文件。舉一個例子,我們想要在不損壞原始文件的前提下轉(zhuǎn)化一個WAV格式的音頻文件為MP3格式。以下的過程模式插圖,就是我們將開始執(zhí)行轉(zhuǎn)換的步驟:

本例的輸入是一個WAV文件。它被一個媒體格式轉(zhuǎn)換工具加工,并輸出到一個新的文件?,F(xiàn)在,讓我們看看JMF API中的這個模式的每一步。我們使用輸入,處理和輸出模式作為概念上的路標(biāo)。

JMF輸入

再JMF中,一般由一個MediaLocator對象來描述一個輸入。如先前規(guī)定的,

MediaLocator的外觀和行為都非常象一個URL,這樣它可以唯一確定網(wǎng)絡(luò)上的一個資源。事實上,使用一個URL來創(chuàng)建一個MediaLocator是完全可能的;我們在前面的兩個例子中就是這樣做的。

為了我們的媒體轉(zhuǎn)換例子,我們需要建立一個MediaLocator來描述最初的WAV文件。如同我們將在后面的章節(jié)中見到的,一個 MediaLocator也可以用于描述一個跨越網(wǎng)絡(luò)中媒體流。在這個案例中,MediaLocator會描述傳播的URL――很像一個被URL指定的在 Web上的資源,用于取代指定一個本地文件系統(tǒng)的文件來建立MediaLocator。

一個MediaLocator和一個URL之間的不同

要成功的建立一個URL對象,需要適當(dāng)?shù)膉ava.net.URLStreamHandler安裝于系統(tǒng)中。這個流處理的用途是能夠處理被URL描述的流類型。一個MediaLocator對象并沒有這個需要。例如,我們的下個應(yīng)用程序?qū)⑹褂脤崟r傳輸協(xié)議(RTP)在網(wǎng)絡(luò)上傳輸音頻。由于多數(shù)的系統(tǒng)都未為 RTP協(xié)議安裝一個URLStreamHandler,所以創(chuàng)建一個URL對象會失敗。在這個應(yīng)用中,只有MediaLocator對象會成功。

要理解更多關(guān)于URL對象以及創(chuàng)建和注冊一個URLStreamHandler的信息,查閱JDK幫助文檔(查看23頁資源)。

JMF處理機

當(dāng)我們使用JMF的時候,應(yīng)用程序的處理機組件被Processor接口實例描述。你需要已有些熟悉Processor,它擴展至Player接口。由于 Processor繼承直Player接口,它同樣也從Player繼承所有可用屬性。另外,Processor增加了兩個屬性:Configuring 和Configured。這些擴展的屬性(和與之關(guān)聯(lián)的方法)用于Processor從輸入流收集信息時的通信。

在我們的最后的例程序中,我們將建立一個Processor用于將MP3編碼格式的音頻轉(zhuǎn)換成適合在網(wǎng)絡(luò)上傳播的格式。在稍后的板塊中我們會討論創(chuàng)建一個簡單的Processor的步驟。

JMF輸出

有少許的方法用于描述JMF中處理模式的輸出狀態(tài)。最簡單的(并且我們將在最后一個例子中使用的)是javax.media.DataSink接口。一個 DataSink讀取媒體內(nèi)容并且將其傳送到一些目的地。本節(jié)中最開始的音頻格式轉(zhuǎn)換過程中,MP3(輸出)文件將被DataSink描述。在我們最后一個例子中,我們將使用一個DataSink在實際上完成網(wǎng)絡(luò)中傳播音頻媒體的工作。一個DataSink是在Manager類中,由指定一個 DataSource(輸入到DataSink)和一個MediaLocator(輸出到DataSink)完成的。

一個DataSource實例描述可用于Players,Processors和DataSinks的輸入數(shù)據(jù)。一個處理機的輸出也被描述成一個DataSource對象。

這就是為什么處理器能彼此聯(lián)系起來,在同一媒體數(shù)據(jù)中完成多種操作。這也是來自Processor的輸出能作為輸入被Player或者DataSink使用的原因(它可將媒體傳遞到輸出目的地)。

一個DataSink的最后目的文件由一個MediaLocator對象說明。如同前面一樣,MediaLocator描述一個網(wǎng)絡(luò)資源;這就是媒體流將被傳遞的地方。

第五節(jié).傳播接收媒體

JMF和實時傳輸協(xié)議(RTP)

許多的友善網(wǎng)絡(luò)的特征直接建立在JMF中,這些使為客戶端程序通過網(wǎng)絡(luò)傳輸和接收媒體非常容易。當(dāng)在一個網(wǎng)絡(luò)上的一個用戶想要接收任何種類的媒體流的時候,它不需要在觀看媒體前等待全部的廣播下載到機器上;用戶可以實時的觀看廣播。在流媒體中些提出了這個概念。通過流媒體,一個網(wǎng)絡(luò)客戶端能接收到其他機器上廣播的音頻,甚至獲取正在發(fā)生的實況視頻廣播。

在IETF RFC 1889中定義了實時傳輸協(xié)議(RTP)。發(fā)展在快速和可靠的狀態(tài)下通過網(wǎng)絡(luò)傳輸時間極其敏感的數(shù)據(jù),RTP在JMF中用于提供給用戶向其他網(wǎng)絡(luò)節(jié)點中傳輸媒體流的方法。

在本節(jié)中,我們將學(xué)習(xí)我們的最后一個例程序。這里,你將學(xué)習(xí)到如何傳輸一個存儲在一臺機器上的MP3文件到另外的在同一個網(wǎng)絡(luò)的機器上去。實際的MP3源文件并不從主計算機上移除,它也不使復(fù)制到其他機器上去;事實上它將會轉(zhuǎn)換成能使用RTP傳輸?shù)奈募袷讲⑼ㄟ^網(wǎng)絡(luò)發(fā)送。一旦被一個客戶端接收到,源文件(現(xiàn)在是RTP信息包的形式)可以再次傳輸,這一次是在接收機器上可播放的一種格式。

在MediaTransmitter.java文件中源代碼查看學(xué)習(xí)以下練習(xí)。

設(shè)置處理模式

我們可以在前面的章節(jié)中定義的處理模式的基礎(chǔ)下來討論我們的最終的例子。在傳輸機器上,處理模式看起來像這樣:

事實上,MediaTransmitter對象源代碼包括了以下三行:

private MediaLocator mediaLocator = null;private DataSink dataSink = null;private Processor mediaProcessor = null;

這三個實例變量可以直接映射到前面的處理模式圖表,如下:

· mediaProcessor變量是我們的處理器;它將負責(zé)轉(zhuǎn)換音頻文件從MP3文件模式到一個適合通過RTP協(xié)議傳輸?shù)母袷健?/p>

· dataSink變量是我們的輸出塊。

· 當(dāng)我們建立DataSink時我們需要指定一個MediaLocator,它是DataSink的目的文件。

當(dāng)我們通過運行DataSink我們的處理過的媒體,它將傳輸?shù)轿覀冊贛ediaLocator中指定的地點。


分享題目:JAVA調(diào)節(jié)音量源代碼,java調(diào)節(jié)音量源代碼怎么用
當(dāng)前URL:http://fisionsoft.com.cn/article/heccpp.html