[J2ME]手机流媒体之实作[附源码][与RTSP/MMS协议无关]


郑昀@ultrapower


产品名称


产品版本


Keyword: JavaME Streaming Audio MMAPI


StreamingDemo


1.0.13

 [J2ME]现行环境下手机



实现网络媒体的流畅实时播放




简单演示

(StreamingDemo)

说明

 

我的资源:

http://files.cnblogs.com/zhengyun_ustc/StreamingDemo-src-1.0.13.rar

这个1.0.13版本是j2me流媒体播放思路的简单演示软件源代码,并不是对现有的RTSP/MMS流媒体服务器的客户端实现,而是自定义算法下载来保证实时播放,可以在Nokia 7610手机上真实运行。在手机上使用,请在选择连接点时选择“移动梦网”连接点。

如果修改源代码中CommandResources.java中的m_bCMWAPProxy标志使之走CMNET通道,那么能够在Nokia S60的模拟器上运行。

本源代码的大致思路来自于我上次写的三篇讨论稿

J2me流媒体技术实现讨论[1]

J2me流媒体技术实现讨论[2]

J2me流媒体技术实现讨论[3] ,StreamingDemo的代码你可以借鉴,但不得用于商业用途,除非得到我的授权。

手机jar安装包下载: 
http://files.cnblogs.com/zhengyun_ustc/StreamingDemo-deployed.rar 
可以将这个包中的StreamingDemo.jar传到您的手机上进行安装。 
使用时,请选择移动梦网连接点。

如果你想使用劈分好的媒体文件,请从

http://files.cnblogs.com/zhengyun_ustc/changjin.split.rar下载。

 

1背景、功能

摘要:本章 简单描述StreamingDemo的背景、功能。

 

1.1. 手机上的流媒体

很多人都在j2medev.com上讨论过流媒体的实现方式。

当然我们这里说的不是对RTSP/MMS这种主流的流媒体服务器的客户端实现,因为现在中国市场的很多很多手机的Java环境都不支持这两个协议,只有新出的某些手机才内置支持这一功能。

我们这次讲的是,在现有GPRS环境下,在现有的一两千块钱的手机条件下,如何做到流媒体实时播放呢,而且还能做到较为流畅呢?

2006年1月份,我恰巧看到了国外有一个人提出一种思路,并且号称在Nokia6260[相关数据:诺基亚6260 Nokia62602.0 (3.0436.0) SymbianOS7.0s Series602.1 ProfileMIDP-2.0 ConfigurationCLDC-1.0]运行了。

就此思路和诸位高手讨论了一下,并且写了三篇讨论稿,有了大致的思路。但一直都没有时间去测试这个思路是否可行。

今天索性抽出了一两个小时,把这个思路写出来放在真实手机/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的两个线程和主控制器,会选择时机来让这些操作次第展开。

 

上面所说的逻辑,可以用下图表示:

3使用感受

摘要:本章 简单描述StreamingDemo在真实GPRS环境下的使用感受。

 

3.1. Nokia7610手机上的设置

如果你真的要在手机上用到这种功能,那么请申请开通你的GPRS包月套餐,那样20块钱就可以使用50MB流量的GPRS了。

如果你的手机是Nokia的S60系列手机,建议用Nokia程序管理器设置这个应用配置一个参数:在连接网络时第一次询问。否则你会屡屡被网络连接警告框打断的。

3.2. Nokia7610手机上的使用感受

这种流媒体的播放,还是取决于使用时GPRS网络的好坏。

我在晚上19点使用了一下,感觉比较流畅,甚至超乎我的预期,不认真听,甚至感觉不到在哪里停顿的。

但是在晚上20点又用了一下,就有点拖拖拉拉的,延迟较为明显。

可见现行的GPRS网络环境还是容易出现拥挤的。

 

2 开源版权声明

由于这个手机流媒体简单演示的思路和代码来自于郑昀以前的讨论稿,今为了促进J2ME多媒体应用发展,决定遵照GPL协议的大意开放源代码,您可以自由传播和修改,在遵照下面的约束条件的前提下:

 


条件1


只要你在 手机流媒体简单演示 的每一副本上明显和恰当地出版版权声明,保持此许可证的声明和没
有担保的声明完整无损,并和程序一起给每个其他的程序接受者一份许可证的副本,你就可以用任何媒体复
制和发布你收到的原始的程序的源代码。你可以为转让副本的实际行动收取一定费用,但必须事先得到郑昀
的同意。

 


条件2


你可以修改 手机流媒体简单演示 程序的一个或几个副本或程序的任何部分,以此形成基于程序的作
品。只要你同时满足下面的所有条件,你就可以按前面第一款的要求复制和发布这一经过修改的程序或作
品。

 

a)

你必须在修改的文件中附有明确的说明:你修改了这一文件及具体的修改日期。

 

b)

你必须使你发布或出版的作品(它包含程序的全部或一部分,或包含由程序的全部或部分衍生的作
品)允许第三方作为整体按许可证条款免费使用。

 

c)

如果修改的程序在运行时以交互方式读取命令,你必须使它在开始进入常规的交互使用方式时打印或显示声
明:包括适当的版权声明和没有担保的声明(或者你提供担保的声明);用户可以按此许可证条款重新发布
程序的说明;并告诉用户如何看到这一许可证的副本。(例外的情况:如果原始程序以交互方式工作,它并
不打印这样的声明,你的基于程序的作品也就不用打印声明)。

 

