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

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