http://zhangjunhd.blog.51cto.com/113473/25487

JMF中可以实现RTP媒体流的回放(playback)和传输(transmission),主要由 javax.media.rtp, javax.media.rtp.event,javax.media.rtp.rtcp包中定义的API完成。JMF可以通过标准的JMF plug-in机制来实现支持特定的RTP格式和动态负载。
你可以在本地播放RTP数据流,或将其存储到本地文件。
同样,你可以通过JMFRTP API实现传输捕获的或存储的媒体流到网上。RTP媒体流可以创建自一个本地文件或捕获自媒体采集设备。这些RTP媒体流同样可以在本地播放或存储。
整体流程图示:
 
1.   RTP结构
1.1 SessionManager
JMF架构中Session Manager对程序之间的会话进程进行控制和管理。Session Manager主要作用:
①明确每一个会话(session)中的所有参与者(participants)。
②管理每一个RTP会话。
③保存来自每一个发送或接收到的RTPRTCP包中的统计信息。
JMF RTP Session结构图:
SessionManagr包含2个部分:Session StatisticsSession Streams
 
 1.1.1Session Statistics
统计量(Statistics)是记录基于每一条媒体流上的整个会话的统计信息。它包含:
GobalReceptionStats:包含此会话的全局接收统计信息。
GobalTransmissionStats:包含此会话的全局传输统计信息。
RecetionStats:包含每一个参与者接收统计信息。
TransmissionStats:包含每一个参与者的传输统计信息。
 
1.1.2Session Streams
ReceiveStream:表示一个接收到的来自远端参与者的媒体流。
SendStream:表示一个来自本地的媒体流。
 
1.2 RTP事件
如下图所示,通过继承JMFMediaEvent的类,可以创建响应的RTP事件。
SessionListener:通过它得到一个会话状态的改变。
NewParticipantEvent:表示一个新的参与者加入会话。
LocalCollisionEvent:表示参与者请求的同步资源正在使用。
 
SendStreamListener:通过它得到一个正在传送的RTP数据流状态的改变。
NewSendStreamEvent:表示本地参与者已经创建一个新的发送数据流。
ActiveSendStreamEvent:表示从DataSource创建的数据流已经开始发送。
InactiveSendStreamEvent:表示从本地DataSource创建的数据流已经停止。
LocalPayloadChangeEvent:表示数据流格式已经开始改变。
StreamClosedEvent:表示数据流已经停止。
 
ReceiveStreamListener:通过它得到一个正在接收的RTP数据流状态的改变。
NewReceiveStreamEvent:表示SessionManager已经创建了一个从新的侦测到的地址传来的接收数据流。
ActiveReceiveStreamEvent: 表示数据的传送已经开始。
InactiveReceiveStreamEvent:表示数据的传送已经停止。
TimeoutEvent:表示数据传送超时。
RemotePayloadChangeEvent:表示接收到的数据流格式已经改变。
ApplicationEvent:表示收到了一个RTCP App数据包。
 
RemoteListener:通过它得到远端会话参与者的时间或RTP控制信息。
ReceiverReportEvent:表示接收到一个RTCPRR包。
SenderReportEvent:表示收到一个RTCPSR包。
RemoteCollisionEvent:表示两个远端的参与者使用了相同的SSRC 出错。
 
1.3RTP事件相对应的RTCP类型
  RTCP的控制类型和JMF事件类的一致性
RTCP类型
JMF中的事件类
SR
SendStreamEvent
RR
ReceiveStreamEvent
SDES
SenderReportEvent
BYE
ByeEvent
APP
ApplicationEvent
 
1.4数据传输格式
RTP传输中,如果还是用传统的AVI,MOV格式的话,将会增加服务器负荷,而且对网络要求特别高,因此需要将传统格式转化至易于传送,网络适应性好,抗丢包性能和抗误码性能好的编码格式。下表是JMF项目支持的视音频在RTP传送的压缩格式,也就是说经过定制后的输出视频流,还得进行一次转换,以便网络发送。
  JMF支持的视音频在RTP传送中的格式
多媒体类别
RTP传输格式
音频
JAUDIO_G711_ULAW/rtpdvi/rtp g723/rtp gsm/rtp
视频
jpeg/rtph261/rtph263/rtp
 
转化格式的关键代码及其分析(视频):
//processor获得轨道控制器
TrackControl [] tracks = processor.getTrackControls();
//为每个轨道的格式进行转制
for (int i = 0; i < tracks.length; i++)
{
  //此处省略获得轨道信息格式和支持格式代码
    //下面一行为转制函数,需要参数为:轨道格式和轨道支持的格式
    chosen = checkForVideoSizes(tracks[i].getFormat(), supported[0]);
    //此处省略如果不能对轨道格式转变代码
}
 
//转制函数
/* 在传输视频信息时,对于JPEG编码格式,视频图像的宽和高是8像素的整数倍,对于
*H263编码格式,只支持三种图像的大小,即352X288,176X144,128X96像素,只要满
*足了这些条件,才可以正常传输视频信息,所以,需要对视频格式进行转制,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
 *不负荷条件的都需要转化,以满足正常传输。
*/
    Format checkForVideoSizes(Format original, Format supported) {
    int width, height;
    Dimension size = ((VideoFormat)original).getSize();//获取视频图像的尺寸
    Format jpegFmt = new Format(VideoFormat.JPEG_RTP);
    Format h263Fmt = new Format(VideoFormat.H263_RTP);
    if (supported.matches(jpegFmt)) {//如果是JPEG格式
    //调整宽   
width = (size.width % 8 == 0 ? size.width :(int)(size.width / 8) * 8);
//调整高
height = (size.height % 8 == 0 ? size.height :(int)(size.height / 8) * 8);
    } else if (supported.matches(h263Fmt)) {//如果是H263格式
        if (size.width < 128) {
        width = 128;
        height = 96;
        } else if (size.width < 176) {
        width = 176;
        height = 144;
        } else {
        width = 352;
        height = 288;
        }
    } else {
        //对于其他格式不受理
        return supported;
    }
    return (new VideoFormat(null,
                new Dimension(width, height),
                Format.NOT_SPECIFIED,
                null,
                Format.NOT_SPECIFIED)).intersects(supported);
 
2RTP媒体数据流的传输与接收
2.1 RTP媒体数据流的传输过程
上图为Transmit的整个设计架构,Processor处理来自Capture Device的数据后,输入对方IPPort,将数据传送到网络上等待接收端接收,其中音频的端口为视频的端口加2
 
部分代码及分析:

①将转换格式后的数据放入一个DataSource
//获得转制后的DataSource
dataOutput = processor.getDa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值