鄭昀 @ultrapower
|
產品名稱
|
產品版本
|
Keyword: JavaME Streaming Audio MMAPI
|
StreamingDemo
|
1.0.13
|
[J2ME]現行環境下 手機
實現網絡媒體的流暢實時播放
之簡單演示
(StreamingDemo)
說明
我的資源:
http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-src-1.0.13.rar
這個 1.0.13 版本是 j2me 流媒體播放思路的簡單演示軟件,并不是對現有的RTSP/MMS流媒體服務器的客戶端實現,而是自定義算法下載來保證實時播放,可以在 Nokia 7610 手機上真實運行。在手機上使用,請在選擇連接點時選擇“移動夢網”連接點。
如果修改源代碼中 CommandResources.java 中的 m_bCMWAPProxy 標志使之走 CMNET 通道,那么能夠在 Nokia S60 的模擬器上運行。
本源代碼的大致思路來自于我上次寫的三篇討論稿
J2me 流媒體技術實現討論 [3] , StreamingDemo 的代碼你可以借鑒,但不得用于商業用途,除非得到我的授權。
手機jar安裝包下載:
http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-deployed.rar
可以將這個包中的StreamingDemo.jar傳到您的手機上進行安裝。
使用時,請選擇移動夢網連接點。
如果你想使用劈分好的媒體文件,請從
http://www.cnblogs.com/Files/zhengyun_ustc/changjin.split.rar 下載。
1
背景、功能
摘要 :本章 簡單描述 StreamingDemo 的背景、功能。
1.1. 手機上的流媒體
很多人都在 j2medev.com 上討論過流媒體的實現方式。 國外有一個人提出一種思路,并且號稱在 Nokia6260 [ 相關數據:諾基亞 6260 Nokia62602.0 (3.0436.0) SymbianOS7.0s Series602.1 ProfileMIDP-2.0 ConfigurationCLDC-1.0 ] 運行了。
當然我們這里說的不是對 RTSP/MMS 這種主流的流媒體服務器的客戶端實現,因為現在中國市場的很多很多手機的 Java 環境都不支持這兩個協議,只有新出的某些手機才內置支持這一功能。
我們這次講的是,在現有 GPRS 環境下,在現有的一兩千塊錢的手機條件下,如何做到流媒體實時播放呢,而且還能做到較為流暢呢?
2006 年 1 月份,我 恰巧看到了
就此思路和諸位高手討論了一下,并且寫了三篇討論稿,有了大致的思路。但一直都沒有時間去測試這個思路是否可行。
今天索性抽出了一兩個小時,把這個思路寫出來放在真實手機 /GPRS 網絡上測試,不敢獨享,遂開放代碼,希望借此拋磚引玉。
這里給出 StreamingDemo 的界面,很簡單,主要的線程操作和消息處理都在后臺:
1.2. 我所謂流媒體的功能
以前我們談過:
第一步:
聲明兩個
Player
,分別由兩個獨立的線程掌控著;
第二步:
HttpConnection
開始向服務器請求該
audio
文件的第一部分字節,我們定這次讀取的字節數為
18KB
;
第三步:
等第一部分數據到位后,
Player A
開始
realize
和
prefetch
,并開始播放;
第四步:
在
Player A
播放同時,
(18KB
的
amr
數據可以播放
10
秒鐘
)
,
HttpConnection
繼續請求第二部分數據
(
假設
GPRS
每秒鐘傳輸
3KB
,那么
18KB
需要傳輸
6
秒,算上前后通訊損失的時間,應該不會超過
10
秒鐘
)
;
第五步:
第二部分數據到位后,假設
Player A
還沒有播放完
(
這需要調整你的每一部份數據字節數來使得假設成立
)
,那么將數據喂給
Player B
讓它
realize
和
prefetch
;
第六步:
Player A
播放完后,得到事件通知,于是讓
Player B
開始播放。
如此往復。
大致的思路就是這樣。
這次,我們起了兩個線程,一個叫做“ Main( 主 ) ”,一個叫做“ Secondary( 從屬 ) ”,他們都掌握著一個 Player ,同樣一個是 Main Player ,一個是 Secondary Player 。這兩個 Player 的操作實際上都被 Audio.java 類完全封裝好了。線程里面僅僅是調用
Audio.prefetchSound(m_form,
m_isInputMusic,
m_Sequence);
啦,
Audio.playSound(m_Sequence);
啦,這樣就可以把媒體資源預先運算以及播放了。
同時,還必須用到 PlayerListener 接口,來得到播放器的各種事件通知,我們需要得知每一個播放器的播放結束消息,以便作出下一步選擇:是讓從屬線程開始播放呢,還是讓主線程開始播放呢。
PlayerListener 的播放結束消息 ( PlayerListener.END_OF_MEDIA ) 的處理中,我們還必須用到 MVC 模式中的 Controller ,它是代碼中的 GUIController.java ,它負責處理幾個消息:
l EventID.EVENT_MAIN_DownloadCompleted
l EventID.EVENT_Main_BeginToPlay
l EventID.EVENT_SECONDARY_BeginToPlay
怎么綜合使用這些消息和事件呢?
比如說,當主線程的媒體文件下載完畢后,就應該通知 GUIController 讓從屬線程也開始下載并加載媒體文件。
當主線程的媒體文件播放完畢了,這時候照理說從屬線程的 Player 也已經預先加載好了下一個要播放的媒體文件 ( 如果不行的話就應該調整媒體文件的大小了以使得下載時間和播放時間差不多 ) ,就應該在
public void playerUpdate(Player player, String event, Object data)
的函數處理中,讓 Secondary Player 播放了。
這次我們直接將媒體文件用討論稿中談及的 ffmpeg 自動切分的辦法,已經辟成 11 小段的 AMR 文件了,每一個 AMR 文件都可以獨立播放,連起來就是一首完整的《大長今》樂曲。
PlayerA 和 PlayerB 只是周而復始的下載、預運算、播放他們罷了。只不過掌控著 Player 的兩個線程和主控制器,會選擇時機來讓這些操作次第展開。
上面所說的邏輯,可以用下圖表示:
2 使用感受
摘要 :本章 簡單描述 StreamingDemo 在真實 GPRS 環境下 的使用感受。
2.1. Nokia7610 手機上的設置
如果你真的要在手機上用到這種功能,那么請申請開通你的 GPRS 包月套餐,那樣 20 塊錢就可以使用 50MB 流量的 GPRS 了。
如果你的手機是 Nokia 的 S60 系列手機,建議用 Nokia 程序管理器 設置這個應用配置一個參數: 在連接網絡時第一次詢問 。否則你會屢屢被網絡連接警告框打斷的。
2.2. Nokia7610 手機上的使用感受
這種流媒體的播放,還是取決于使用時 GPRS 網絡的好壞。
我在晚上 19 點使用了一下,感覺比較流暢,甚至超乎我的預期,不認真聽,甚至感覺不到在哪里停頓的。
但是在晚上 20 點又用了一下,就有點拖拖拉拉的,延遲較為明顯。
可見現行的 GPRS 網絡環境還是容易出現擁擠的。
<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 438pt" type="#_x0000_t75" o:ole=""><imagedata src="file:///C:%5CDOCUME~1%5CZHENGY~1.VIC%5CLOCALS~1%5CTemp%5Cmsohtml1%5C09%5Cclip_image001.emz" o:title=""></imagedata></shape>
3
開源版權聲明
由于這個 手機流媒體簡單演示 的 思路和代碼來自于鄭昀以前的討論稿,今為了促進 J2ME 多媒體應用發展, 決定遵照 GPL 協議的大意開放源代碼,您可以自由傳播和修改,在遵照下面的約束條件的前提下:
條件 1
|
只要你在 手機流媒體簡單演示 的 每一副本上明顯和恰當地出版版權聲明,保持此許可證的聲明和沒有擔保的聲明完整無損,并和程序一起給每個其他的程序接受者一份許可證的副本,你就可以用任何媒體復制和發布你收到的原始的程序的源代碼。你可以為轉讓副本的實際行動收取一定費用,但必須事先得到鄭昀的同意。
|
條件 2
|
你可以修改 手機流媒體簡單演示 程序的一個或幾個副本或程序的任何部分,以此形成基于程序的作品。只要你同時滿足下面的所有條件,你就可以按前面第一款的要求復制和發布這一經過修改的程序或作品。
a )
你必須在修改的文件中附有明確的說明:你修改了這一文件及具體的修改日期。
b )
你必須使你發布或出版的作品(它包含程序的全部或一部分,或包含由程序的全部或部分衍生的作品)允許第三方作為整體按許可證條款免費使用。
c )
如果修改的程序在運行時以交互方式讀取命令,你必須使它在開始進入常規的交互使用方式時打印或顯示聲明:包括適當的版權聲明和沒有擔保的聲明(或者你提供擔保的聲明);用戶可以按此許可證條款重新發布程序的說明;并告訴用戶如何看到這一許可證的副本。(例外的情況:如果原始程序以交互方式工作,它并不打印這樣的聲明,你的基于程序的作品也就不用打印聲明)。
|
這樣,您就可以自由使用并傳播本源代碼, 當然請您原封不動地保留創建者 zhengyun_ustc( 鄭昀 ) 的作者信息 。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
