Java Media Framework 基礎教程(三)

來源:互聯網
上載者:User
第五節.傳播接收媒體
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中指定的地點。

RTP MediaLocator
在前面的兩個練習中,我們通過從檔案中獲得的一個URL建立了MediaLocator執行個體。在本練習中,我們必須建立一個MediaLocator來描述網路上媒體傳播輸出資料流;換句話說,我們必須建立一個能我們的音頻傳播的目的地的 MediaLocator。一個RTP MediaLocator符合如下規則,看起來就像一個典型的URL:

rtp://address:port/content-type

讓我們看看上面URL規範的每一段:
· address 是將傳輸的媒體的地址。以單播的模式傳輸(一個專用IP地址),地址將會是有意接收的機器的IP地址。以廣播的模式傳播(到子網中的所有機器),地址將會是以255作為最後的一塊的子網地址。舉個例子,如果我再子網中可指定地址為192.168.1和想要傳播到子網中的所有節點,我可以指定 192.168.1.255作為地址;這樣允許子網中的每個節點監聽廣播媒體。
· port 必須是被傳輸者和接收者都允許的一個連接埠。
· content-type 是媒體流類型。在我們的案子中,這個將會是音頻。
下面的一個簡單的RTP傳播MediaLocator例子會讓所有在指定網路中的機器接收到媒體流:
rtp://192.168.1.255:49150/audio
建立一個處理機
在setDataSource()方法中我們首先要做的就是建立一個Processor執行個體。
下面的Processor的職責是轉換MP3音頻媒體為一個RTP來表示:
public void setDataSource(DataSource ds) throws IOException,
NoProcessorException, CannotRealizeException, NoDataSinkException {
mediaProcessor = Manager.createRealizedProcessor(
new ProcessorModel(ds, FORMATS, CONTENT_DESCRIPTOR));
在Manager類中,我們能建立一個Processor對象,通過兩種方法中的一種:
createProcessor ()或者createRealizedProcessor()。你很可能會注意到這兩個方法樣式的顯示和前面例子中建立一個Player的方法很相似。在目前的例子中,我們將建立一個已實現的Processor。我們這樣做是因為我們使用的應用非常簡單,在Processo處於Realized狀態時我們不需要關心任何真實的工作。
建立一個ProcessorModel
建立一個已實現的Processor,我們需要建立一個為Processor描述輸入和輸出媒體類型的ProcessorModel執行個體。為了建立ProcessorModel,我們需要下面的一些:
· 一個DataSource,將被處理的媒體(輸入檔案)。
· 一個javax.media.Format數組,描述輸入媒體的格式。
· 一個javax.media.protocol.ContentDescriptor執行個體,為我們的處理機描述輸出格式。傳送者的DataSource是通過一個參數傳遞到此方法。
定義輸入和輸出格式
因為我們的MediaTransmitter類會被時常用於將輸入媒體格式(MP3)轉換成一種輸出格式(音頻RTP),中學對象被定義成靜態。我們建立一個新的javax.media.format.AudioFormat執行個體用於描述媒體輸入類型(在java協助文檔中查看可用格式)。這就是我們的處理機可以擷取MP3音頻檔案的原因。
我們也建立一個javax.media.protocol.ContentDescriptor執行個體來描述想要處理機輸出的。在我們的案子中,這是一個RTP媒體流。
這就是為什麼我們的處理機可以只製造RTP流。
下面的代碼片斷顯示了我們如何設定格式和內容描述符變數,用於建立ProcessorModel對象:
private static final Format[] FORMATS = new Format[] {
new AudioFormat(AudioFormat.MPEG_RTP)};
private static final ContentDescriptor CONTENT_DESCRIPTOR =
new ContentDescriptor(ContentDescriptor.RAW_RTP);
串連輸入,處理機和輸出
現在我們有一個處於Realized狀態的Processor,我們需要設定DataSink以能實際上傳播RTP媒體。建立DataSink是簡單的大概使用另外一個調用給Manager對象,如下所示:
dataSink = Manager.createDataSink(mediaProcessor.getDataOutput(),
mediaLocator);
createDataSink ()方法擷取新Processor的輸出(作為一個DataSource參數)和MediaLocator對象,我們和MediaTransmitter 對象同時建立的。通過這樣,你能開始我們的不同的組件是如何在處理模式中聯絡起來的:我們從一個Processor中擷取輸出並使用他們作為輸入到其他組件。在這個特殊的應用中,Processor輸出用於傳輸媒體的DataSink的一個輸入。
建立一個DataSource執行個體
在這點上,我們全部都是做和設定我們的媒體播放器的廣播傳輸。
我們需要建立DataSource對象,我們用於建立處理機(就是,在我們的MediaTransmitter中,參數傳遞到setDataSource()方法)。下面是建立一個DataSource執行個體的代碼:
File mediaFile = new File(args[1]);
DataSource source = Manager.createDataSource(new MediaLocator(
mediaFile.toURL()));
這段代碼是在MediaTransmitter對象中的vmain()方法。這裡我們通過從命令列輸入的第二個參數建立一個File對象。我們通過檔案建立一個MediaLocator,而後通過位置建立一個DataSource。這個新近建立的DataSource是一個涉及到傳送者的輸入檔案。我們能使用這個DataSource初始化傳輸者。
開始和停止MediaTransmitter
我們通過調用其中的startTransmitting()方法來開始MediaTransmitter,如下所示:public void startTransmitting() throws IOException {
mediaProcessor.start();
dataSink.open();
dataSink.start();
}
這個方法首先開啟處理機,然後開啟並啟動DataSink。在這個調用後,接收機器就可在媒體傳送者上監聽。
停止傳輸者是非常簡單的。以下代碼將DataSink和Processor都停止和關閉掉:
public void stopTransmitting() throws IOException {
dataSink.stop();
dataSink.close();
mediaProcessor.stop();
mediaProcessor.close();
}
編譯和運行MediaTransmitter
通過在命令列中輸入javac MediaTransmitter.java來編譯常式序,可在你的工作目錄中產生一個同名的.class檔案。
要運行常式序,在命令提示行中輸入以下代碼:

java MediaTransmitter rtpMediaLocator audioFile
此例將建立一個myAudio.mp3檔案的媒體廣播。不要忘記將rtpMediaLocator替換成一個媒體傳輸的RTP URL,如同先前討論的。
你同樣也需要將audioFile替換成你原生音頻檔案名稱。
所有的相對檔案名稱都是相對於當前工作目錄的。你會看見一些資訊標誌現正播放的檔案。按下Enter鍵來停止播放。

為傳送者的一個例命令列互動如下:
java MediaTransmitter rtp://192.168.1.255:49150/audio myAudio.mp3
如果初始編輯失敗,確定JMF的jar檔案包含CLASSPATH環境變數中。要近一步探索本程式和練習,請查閱MediaTransmitter原始碼。

接收傳輸的媒體
現在你可能會問,“如果沒有人可以看或者收聽的話,這個傳播媒體有什麼好的?”
幸運的是,設定一個接收傳播媒體的用戶端只需要對我們在第二個常式序的MediaPlayerFrame原始碼做很小的改動。
MediaPlayerFrame類需要一個很小的調節來接收和播放音頻檔案。在main()方法中,你需要注釋掉如下的一行:

mpf.setMediaLocator(new MediaLocator(new File(args[0]).toURL()));
並且輸入如下的一行:
mpf.setMediaLocator(new MediaLocator(args[0]));
這個簡單的改動允許我們通過String來建立一個MediaLocator對象,而不是通過建立一個File來建立MediaLocator。
其他代碼都一樣。
指定RTP URL
在12頁的說明編譯和運行MediaPlayerFrame介紹了如何編譯和運行MediaPlayerFrame常式序。這唯一的不同就是你需要為傳輸者指定RTP URL。為接收者的例命令列互動如下:
java MediaPlayerFrame rtp://192.168.1.255:49150/audio
運行網路媒體傳送者的注意事項
如果你在網路上只有權使用一台機器,你仍然可以運行傳輸程式。當你啟動傳送程式的時候,你可以即使用RTP URL傳輸地址,也可指定你工作的機器的機器地址。為了能夠調節傳輸,在開始前接收者必須使用精確的同樣的RTP URL。
如果你運行本例真實的網路版本,每台你使用的機器都需要安裝JMF,不論是傳輸還是接收媒體流。這是必須的,因為不論是傳送程式還是接收程式都大量的使用了JMF的API。
在任一個案子中,確認在指定的RTP URL中使用了相同的地址和連接埠;否則媒體傳輸是不會工作的。第六節. 約束和資源
摘要
我希望本指南能給你提供如何使用JMF的API的有用的瀏覽。
我們建立了三個小的應用程式來播放本地的音頻和視頻,也通過網路傳播和接收媒體。這些應用程式的原始碼中包含了很多的javadoc樣式的注釋。這就有助於你理解你剩餘的問題。
許多JMF的主題在本指南中並沒有涉及。實際上,我們更關注JMF的基本概念和應用;在此基礎上,我們能輕易地擴充學習的其他範圍。要更深入JMF的應用程式,你可能想要學習下面的面板中所提到的主題。更近一步的閱讀本指南中的主題,查閱23頁的資源。

進階主題
大量的值得做的練習在本指南的範圍之上。在簡單的說明之下自己更進一步的學習,你可以擴充我們的應用程式代碼,也可以反展你的JMF相關知識。使用以下的練習開始:
· 媒體捕獲:JMF包含了豐富的API來捕獲媒體資料。如果你對使用JMF捕獲媒體感興趣,你可以使用 javax.media.CaptureDeviceManager類和javax.media.protocol.CaptureDevice介面的 API來學習。對於一個進階的練習,考慮使用CaptureDeviceManager和CaptureDevice介面來增加媒體捕獲功能到媒體播放應用程式的GUI版本上。
· 會話管理:由於本指南是一個JMF的說明,我們使輸出表現非常的簡單,僅僅實現了javax.media.DataSink輸出。
另外的輸出表示是使用javax.media.rtp.SessionManager。這個管理類允許用戶端建立並監視他們的RTP流和串連。通過 SessionManager並隨後建立流,它可能非常的接近監視RTP會話。作為一個進階的練習,轉換我們的地三個示範程式來使用 SessionManager,然後監聽流出的RTP流已經哪些用戶端在收聽。
· 使用JMF的多點傳送:我們的廣播示範應用程式說明了如何傳送一個網路的媒體到另外一個網路的一或多台機器上去。它也可能使用JMF中的多點傳輸協議來提供給更複雜,多使用者的網路。
JMF使用者指南提供了一個使用JMF的多播協議的更深入的探討。更進一步追蹤本主題查看23頁資源。
· 傳輸視頻: 我們的最後一個示範應用程式著眼於如何傳輸一個MP3音頻檔案,但是JMF也能夠通過網路傳遞視頻。關注API文檔中的Format和ContentDescriptor類獲得如何使用的更好的方法。
· 匯入/匯出RTP媒體流: JMF同樣允許將RTP流儲存為檔案以便將來使用。舉一個執行個體,一個遠程電信會議可以儲存下來以後再看。
由於流已經儲存再RTP格式中,已經不需要再次轉換,這樣可導致傳輸程式的效能改進。通過一個檔案而不是URL來設定DataSink對象中輸入/輸出MediaLocator。你會再JMF使用者指南中發現更深層次的主題探討。

資源
JMF
· 下載mediaplayer.jar,本指南中使用的完整的例原始碼。
·  JMF首頁 (http://www.javasoft.com/jmf)是最好的探討JMF更多資訊的資源。
· 你可以找到JMF說明書(http://java.sun.com/products/java- media/jmf/2.1.1/specdownload.html),再Java開發人員聯盟上包括API文檔和JMF使用者指南。你必須有權使用所有的這些資源,如果你想做任何更深入的JMF編程的話。
· 官方的JMF支援檔案格式 頁面
(http://java.sun.com/products/java-media/jmf/2.1.1/formats.html) 列出了所有可為JMF辨識並播放的檔案格式。此檔案格式頁面也包括了學習更多關於擷取裝置和RTP格式的參考。
· MPEG-4 Video for JMF (http://www.alphaworks.ibm.com/tech/mpeg-4), 來自IBM
alphaWorks, 是一個JMF的視頻轉碼器。
RTP
·  IETF RTP RFC (http://www.ietf.org/rfc/rfc1889.txt) 非常詳細的描述了RTP協議。
· 查看 JMF API Guide
(http://java.sun.com/products/java-media/jmf/2.1.1/specdownload.html) ,有許多有關於RTP協議和描述以及它是如何在JMF上應用的。
· 哥倫比亞大學有一個比較有用的RTP FAQ(http://www.cs.columbia.edu/~hgs/rtp/faq.html).
Java技術
·  Java 2 Platform, Standard Edition (http://java.sun.com/j2se/) 可從sun公司獲得。
· sun的指南關於JFC/Swing (http://java.sun.com/docs/books/tutorial/uiswing/index.html)
和 AWT (http://java.sun.com/docs/books/tutorial/information/download.html#OLDui) 是非常好的能學習到很多關於Java程式語言中GUI編程的好地方。
· 另外一個sun指南學習network programming 基礎
(http://java.sun.com/docs/books/tutorial/networking/index.html)。
多點傳輸協議
· Explicit Multicast (XCAST)
(http://oss.software.ibm.com/developerworks/opensource/xcast/) 是IP多點傳輸的一種形式,為非常多的多點傳輸組設計提供可升級的支援,這些組有些少量的參與者代表。XCAST 代碼得到了IBM Common Public License的認可。
· Todd Montgomery 的 MTP page (http://www.nard.net/~tmont/rm-links.html),
在這裡你能找到一個廣泛的涉及到多點傳輸協議的列表。
附加資源
· 你可以在
developerWorks Java technology zone (http://www-106.ibm.com/developerworks/java/)中找到許多的關於Java各方面的內容。
· 查看 developerWorks tutorials page
(http://www-105.ibm.com/developerworks/education.nsf/dw/java-onlinecourse-bytitle?OpenDocument&Count=for a complete listing of free tutorials.

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.