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

简介:

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

以前我也听说,好像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开始realizeprefetch,并开始播放;

第四步:
Player A播放同时,(18KBamr数据可以播放10秒钟)HttpConnection继续请求第二部分数据(假设GPRS每秒钟传输3KB,那么18KB需要传输6秒,算上前后通讯损失的时间,应该不会超过10秒钟)

第五步:
第二部分数据到位后,假设Player A还没有播放完(这需要调整你的每一部份数据字节数来使得假设成立),那么将数据喂给Player B让它realizeprefetch

第六步:
Player A
播放完后,得到事件通知,于是让Player B开始播放。

如此往复。

大家看看此种理论可否。

 

我自己在 nokia 7610 上测试了一下,我上面说的前提被证明是可行的: 你的手机必须允许同时实现player的多个实例进入prefetched状态(预读取声音流) 。真实 Nokia 手机确实可以如此:
两个线程中各自有一个 Player ,都开始做 m_player.realize(); m_player.prefetch(); ,然后等候。

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

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

ExpandedBlockStart.gif
public   void  playerUpdate(Player player, String event, Object data) {
ExpandedSubBlockStart.gif  
if(event == PlayerListener.END_OF_MEDIA){
ExpandedSubBlockStart.gif   
try{
InBlock.gif    System.out.println(
"playerUpdate>>PlayerListener.END_OF_MEDIA");
InBlock.gif    stopGauge();
InBlock.gif    playForeground();
ExpandedSubBlockStart.gif   }
catch(Exception e){
InBlock.gif    e.printStackTrace();
ExpandedSubBlockEnd.gif   }

ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}

None.gif

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

这样是可以的。

 

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

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

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

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

Server side java code:

ExpandedBlockStart.gif public   void  transfer(DataOutputStream output)  {
ExpandedSubBlockStart.gif         
try{  
InBlock.gif                   
int i = 0;
InBlock.gif                   
int auglis = 50058//chunk size
InBlock.gif              
InBlock.gif                
//if it is wav file, we need to edit header:
InBlock.gif                
InBlock.gif                   
//audio[4] = (byte)0x8A;
InBlock.gif                   
//     audio[5] = (byte)0xC3;
InBlock.gif                  
//  audio[6] = (byte)0x00;
InBlock.gif                  
//  audio[7] = (byte)0x00;
InBlock.gif                  
InBlock.gif                   
//  audio[54] = (byte)0x50;
InBlock.gif                  
//  audio[55] = (byte)0xC3;
InBlock.gif                  
// audio[56] = (byte)0x00;
InBlock.gif                  
// audio[57] = (byte)0x00;
InBlock.gif
                  
InBlock.gif                  
InBlock.gif                   
byte[] tmp = new byte[50058];
InBlock.gif                   
int countBytes= 0;
InBlock.gif                   
int headerup = 32//mp3 header is 32 bytes.
InBlock.gif
                   
ExpandedSubBlockStart.gif                
while(i<50058){
InBlock.gif                 tmp[i] 
= audio[i]; //byte array audio is byte array from mp3 file
InBlock.gif
                 i++;
InBlock.gif                 countBytes
++;
ExpandedSubBlockEnd.gif                   }
  
InBlock.gif                output.writeInt(
50058);     //write to midlet, that chunk size will be 50058
InBlock.gif
                output.write(tmp);   //write chunk itself
InBlock.gif
                     
InBlock.gif                   
boolean varam = true//booleand that will become false, when file ends
ExpandedSubBlockStart.gif
                   while(varam){
InBlock.gif                 
InBlock.gif                   
int tmplen = garums - countBytes; //check if it is not last chunk
InBlock.gif
   
InBlock.gif                   
int o=50058;
ExpandedSubBlockStart.gif                   
if(tmplen>50058)//if it is not last chunk
InBlock.gif
                     o = 50058;  
ExpandedSubBlockEnd.gif                   }

ExpandedSubBlockStart.gif                   
else{
InBlock.gif                   o 
= tmplen+headerup; // if it is last chunk
InBlock.gif
                   tmp = new byte[o];
InBlock.gif                   varam 
= false//out while loop will end
ExpandedSubBlockEnd.gif
                   }

InBlock.gif                   
InBlock.gif                       
int z = 0;
ExpandedSubBlockStart.gif                       
while(z<32)//write 32 byte header to chunk
InBlock.gif
                       tmp[z] = audio[z];          
InBlock.gif                       z
++;
InBlock.gif                       countBytes
++;
ExpandedSubBlockEnd.gif                       }
   
InBlock.gif                             
ExpandedSubBlockStart.gif                       
while(z<o)//white chunk it self
InBlock.gif
                       tmp[z] = audio[i];
InBlock.gif                       z
++;
InBlock.gif                       i
++;
InBlock.gif                       countBytes
++;
ExpandedSubBlockEnd.gif                       }
  
InBlock.gif                          
InBlock.gif                  headerup 
=  headerup +32;
InBlock.gif                  output.writeInt(o);          
//white size of chunk (typically 50058)
InBlock.gif
                  output.write(tmp);    //white chunk itself
InBlock.gif
              
ExpandedSubBlockEnd.gif                   }