这样,您就可以自由使用并传播本源代码,当然请您原封不动地保留创建者zhengyun_ustc(郑昀)的作者信息

时间: 2024-08-31 00:11:07

[J2ME]手机流媒体之实作[附源码][与RTSP/MMS协议无关]的相关文章

wpf 模拟3D效果(和手机浏览图片效果相似)(附源码)

原文 wpf 模拟3D效果(和手机浏览图片效果相似)(附源码) pf的3D是一个很有意思的东西,类似于ps的效果,类似于电影动画的效果,因为动画的效果,(对于3D基础的摄像机,光源,之类不介绍,对于依赖属性也不介绍.),个人认为,依赖属性这个东西,有百分之五十是为了3D而存在.(自己写的类似于demo的东西)先上图,无图无真相这是demo的整个效果图,可以用鼠标移动,触摸屏也可以手指滑动,图片会移动,然后移动结束,会有一个回弹的判断. <Window x:Class="_3Dshow.Wi

你可能用到的百度地图效果(附源码)

原文:你可能用到的百度地图效果(附源码)      这段时间需要实现百度地图的一些展示效果,虽然最终效果做出来了,可是这中间也走了很多的弯路,希望有用到的可以直接拿来用,少走一些弯路.百度地图为开发者提供了一系列的接口,点百度接口去百度接口.本文主要用到了以下几个效果: 1.热力图显示 2.自定义图标的聚合显示 3.云麻点显示       热力图显示       百度地图热力图是通过设置热力图半径.颜色.透明度等参数直观展示数据分布情况,而我这段时间所做的,就是通过一段时间内的订单数量,再结合经

C#使用Xamarin开发可移植移动应用(1.入门与Xamarin.Forms页面),附源码

原文:C#使用Xamarin开发可移植移动应用(1.入门与Xamarin.Forms页面),附源码 前言 什么是Xamarin? Xamarin始创于2011年,旨在使移动开发变得难以置信地迅捷和简单. Xamarin的产品简化了针对多种平台的应用开发,包括iOS.Android.Windows Phone和Mac App. Xamarin由许多著名的开源社区开发者创立和参与,而且也是Mono项目的主导者--C#与·NET框架的开源.跨平台实现. (以上摘自百度百科) 那么什么是Xamarin.

jQuery实现产品对比功能附源码下载_jquery

产品对比相信大家并不陌生,为了方便用户对类似产品的相关信息进行有效直观的对比,一些电商网站产品或评测网站会为用户提供产品对比的功能,用户只需勾选多个需要对比的产品,就可以进行比对.本文将使用jQuery来给大家讲解如何实现产品对比功能. 查看演示     下载源码 HTML HTML结构我们分三部分,第一是产品列表部分,展示所有可以对比的产品.我们以某手机网站为例,简单的结构,只需展示产品图片和名称,以及一个添加按钮.注意我们把手机的相关参数信息都放在属性data-*里,等会后面展示对比信息的时

基于Jquery制作图片文字排版预览效果附源码下载_jquery

基于jQuery图文排版图片预览特效.这是一款基于jQuery+CSS3实现的鼠标点击图片弹出画廊切换特效. 效果图如下所示,怎么样感兴趣吗,感兴趣的朋友继续往下学习哦. 效果演示     源码下载 html代码: <div id="fullscreen"> <div id="fullscreen-inner"> <div id="fullscreen-inner-left" class="fullscre

javaweb异常提示信息统一处理(使用springmvc,附源码)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 一.前言 后台出现异常如何友好而又高效地回显到前端呢?直接将一堆的错误信息抛给用户界面,显然不合适. 先不考虑代码实现,我们希望是这样的: (1)如果是页面跳转的请求,出现异常了,我们希望跳转到一个异常显示页面,如下: 当然,这里的界面不够美观,但是理论是这样的. (2)如果是ajax请求,那么我们,希望后台将合理的错误显示返回到ajax的回调函数里面,如下: $.ajax

ASP.NET程序读取二代身份证(附源码)

原文:ASP.NET程序读取二代身份证(附源码)  一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一个(带驱动光盘),这里我用的是精伦电子公司的iDR200,并有这个阅读器的开发接口说明. 二.新建一个winform控件项目ReadCardControl,添加一个主类ReadCard 1.  声明dll入口         [DllImport("Sdtapi.dll")]      

2款不同样式的CSS3 Loading加载动画 附源码

原文:2款不同样式的CSS3 Loading加载动画 附源码 我们经常看到的Loading加载很多都是转圈圈的那种,今天我们来换一种有创意的CSS3 Loading加载动画,一种是声波形状的动画,另一种是折线弯曲的动画,它们实现起来也非常简单,先来看看效果图: 看起来还挺特别的吧.. 另外你也可以在这里看到这个Loading动画的DEMO演示 接下来我们来看看如何用CSS3来实现这2款特别的Loading动画的. 首先是HTML代码,构造了2个Loading容器: 这是第一个: <div sty

图解DevExpress RichEditControl富文本的使用,附源码及官方API

原文:图解DevExpress RichEditControl富文本的使用,附源码及官方API   9点半了,刚写到1.2.   该回家了,明天继续写完. 大家还需要什么操作,留言说一下,没有的我明天继续加.     好久没有玩DevExpress了,今天下载了一个玩玩,发现竟然更新到14.2.5了..我去. 本章主题: 创建项目,窗体搭建 给RichEditControl添加工具条 创建自定义的工具条按钮项 图片解析操作 修正文档字体 内容搜索功能 导入导出功能(文本/HTML/Word) 官