`
chanshui
  • 浏览: 84544 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jmf 视频传输 自己备用没有整理

阅读更多
JMF中可以实现RTP媒体流的回放(playback)和传输(transmission),主要由javax.media.rtp, javax.media.rtp.event,和javax.media.rtp.rtcp包中定义的API完成。JMF可以通过标准的JMF plug-in机制来实现支持特定的RTP格式和动态负载。
  你可以在本地播放RTP数据流,或将其存储到本地文件。



  同样,你可以通过JMF中RTP API实现传输捕获的或存储的媒体流到网上。RTP媒体流可以创建自一个本地文件或捕获自媒体采集设备。这些RTP媒体流同样可以在本地播放或存储。



  整体流程图示:



  1.  RTP结构

  1.1 SessionManager

  在JMF架构中Session Manager对程序之间的会话进程进行控制和管理。Session Manager主要作用:

  ①明确每一个会话(session)中的所有参与者(participants)。

  ②管理每一个RTP会话。

  ③保存来自每一个发送或接收到的RTP和RTCP包中的统计信息。

  JMF RTP Session结构图:



  SessionManagr包含2个部分:Session Statistics和Session Streams。

  1.1.1Session Statistics

  统计量(Statistics)是记录基于每一条媒体流上的整个会话的统计信息。它包含:

  ①GobalReceptionStats:包含此会话的全局接收统计信息。

  ②GobalTransmissionStats:包含此会话的全局传输统计信息。

  ③RecetionStats:包含每一个参与者接收统计信息。

  ④TransmissionStats:包含每一个参与者的传输统计信息。

  1.1.2Session Streams

  ①ReceiveStream:表示一个接收到的来自远端参与者的媒体流。

  ②SendStream:表示一个来自本地的媒体流。

  1.2 RTP事件

  如下图所示,通过继承JMF中MediaEvent的类,可以创建响应的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:表示接收到一个RTCP的RR包。

  ②SenderReportEvent:表示收到一个RTCP的SR包。

  ③RemoteCollisionEvent:表示两个远端的参与者使用了相同的SSRC 出错。

  1.3与RTP事件相对应的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/rtp,dvi/rtp ,g723/rtp ,gsm/rtp
视频 jpeg/rtp,h261/rtp,h263/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.widthint)(size.width / *;
//调整高
height = (size.height % 8 == 0 ? size.heightint)(size.height / *;
  } 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);

  2.RTP媒体数据流的传输与接收2.1 RTP媒体数据流的传输过程



  上图为Transmit的整个设计架构,Processor处理来自Capture Device的数据后,输入对方IP和Port,将数据传送到网络上等待接收端接收,其中音频的端口为视频的端口加2。

  部分代码及分析:

  ①将转换格式后的数据放入一个DataSource

//获得转制后的DataSource
dataOutput = processor.getDataOutput();
//将DataSource转化为Push数据流
PushBufferDataSource pbds = (PushBufferDataSource)dataOutput;
//获取Push数据流
PushBufferStream pbss[] = pbds.getStreams();

  数据源决定了轨道数的多少,如果数据源中包括视频和音频内容,则有两个轨道,一个轨道分给视频,一个轨道分给音频,在数据源的格式转制完成以后,每个轨道对应着一个RTP会话,这些RTP会话由会话管理器(RTPManager)统一管理。

  ②以下是建立RTP Session中发送的关键代码和分析:

rtpMgrs[i] = RTPManager.newInstance();//RTP管理器实例化  
ipAddr = InetAddress.getByName("59.64.84.243");//获得目的地址的IP地址
//获取本机IP地址
localAddr = new SessionAddress( InetAddress.getLocalHost(),port);
//获取目的机IP地址
destAddr = new SessionAddress( ipAddr, port);
//分别将本机和目的机IP地址加入至RTP会话管理器
rtpMgrs[i].initialize( localAddr);
rtpMgrs[i].addTarget( destAddr);
//产生第N条轨道的传输流
sendStream = rtpMgrs[i].createSendStream(dataOutput, i);
//传输流开始
sendStream.start();2.2 RTP媒体数据流的接收过程



  接收方式为经由SessionManager到DataSource到Player,然后播放。上图即为Receive的整个设计构架,传送端送出数据后,接收端输入对方IP然后等待接收数据,其中音频的端口为视频的端口加2。

  部分代码及分析:

/*
*目的机建立RTP会话管理器原理和步骤基本与发送端一至,我们主要分析接收多媒体流的事件类。
*/
public synchronized void update( ReceiveStreamEvent evt){
if(evt instanceof NewReceiveStreamEvent) {//接收到一个新的数据流
//根据获取的数据流获得一个数据源。这个数据源为播放使用
} else if (evt instanceof StreamMappedEvent) {
//数据流映射事件
//如果当前数据源为NULL,根据这个事件获得一个Datasource,否则忽略
}else if (evt instanceof ByeEvent) {//数据接收完毕
//播放结束
}
}

  2.3基于JMF 的RTP/RTCP 传输模型的整体设计
分享到:
评论
1 楼 androidzjb 2012-06-25  
谢谢分享

相关推荐

    JMF视频传输

    【JMF视频传输】是指利用Java Media Framework (JMF) 实现的网络视频传输技术,它结合了实时传输协议RTP (Real-Time Transport Protocol) 和实时传输控制协议RTCP (Real-Time Transport Control Protocol) 来确保高...

    JMF视频传输技术在Web机器人中的应用.pdf

    JMF(Java媒体框架)视频传输技术是一种强大的技术工具,它在Web机器人中的应用提升了机器人远程操作的能力,特别是通过网络实现对机器人的视觉临场感和遥操作能力。本文将探讨JMF视频传输技术在Web机器人中的具体...

    jmf音视频传输

    在这个框架中,有几个核心的类和概念,它们是实现音视频传输的关键。 1. **截取设备(CaptureDeviceInfo)**: 截取设备类用于获取系统中可用的音视频输入设备信息,如摄像头或麦克风。通常,这些设备信息会被存储...

    jmf rtp 传输视频例子

    Java Media Framework (JMF) 是一个用于开发多媒体应用程序的开源框架,它允许开发者处理音频、视频数据,并且支持实时传输协议(RTP)。RTP通常用于在不可靠的网络环境中高效传输时间敏感的数据,如音频和视频流。...

    jmf 视频采集与传输源代码

    Java Media Framework (JMF) 是一个开源的Java平台框架,用于处理多媒体数据,包括音频、视频的播放、捕获和传输。在这个“jmf视频采集与传输源代码”压缩包中,我们可以找到与使用JMF进行视频采集和传输相关的源...

    java利用JMF框架实现视频传输的完整代码

    通过学习这个项目中的完整代码,开发者可以深入理解如何在 Java 中利用 JMF 实现视频传输,为开发自己的多媒体应用程序打下基础。同时,由于 JMF 已经相对较老,开发者也需要了解其替代品,如 JavaFX 或 OpenCV,...

    jmf rtp 视频音频传输聊天

    Java Media Framework (JMF) 和 Real-Time Transport Protocol (RTP) 是在开发视频音频传输聊天应用时常用的技术。本文将详细介绍这两个技术以及如何利用它们实现一个聊天应用。 **Java Media Framework (JMF)** ...

    jmf的视频聊天

    Java Media Framework(JMF)是Java平台上用于处理多媒体数据的一个框架,它允许开发者创建和播放音频、视频等多媒体内容。本文将深入探讨基于JMF的视频聊天软件开发,旨在帮助初学者和有经验的开发者更好地理解和...

    基于RTP实时传输协议的JMF多媒体传输 源代码

    基于RTP实时传输协议的JMF多媒体传输源代码 本资源是使用Java Media Framework(JMF)实现的基于实时传输协议(RTP)的多媒体传输源代码。该项目的主要功能是使用RTP协议来传输多媒体数据,并使用JMF来处理和播放...

    JMF-rtp.zip_JMF RTP_JMF_RTP_java rtp 摄像头_jmf_视频传输 java

    利用jmf进行rtp传输,在本地测试调用摄像头进行视频通讯 . 在Sender和Receiver中的main函数中,我把本地地址和远端地址都设置成本机的地址,自己传给自己,用来试验用的。 其中用到 StateHelper类 。 Sender的前两...

    JMF-RTP.rar_jmf_rtp java_rtp 语音视频_视频传输_视频语音

    虽然JMF RTP组合提供了一种实现音视频传输的方法,但也有其局限性。例如,JMF对新格式的支持有限,且性能可能不如现代库如Jitsi或WebRTC。此外,RTP本身不提供错误恢复机制,需要在应用层面进行额外处理。开发者可能...

    jmf播放视频视频,录制视频

    在本文中,我们将深入探讨如何利用JMF进行视频的播放和录制。 ### JMF 概述 Java Media Framework 是Sun Microsystems开发的一个API,用于在Java应用程序中支持各种多媒体格式。它允许开发者集成音频、视频和流媒体...

    JMF视频音频通信源码

    基于java JMF多媒体框架写的视频和音频通信源码

    基于jmf的rtp传输demo

    【基于jmf的rtp传输demo】是一个演示项目,展示了如何使用Java Media Framework (JMF) 实现RTP(Real-time Transport Protocol)进行音频文件的实时传输。JMF 是一个开源框架,它允许开发者处理多媒体内容,如音频和...

    JMF摄像头视频采集示例

    4. **视频存储**:由于网络传输功能被替换为保存到磁盘,这意味着开发者使用了JMF的`FileSink`接口或者类似的方法,将视频流转化为文件。这通常涉及设置输出格式(如AVI或MP4)和编码参数,然后启动一个`Controller`...

    基于JMF的音视频聊天程序源代码

    标题中的“基于JMF的音视频聊天程序源代码”指的是使用Java Media Framework (JMF) 开发的一个可以实现音视频通信的应用程序。JMF是Java平台上的多媒体处理框架,它提供了一种支持音频、视频捕获、播放和流传输的...

    java 通过jmf播放视频简单demo

    总结起来,这个Java通过JMF播放视频的简单示例展示了如何利用JMF进行多媒体数据的传输和播放,涉及到网络通信、多媒体处理和Java对象的生命周期管理。虽然JMF在当前环境中可能不是首选,但它仍然是理解多媒体处理和...

Global site tag (gtag.js) - Google Analytics