InBlock.gif         
InBlock.gif         
ExpandedSubBlockEnd.gif         }

ExpandedSubBlockStart.gif         
catch (Exception e) {}
ExpandedBlockEnd.gif    }

None.gif

 
目录
相关文章
|
4天前
|
编解码 监控 C++
C++音视频编程探秘
C++音视频编程探秘
88 1
|
8月前
|
Web App开发 编解码 安全
音视频绕不开的话题之WebRTC
闲来无事,我们今天探讨下音视频绕不开的一个话题:WebRTC。WebRTC之于音视频行业,无异于FFMpeg,可以说WebRTC的开源,让音视频行业大跨步进入发展快车道。
149 0
|
4天前
|
Web App开发 编解码 监控
RTSP协议探秘:从原理到C++实践,解锁实时流媒体传输之道
RTSP协议探秘:从原理到C++实践,解锁实时流媒体传输之道
181 0
|
11月前
|
Web App开发 编解码 JavaScript
WebRTC技术笔记笔记:WebRTC 网络技术理论与实战(一)
WebRTC 网络技术理论与实战(一) - WebRTC 概述
149 0
|
Web App开发 安全 算法
【WebRTC原理探索】未来可期,WebRTC的诞生发展
【WebRTC原理探索】未来可期,WebRTC的诞生发展
218 0
【WebRTC原理探索】未来可期,WebRTC的诞生发展
|
Web App开发 编解码 移动开发
【WebRTC原理探索】大势所趋,迈向认识 WebRTC第一步
【WebRTC原理探索】大势所趋,迈向认识 WebRTC第一步
360 0
【WebRTC原理探索】大势所趋,迈向认识 WebRTC第一步
|
安全 UED
开发语音直播平台,需要认清的某些概念
开发语音直播平台,需要认清的某些概念
|
编解码 人工智能 自然语言处理
一文读懂阿里云直播技术是如何实现的
东京奥运会正如火如荼举行中,全球亿万观众蜂拥至各大转播平台观看奥运赛事,此时平台直播能力显的尤为重要。阿里云作为视频直播平台的技术提供商,凭借在产品技术、资源带宽、服务保障等方面优势,可为各大转播平台提供全链路技术支持和保障,确保极致观赛体验。下面,小编就带大家了解阿里云视频直播技术是如何实现的:
1050 0
|
存储 Web App开发 编解码
如何使用下一代编码技术提升流媒体体验
本文来自Bitmovin总裁及联合创始人Stefan Lederer LiveVideoStackCon2019北京大会上的分享。Stefan介绍了下一代编解码器和编码技术的实施,以及如何让观众有更好的流媒体和视频体验。另外,还进一步解释HEVC、VP9和AV1如何在不同的设备上运作。如果将这些编解码器结合,可以降低比特率获取更大的存储空间,把CDN成本降低30%。
633 0
如何使用下一代编码技术提升流媒体体验
|
数据安全/隐私保护
关于直播平台开发中流媒体传输,重点干货分享
随着近年来直播行业的飞速发展,直播平台开发的技术日益成熟,直播系统的应用场景也越来越广泛,也离不开流媒体传输的技术支持,本文就主要介绍了当前主流的流媒体传输中推流端及播放端分别需要几步。
关于直播平台开发中流媒体传输,重点干货分享