分享
 
 
 

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

王朝java/jsp·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

看到很多很多人持续在问这个问题。

以前我也听说,好像kvm底层实现不太支持j2me来做streaming video/audio,但我不知道那人为什么这么说。

那么现在国外有一个人提出下面这种思路,并且号称在Nokia6260[相关数据:诺基亚 6260 Nokia62602.0 (3.0436.0) SymbianOS7.0s Series602.1 ProfileMIDP-2.0 ConfigurationCLDC-1.0]

上真实实现了(两种网络方式:蓝牙和GPRS都试验过),但我怀疑他的前提条件是“你的手机必须允许同时实现player的多个实例进入prefetched状态(预读取声音流)”:

第一步:

声明两个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开始播放。

如此往复。

大家看看此种理论可否。

我自己在nokia 7610上测试了一下,我上面说的前提被证明是可行的:“你的手机必须允许同时实现player的多个实例进入prefetched状态(预读取声音流)”。真实Nokia手机确实可以如此:

两个线程中各自有一个Player,都开始做m_player.realize();和m_player.prefetch();,然后等候。

先播放线程1的Player,等她播放完后,

通过

/**//*

* 本类实现了PlayerListener接口。通过这个事件来告知媒体已经播放完毕

*/

public void playerUpdate(Player player, String event, Object data)
{

if(event == PlayerListener.END_OF_MEDIA)
{

try
{

System.out.println("playerUpdate>>PlayerListener.END_OF_MEDIA");

stopGauge();

playForeground();

}catch(Exception e)
{

e.printStackTrace();

}

}

}

来通知第二个线程的Player播放。

这样是可以的。

qinjiwy说“可以,不过前提是该音频文件允许分段播放,有些音频文件就是不允许的.”,你说得对。确实有很多格式的媒体文件不支持分段播放。我所知道的是wav可以,mp3也可以。

服务端每次只读取这两种媒体文件的某一部分,如果是mp3文件的话,我暂时不知道是否每次需要加上特殊的头信息。

但是如果是WAV文件,那么肯定每次都要加上WAV特定的头,要不然Player也无法播放。

这种形式肯定是可行的。因为以前我在VC++上写Text To Speech程序时,就是这么做的:WAV文件的前若干个字节肯定是头信息,这是一定的,随后跟的全是RAW DATA;我每一次读取WAV的RAW DATA若干字节后,传给我的播放线程,他需要给这段RAW DATA前加上一个WAV HEADER,然后就可以正常播放了。

20060115增补:

Huang的Mobcast,确实非常著名,几个月以前,在我写toodouPodcastMidlet时就看过许多人介绍过他,但是就是连不上http://www.geocities.com/tvhuangsg/mobcast/这个地址,所以一直未睹真容。

转换各种格式的video为3gp,转换各种格式的audio为amr,这些在开源软件mplayer手下是随手拈来,只需要看懂mplayer的各种参数即可做到了。所以拜mplayer所赐,我也能够制作手机看交通实况录像,都要感谢那些mplayer的开发人员!

"移动收听必须对中断事件进行管理",这个确实需要考虑。当进入Paused状态时,需要通知播放线程暂停,同时连接线程暂时就不要去抓取服务器的媒体数据了;等界面切换回来后,播放线程继续replay,连接线程继续下载音乐。

cleverpig说“可以通过人工(或者用程序)将文件分割后部署放到服务器上来解决”,我想也是,简单的文件分割是不够的,或者说仅仅适合于wav这种原始数据格式。应该事先将音乐文件用mencoder分解成一段一段的音乐文件放在服务器上,mencoder将处理每一段的格式问题保证能独立播放,这样手机下载起来只需要按照编号一段一段地下载即可,服务器不再需要运算和添加头信息。

美中不足,如果两个player切换播放,中间会有一个卡啪声。

Server side java code:

public void transfer(DataOutputStream output)
{

try
{

int i = 0;

int auglis = 50058; //chunk size

//if it is wav file, we need to edit header:

//audio[4] = (byte)0x8A;

// audio[5] = (byte)0xC3;

// audio[6] = (byte)0x00;

// audio[7] = (byte)0x00;

// audio[54] = (byte)0x50;

// audio[55] = (byte)0xC3;

// audio[56] = (byte)0x00;

// audio[57] = (byte)0x00;

byte[] tmp = new byte[50058];

int countBytes= 0;

int headerup = 32; //mp3 header is 32 bytes.

while(i<50058)
{

tmp[i] = audio[i]; //byte array audio is byte array from mp3 file

i++;

countBytes++;

}

output.writeInt(50058); //write to midlet, that chunk size will be 50058

output.write(tmp); //write chunk itself

boolean varam = true; //booleand that will become false, when file ends

while(varam)
{

int tmplen = garums - countBytes; //check if it is not last chunk

int o=50058;

if(tmplen>50058)
{ //if it is not last chunk

o = 50058;

}

else
{

o = tmplen+headerup; // if it is last chunk

tmp = new byte[o];

varam = false; //out while loop will end

}

int z = 0;

while(z<32)
{ //write 32 byte header to chunk

tmp[z] = audio[z];

z++;

countBytes++;

}

while(z<o)
{ //white chunk it self

tmp[z] = audio[i];

z++;

i++;

countBytes++;

}

headerup = headerup +32;

output.writeInt(o); //white size of chunk (typically 50058)

output.write(tmp); //white chunk itself

}

}

catch (Exception e)
{}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有