流媒体的初研以前我也听说,好像kvm底层实现不太支持j2me来做streaming video/audio,但我不知道那人为什么这么说。
2007-04-27 21:47
459 查看
以前我也听说,好像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,等她播放完后,
通过
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedBlock.gif)
/**//*
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
* 本类实现了PlayerListener接口。通过这个事件来告知媒体已经播放完毕
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockEnd.gif)
*/
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedBlock.gif)
public void playerUpdate(Player player, String event, Object data)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
if(event == PlayerListener.END_OF_MEDIA)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
try
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
System.out.println("playerUpdate>>PlayerListener.END_OF_MEDIA");
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
stopGauge();
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
playForeground();
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
}catch(Exception e)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
e.printStackTrace();
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/None.gif)
来通知第二个线程的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:
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedBlock.gif)
public void transfer(DataOutputStream output)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
try
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int i = 0;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int auglis = 50058; //chunk size
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
//if it is wav file, we need to edit header:
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
//audio[4] = (byte)0x8A;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[5] = (byte)0xC3;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[6] = (byte)0x00;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[7] = (byte)0x00;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[54] = (byte)0x50;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[55] = (byte)0xC3;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[56] = (byte)0x00;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[57] = (byte)0x00;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
byte[] tmp = new byte[50058];
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int countBytes= 0;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int headerup = 32; //mp3 header is 32 bytes.
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
while(i<50058)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
tmp[i] = audio[i]; //byte array audio is byte array from mp3 file
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
i++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
countBytes++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
output.writeInt(50058); //write to midlet, that chunk size will be 50058
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
output.write(tmp); //write chunk itself
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
boolean varam = true; //booleand that will become false, when file ends
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
while(varam)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int tmplen = garums - countBytes; //check if it is not last chunk
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int o=50058;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
if(tmplen>50058)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{ //if it is not last chunk
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
o = 50058;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
else
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
o = tmplen+headerup; // if it is last chunk
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
tmp = new byte[o];
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
varam = false; //out while loop will end
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int z = 0;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
while(z<32)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{ //write 32 byte header to chunk
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
tmp[z] = audio[z];
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
z++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
countBytes++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
while(z<o)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{ //white chunk it self
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
tmp[z] = audio[i];
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
z++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
i++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
countBytes++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
headerup = headerup +32;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
output.writeInt(o); //white size of chunk (typically 50058)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
output.write(tmp); //white chunk itself
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
catch (Exception e)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockEnd.gif)
}
那么现在国外有一个人提出下面这种思路,并且号称在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,等她播放完后,
通过
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedBlock.gif)
/**//*
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
* 本类实现了PlayerListener接口。通过这个事件来告知媒体已经播放完毕
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockEnd.gif)
*/
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedBlock.gif)
public void playerUpdate(Player player, String event, Object data)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
if(event == PlayerListener.END_OF_MEDIA)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
try
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
System.out.println("playerUpdate>>PlayerListener.END_OF_MEDIA");
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
stopGauge();
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
playForeground();
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
}catch(Exception e)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
e.printStackTrace();
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/None.gif)
来通知第二个线程的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:
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedBlock.gif)
public void transfer(DataOutputStream output)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
try
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int i = 0;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int auglis = 50058; //chunk size
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
//if it is wav file, we need to edit header:
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
//audio[4] = (byte)0x8A;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[5] = (byte)0xC3;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[6] = (byte)0x00;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[7] = (byte)0x00;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[54] = (byte)0x50;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[55] = (byte)0xC3;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[56] = (byte)0x00;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
// audio[57] = (byte)0x00;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
byte[] tmp = new byte[50058];
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int countBytes= 0;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int headerup = 32; //mp3 header is 32 bytes.
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
while(i<50058)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
tmp[i] = audio[i]; //byte array audio is byte array from mp3 file
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
i++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
countBytes++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
output.writeInt(50058); //write to midlet, that chunk size will be 50058
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
output.write(tmp); //write chunk itself
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
boolean varam = true; //booleand that will become false, when file ends
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
while(varam)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int tmplen = garums - countBytes; //check if it is not last chunk
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int o=50058;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
if(tmplen>50058)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{ //if it is not last chunk
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
o = 50058;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
else
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
o = tmplen+headerup; // if it is last chunk
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
tmp = new byte[o];
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
varam = false; //out while loop will end
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
int z = 0;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
while(z<32)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{ //write 32 byte header to chunk
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
tmp[z] = audio[z];
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
z++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
countBytes++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ContractedSubBlock.gif)
while(z<o)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{ //white chunk it self
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
tmp[z] = audio[i];
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
z++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
i++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
countBytes++;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
headerup = headerup +32;
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
output.writeInt(o); //white size of chunk (typically 50058)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
output.write(tmp); //white chunk itself
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/InBlock.gif)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedSubBlockStart.gif)
catch (Exception e)
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/dot.gif)
{}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/ExpandedBlockEnd.gif)
}
![](http://blog.csdn.net/kaiming2008/article/details/file:/D:/j2me技术/J2me流媒体技术实现讨论[1]%20-%20旁观者%20-%20郑昀%20-%20CSDNBlog.files/None.gif)
相关文章推荐
- 今天无意中发现JavaBean类基本都要求实现了Serializable接口,以前只是知道序列化以后,可以通过io流的方式将对象序列化和反序列化,进行存取,但不知道为什么需要序列化,今天总结一下
- J2ME实现RTSP(只有在支持的手机才能用)
- 不知道为什么想起以前的事总是那么的心痛
- 第107课: Spark Streaming电商广告点击综合案例底层数据层的建模和编码实现(基于MySQL)
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- 设计并实现同时支持多种视频格式的流媒体点播系统
- 代码验证浏览器是否支持html audio 和video
- ValueType.Equals(null)的底层实现及CLR虚拟机对其结构支持
- HTML5 audio与video标签实现视频播放,音频播放
- 使用Virtual Audio Cable软件实现电脑混音支持电脑录音
- 设计并实现同时支持多种视频格式的流媒体点播系统
- x86架构对KVM支持的内核实现
- Streaming live video from ios(ios 流媒体)
- 通过调用第三方应用实现彩信或邮件添加附件(Photo,Video,Audio)功能
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- HTML5 audio与video标签实现视频播放,音频播放
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- ffmpeg移植到Android平台为什么用编译libjnivideo.so和libjniaudio.so
- Android3.0以前的Fragment支持实现Tab导航
- redis支持的五种数据类型及其底层实现