精华内容
下载资源
问答
  • 行业分类-设备装置-多媒体消息服务系统及其方法.zip
  • 简单多媒体消息服务(MMS)协议解码器库。 您可以使用该示例来解析任何MMS消息标题并提取其主体部分。
  • 行业分类-设备装置-基于多媒体消息服务的面相图像处理系统和方法
  • 行业分类-设备装置-将电净化、光分解、厨房杀菌应用于油烟净化机的方法.zip
  • 多媒体消息服务客户端事务SINwap-206_101-mmsctr-20011009-a
  • 行业分类-设备装置-实现多媒体消息业务的方法、多媒体消息系统、多媒体消息系统的服务器和多媒体终端
  • 行业分类-设备装置-多媒体消息接发服务中媒体内容的流式传输.zip
  • 行业分类-设备装置-多媒体消息下发、展示方法及服务器、移动终端.zip
  • VoIP最大的优势是能广泛地采用Internet和全球IP互连的环境,提供比传统业务更多、更好的服务。 VoIP可以在IP网络上便宜的传送语音、传真、视频、和数据等业务,如统一消息、虚拟电话、虚拟语音/传真邮箱、查号业务...
  • 行业分类-设备装置-基于多媒体消息传递服务的数据库同步方法和系统
  • 行业分类-设备装置-基于多媒体消息业务实现服务的方法、系统、终端和服务器
  • 多媒体消息存储器是一个永久的储存中心,可以保存从多媒体消息中接收到的或由用户自己创作的图片、视频、音频片段;灵活的实时计费体系;报告和分析服务数据的商用工具;用于西门子与第三方多媒体应用的扩展序列,它...
  • VoIP的优势是能广泛地采用Internet和IP互连的环境,提供比传统业务更多、更好的服务。 VoIP可以在IP网络上便宜的传送语音、传真、视频、和数据等业务,如统一消息、虚拟电话、虚拟语音/传真邮箱、查号业务、...
  • 行业分类-设备装置-用于存储及访问多媒体消息传送服务相关信息的方法及其装置
  • 豪义网络的 ArdorTM Mobile Data Service Platform (MDSP),即移动数据服务平台,是电信级、稳定、具有高可伸缩性的增值业务平台,率先提供多媒体消息服务。系统既可以应用于现有的2G及2.5G网络系统,也可以平滑过渡...
  • 4.2.2.1 创建提交增值业务的多媒体消息(MM7SubmitReq) 13 4.2.2.2 创建取消多媒体消息(MM7CancelReq) 15 4.2.2.3 创建替换多媒体消息(MM7ReplaceReq) 16 4.2.3 创建消息内容体 16 4.2.4 发送多媒体消息 17 ...
  • Hashtag.io是一个基于PHP的社交网站,支持专有的多媒体内容,共享以及私人或团体消息服务。 快速链接 屏幕截图 产品特点 登录,注册,忘记密码(带有电子邮件验证)。 快速登录,就像在Facebook和Instagram中一样...
  • 这次想分享的是使用mina框架自定义编解码器,实现发送纯文本和非纯文本消息,带PBE加密。  首先定义要发送的信息包,之前一直想用mina进行图片语音,短视频的传送,把多媒体信息封装成一个类,纯文本文件封装成一个...

           首先,对于mina的基本使用这里就不多说了,之前已经转载了一篇很详细的说明。这次想分享的是使用mina框架自定义编解码器,实现发送纯文本和非纯文本消息,带PBE加密。

           首先定义要发送的信息包,之前一直想用mina进行图片语音,短视频的传送,把多媒体信息封装成一个类,纯文本文件封装成一个类。然后使用多路分离解码器,虽然这种方法可行,但是发送和接收都直接跳过了handler这层。到最后处理业务逻辑很不方便。

           然后尝试值使用一种格式的信息类,消息类型只有是纯文本或非纯文本的标识。一个String类型,真实发送时是发送JSON数据。然后一个byte数组。当是纯文本信息是,标识是'+',byte数组为null,这里不会造成new 一个信息类就会分配多余的内存。当时非纯文本信息时,标识是'-'。byte数组存放多媒体信息。

           接下来重要的环节就是编写编码器和解码器,思想很简单,根据发送的信息标识进行相应的编码,根据标识进行相应的解码。然后就是加密,这里用到的是PBE对称加密。加密时机是编码器编码时。解密就是在解码器解码时。加密速度我测试了一下。4.1M 加密:191ms 解密:198ms   15M  加密: 600ms    解密:570ms,应该还可以了。

           接下来附上代码:

    1.信息类

           /**
     * symbol = '+' : 纯本文件
     * symbol = '-' : 非纯本文件
     * @author Administrator
     */
    public class iMoMoMsg {
     public char symbol;//判断是否是纯文本文件
     public String msgJson;//包含图片详情的解释
     public byte[] msgBytes;//图片
    }

     

    2.编码类

    package com.imomo_codecfactory;

    import java.nio.charset.Charset;
    import java.nio.charset.CharsetEncoder;

    import org.apache.commons.codec.binary.Base64;
    import org.apache.mina.core.buffer.IoBuffer;
    import org.apache.mina.core.session.IoSession;
    import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
    import org.apache.mina.filter.codec.ProtocolEncoderOutput;

    import com.imomo_msg.iMoMoMsg;
    import com.security.PBE;

    public class iMoMoEncoder extends ProtocolEncoderAdapter {
     CharsetEncoder encoder = Charset.forName("utf-8").newEncoder();
     // 纯文本发送格式:头标记(char) + 信息长度(int) +文本信信息(加密byte[])
     // 非纯文本发送格式:头标记(char) + 文字信息长度(int) + 文字信息(加密byte[]) + 多媒体信息长度(int) + 多媒体信息(加密byte[])
     @Override
     public void encode(IoSession session, Object msg, ProtocolEncoderOutput out)
       throws Exception {
      iMoMoMsg moMsg = (iMoMoMsg) msg;
      char symbol = moMsg.symbol;
      try {
       if (symbol == '+') {
        byte[] msgJsonByte = PBE.enCrypt(moMsg.msgJson.getBytes());//加密
        System.out.println("--发送文本信息   = " + moMsg.msgJson);
        int msgLen = msgJsonByte.length;
        // 2 :最开始的头部symbol,这里是'-+ ,4表示长度位
        IoBuffer io = IoBuffer.allocate(2 + 4 + msgLen).setAutoExpand(
          true);
        io.putChar(symbol);
        io.putInt(msgLen);
        io.put(msgJsonByte);
        io.flip();
        out.write(io);
       } else if (symbol == '-') {
        byte[] msgJsonByte = PBE.enCrypt(moMsg.msgJson.getBytes());//加密
        byte[] msgBytes = PBE.enCrypt(moMsg.msgBytes);
        System.out.println("--发送多媒体信息 = " + moMsg.msgJson
          + " msgBytesLen = " + msgBytes.length);
        int textLen = msgJsonByte.length;// 文字信息长度
        int msgBytesLen = msgBytes.length;// 图片长度
        IoBuffer io = IoBuffer.allocate(
          2 + 4 + 4 + textLen + msgBytesLen).setAutoExpand(true);
        io.putChar(symbol);
        io.putInt(textLen);
        io.put(msgJsonByte);
        io.putInt(msgBytesLen);
        io.put(msgBytes);
        io.flip();
        out.write(io);
       }
      } catch (Exception e) {
       e.printStackTrace();
      }
     }

    }

    3.解码类

    package com.imomo_codecfactory;

    import java.io.FileOutputStream;
    import java.nio.channels.FileChannel;
    import java.nio.charset.Charset;
    import java.nio.charset.CharsetDecoder;
    import java.util.Date;

    import org.apache.mina.core.buffer.IoBuffer;
    import org.apache.mina.core.session.IoSession;
    import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
    import org.apache.mina.filter.codec.ProtocolDecoderOutput;
    import org.apache.mina.filter.codec.demux.MessageDecoder;
    import org.apache.mina.filter.codec.demux.MessageDecoderResult;

    import com.imomo_msg.iMoMoMsg;
    import com.security.PBE;

    public class iMoMoDecoder extends CumulativeProtocolDecoder {
     CharsetDecoder decoder = Charset.forName("utf-8").newDecoder();

     @Override
     protected boolean doDecode(IoSession session, IoBuffer in,
       ProtocolDecoderOutput out) throws Exception {
      iMoMoMsg moMsg = new iMoMoMsg();
      int pos = in.position();
      int remaining = in.remaining();
      try {
       // 判断长度,开头symbol 是char型
       if (remaining < 2) {
        in.position(pos);
        return false;
       }
       char symbol = in.getChar();// 相当于消费掉字节流
       moMsg.symbol = symbol;
       if (symbol == '+') {
        int msgJsonLen = 0;// msgJson长度
        // 判断是否够解析出的长度
        msgJsonLen = in.getInt();
        if (remaining - 2 < msgJsonLen || msgJsonLen < 0) {
         in.position(pos);
         return false;
        }
        byte[] temp = new byte[msgJsonLen];
        in.get(temp);//得到加密后byte数组
        moMsg.msgJson = new String(PBE.deCiphering(temp));
        out.write(moMsg);
       } else if (symbol == '-') {
        // 接收文本信息
        int msgJsonLen = 0;// msgJson长度
        int msgBytesLen = 0;// msgBytes长度
        msgJsonLen = in.getInt();
        if (remaining - 2 < msgJsonLen || msgJsonLen < 0) {
         in.position(pos);
         return false;
        }
        byte[] temp1 = new byte[msgJsonLen];
        in.get(temp1);//得到加密后byte数组
        moMsg.msgJson = new String(PBE.deCiphering(temp1));
        // 接收图片信息
        msgBytesLen = in.getInt();
        if (remaining - 2 - 4 - 4 - msgJsonLen < msgBytesLen
          || msgBytesLen < 0) {
         in.position(pos);
         return false;
        }
        byte[] temp2 = new byte[msgBytesLen];
        in.get(temp2);//得到加密后byte数组
        moMsg.msgBytes = PBE.deCiphering(temp2);
        out.write(moMsg);
       }
      } catch (Exception e) {
       e.printStackTrace();
       in.position(pos);
       return false;
      }
      return true;
     }
    }

    如果对编解码不熟的可以参考mina开发手册。

    测试 发送15m的视频:

    client handler类里:

    @Override
     public void sessionOpened(IoSession session) throws Exception {
      iMoMoMsg moMoMsg = new iMoMoMsg();
      JSONObject textJson = new JSONObject();
      textJson.put("type", "login");
      textJson.put("id", "201513");
      textJson.put("pwd", "1234");
      moMoMsg.msgJson = textJson.toJSONString();
      moMoMsg.symbol = '+';
      session.write(moMoMsg);

      // 发送图片信息
      JSONObject multiJson = new JSONObject();
      multiJson.put("type", "pic");
      multiJson.put("sender", "001");
      multiJson.put("getter", "002");
      FileInputStream fileInputStream = new FileInputStream("f:\\moshou.avi");
      FileChannel channel = fileInputStream.getChannel();
      ByteBuffer bytebuffer = ByteBuffer.allocate((int) channel.size());
      bytebuffer.clear();
      channel.read(bytebuffer);
      iMoMoMsg moMoMsg2 = new iMoMoMsg();
      moMoMsg2.msgJson = multiJson.toJSONString();
      moMoMsg2.msgBytes = bytebuffer.array();
      moMoMsg2.symbol = '-';
      session.write(moMoMsg2);
      fileInputStream.close();
      channel.close();

     }

    server handler里:

    public void messageReceived(IoSession session, Object message)
       throws Exception {
      super.messageReceived(session, message);
      iMoMoMsg moMoMsg = (iMoMoMsg) message;
      if(moMoMsg.symbol == '+'){
       String msgJson = moMoMsg.msgJson;
       System.out.println("服务器 收到纯文本信息 : " + msgJson);
      } else if(moMoMsg.symbol == '-'){
       String msgJson = moMoMsg.msgJson;
       System.out.println("服务器 收到多媒体本信息 : " + msgJson + "多媒体信息长度" + moMoMsg.msgBytes.length);
       FileOutputStream fileout = new FileOutputStream("F:\\"
         + new Date().getMinutes() + "-.avi");
       FileChannel fc = fileout.getChannel();
       fileout.write(moMoMsg.msgBytes);
       fc.close();
       fileout.close();
      }
      
     }

    控制台打印:

    客户端:

     

    本次加密用时 : 774
    本次加密用时 : 651
    --发送多媒体信息 = {"getter":"002","sender":"001","type":"pic"} msgBytesLen = 16174624

     

    服务器:

    本次解密用时 : 177

    本次解密用时 : 597
    服务器 收到多媒体本信息 : {"getter":"002","sender":"001","type":"pic"}多媒体信息长度16174616

     

    从上可以看到:加密不管是对文本信息加密还是对多媒体文件加密,都比较耗时间,解密就相对较快。

     

    具体工程:http://download.csdn.net/detail/u011102153/8615791

     

     

          

    展开全文
  • 之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消息】包含回复图片消息/回复语音消息/回复视频消息/回复音乐消息...

    之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消息】包含回复图片消息/回复语音消息/回复视频消息/回复音乐消息,这里以图片消息的回复为例进行讲解!

    还记得之前将消息分类的标准就是一种是不需要上传多媒体资源到腾讯服务器的而另外一种是需要的,所以在这里我们所需要做的第一步就是上传资源到腾讯服务器,这里我们调用【素材管理】接口(后面将会有专门的章节讲述)进行图片的上传,同样的这个接口可以提供我们对语音、视频、音乐等消息的管理,这里以图片为例(文档地址:http://mp.weixin.qq.com/wiki/10/10ea5a44870f53d79449290dfd43d006.html  )。在文档中我们可以发现这里上传的方式是模拟表单的方式上传,然后返回给我们我们需要在回复消息中需要用到的参数:media_id!

    (一)素材接口图片上传

    按照之前我们的约定将接口请求的url写入到配置文件interface_url.properties中:

    1
    2
    3
    4
    #获取token的url
    #永久多媒体文件上传url

    然后我在这里写了一个模拟表单上传的工具类HttpPostUploadUtil.java,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    package  com.cuiyongzhi.wechat.util;
     
    import  java.io.BufferedReader;  
    import  java.io.DataInputStream;  
    import  java.io.DataOutputStream;  
    import  java.io.File;  
    import  java.io.FileInputStream;  
    import  java.io.InputStreamReader;  
    import  java.io.OutputStream;  
    import  java.net.HttpURLConnection;  
    import  java.net.URL;  
    import  java.util.Iterator;  
    import  java.util.Map;  
     
    import  javax.activation.MimetypesFileTypeMap;
    import  com.cuiyongzhi.web.util.GlobalConstants;
      
    /**
      * ClassName: HttpPostUploadUtil
      * @Description: 多媒体上传
      * @author dapengniao
      * @date 2016年3月14日 上午11:56:55
      */
    public  class  HttpPostUploadUtil {  
         
         public  String urlStr; 
         
         public  HttpPostUploadUtil(){
             urlStr =  "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=" +GlobalConstants.getInterfaceUrl( "access_token" )+ "&type=image" ;  
         }
           
           
       
         /** 
          * 上传图片 
          *  
          * @param urlStr 
          * @param textMap 
          * @param fileMap 
          * @return 
          */  
         @SuppressWarnings ( "rawtypes" )
         public  String formUpload(Map<String, String> textMap,  
                 Map<String, String> fileMap) {  
             String res =  "" ;  
             HttpURLConnection conn =  null ;  
             String BOUNDARY =  "---------------------------123821742118716" //boundary就是request头和上传文件内容的分隔符  
             try  {  
                 URL url =  new  URL(urlStr);  
                 conn = (HttpURLConnection) url.openConnection();  
                 conn.setConnectTimeout( 5000 );  
                 conn.setReadTimeout( 30000 );  
                 conn.setDoOutput( true );  
                 conn.setDoInput( true );  
                 conn.setUseCaches( false );  
                 conn.setRequestMethod( "POST" );  
                 conn.setRequestProperty( "Connection" "Keep-Alive" );  
                 conn  
                         .setRequestProperty( "User-Agent" ,  
                                 "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)" );  
                 conn.setRequestProperty( "Content-Type" ,  
                         "multipart/form-data; boundary="  + BOUNDARY);  
       
                 OutputStream out =  new  DataOutputStream(conn.getOutputStream());  
                 // text  
                 if  (textMap !=  null ) {  
                     StringBuffer strBuf =  new  StringBuffer();  
                     Iterator<?> iter = textMap.entrySet().iterator();  
                     while  (iter.hasNext()) {  
                         Map.Entry entry = (Map.Entry) iter.next();  
                         String inputName = (String) entry.getKey();  
                         String inputValue = (String) entry.getValue();  
                         if  (inputValue ==  null ) {  
                             continue ;  
                         }  
                         strBuf.append( "\r\n" ).append( "--" ).append(BOUNDARY).append(  
                                 "\r\n" );  
                         strBuf.append( "Content-Disposition: form-data; name=\""  
                                 + inputName +  "\"\r\n\r\n" );  
                         strBuf.append(inputValue);  
                     }  
                     out.write(strBuf.toString().getBytes());  
                 }  
       
                 // file  
                 if  (fileMap !=  null ) {  
                     Iterator<?> iter = fileMap.entrySet().iterator();  
                     while  (iter.hasNext()) {  
                         Map.Entry entry = (Map.Entry) iter.next();  
                         String inputName = (String) entry.getKey();  
                         String inputValue = (String) entry.getValue();  
                         if  (inputValue ==  null ) {  
                             continue ;  
                         }  
                         File file =  new  File(inputValue);  
                         String filename = file.getName();  
                         String contentType =  new  MimetypesFileTypeMap()  
                                 .getContentType(file);  
                         if  (filename.endsWith( ".jpg" )) {  
                             contentType =  "image/jpg" ;  
                         }  
                         if  (contentType ==  null  || contentType.equals( "" )) {  
                             contentType =  "application/octet-stream" ;  
                         }  
       
                         StringBuffer strBuf =  new  StringBuffer();  
                         strBuf.append( "\r\n" ).append( "--" ).append(BOUNDARY).append(  
                                 "\r\n" );  
                         strBuf.append( "Content-Disposition: form-data; name=\""  
                                 + inputName +  "\"; filename=\""  + filename  
                                 "\"\r\n" );  
                         strBuf.append( "Content-Type:"  + contentType +  "\r\n\r\n" );  
       
                         out.write(strBuf.toString().getBytes());  
       
                         DataInputStream in =  new  DataInputStream(  
                                 new  FileInputStream(file));  
                         int  bytes =  0 ;  
                         byte [] bufferOut =  new  byte [ 1024 ];  
                         while  ((bytes = in.read(bufferOut)) != - 1 ) {  
                             out.write(bufferOut,  0 , bytes);  
                         }  
                         in.close();  
                     }  
                 }  
       
                 byte [] endData = ( "\r\n--"  + BOUNDARY +  "--\r\n" ).getBytes();  
                 out.write(endData);  
                 out.flush();  
                 out.close();  
       
                 // 读取返回数据  
                 StringBuffer strBuf =  new  StringBuffer();  
                 BufferedReader reader =  new  BufferedReader( new  InputStreamReader(  
                         conn.getInputStream()));  
                 String line =  null ;  
                 while  ((line = reader.readLine()) !=  null ) {  
                     strBuf.append(line).append( "\n" );  
                 }  
                 res = strBuf.toString();  
                 reader.close();  
                 reader =  null ;  
             catch  (Exception e) {  
                 System.out.println( "发送POST请求出错。"  + urlStr);  
                 e.printStackTrace();  
             finally  {  
                 if  (conn !=  null ) {  
                     conn.disconnect();  
                     conn =  null ;  
                 }  
             }  
             return  res;  
         }  
       
    }

    我们将工具类写好之后就需要在我们消息回复中加入对应的响应代码,这里为了测试我将响应代码加在【关注事件】中!

    (二)图片回复

    这里我们需要修改的是我们的【事件消息业务分发器】的代码,这里我们将我们的回复加在【关注事件】中,简单代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    String openid = map.get( "FromUserName" );  // 用户openid
    String mpid = map.get( "ToUserName" );  // 公众号原始ID
    ImageMessage imgmsg =  new  ImageMessage();
    imgmsg.setToUserName(openid);
    imgmsg.setFromUserName(mpid);
    imgmsg.setCreateTime( new  Date().getTime());
    imgmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_Image);
    if  (map.get( "Event" ).equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {  // 关注事件
         System.out.println( "==============这是关注事件!" );
         Image img =  new  Image();
         HttpPostUploadUtil util= new  HttpPostUploadUtil();
         String filepath= "H:\\1.jpg" ;  
         Map<String, String> textMap =  new  HashMap<String, String>();  
         textMap.put( "name" "testname" );  
         Map<String, String> fileMap =  new  HashMap<String, String>();  
         fileMap.put( "userfile" , filepath); 
         String mediaidrs = util.formUpload(textMap, fileMap);
         System.out.println(mediaidrs);
         String mediaid=JSONObject.fromObject(mediaidrs).getString( "media_id" );
         img.setMediaId(mediaid);
         imgmsg.setImage(img);
         return  MessageUtil.imageMessageToXml(imgmsg);
    }

    到这里代码基本就已经完成整个的图片消息回复的内容,同样的不论是语音回复、视频回复等流程都是一样的,所以其他的就不在做过多的讲述了,最后的大致效果如下:

    1.png

    正常的消息回复的内容我们就讲述的差不多了,下一篇我们讲述基于消息回复的一些应用【关键字回复及超链接回复】的实现,感谢你的翻阅,如有疑问可以留言讨论!

    展开全文
  • 常用多媒体传输协议简介

    千次阅读 2019-03-08 16:39:20
    实时消息传递协议(RTMP)最初是由Macromedia开发的专有协议,用于通过因特网在Flash播放器和服务器之间传输音频,视频和数据。Macromedia现在归Adobe所有,该公司已发布该协议规范的不完整版本供公众使用。 RTMP...

    RTMP

    实时消息传递协议(RTMP)最初是由Macromedia开发的专有协议,用于通过因特网在Flash播放器和服务器之间传输音频,视频和数据。Macromedia现在归Adobe所有,该公司已发布该协议规范的不完整版本供公众使用。

    RTMP协议有多种变体:
    “普通”协议,默认使用TCP端口号1935。
    RTMPS,它是通过TLS / SSL连接的RTMP 。
    RTMPE,使用Adobe自己的安全机制进行RTMP加密。虽然实现的细节是专有的,但该机制使用行业标准的加密原语。[1]
    RTMPT,封装在HTTP请求中以遍历防火墙。经常发现RTMPT利用TCP 端口 80和443 上的明文请求绕过大多数企业流量过滤。封装的会话可以携带普通的RTMP,RTMPS或RTMPE分组。
    RTMFP,它是通过UDP而不是TCP的RTMP,取代了RTMP Chunk Stream。安全实时媒体流协议套件由Adobe Systems开发,使最终用户能够直接相互连接和通信(P2P)。
    虽然RTMP的主要动机是作为播放Flash视频的协议,但它也用于其他一些应用程序,例如Adobe LiveCycle Data Services ES。

    RTMP是一种基于TCP的协议,可以维护持久连接并允许低延迟通信。为了顺利地传输流并传输尽可能多的信息,它将流分成片段,并且它们的大小在客户端和服务器之间动态协商。有时,它保持不变; 对于音频数据,默认片段大小为64字节,对于视频数据和大多数其他数据类型,默认片段大小为128字节。然后可以交织来自不同流的片段,并在单个连接上复用。对于较长的数据块,协议因此每个片段仅携带一个字节的头部,因此产生的开销非常小。然而,实际上,单个片段通常不是交错的。相反,交织和多路复用在分组级别完成,跨越若干不同活动信道的RTMP分组以这样的方式交织,以确保每个信道满足其带宽,等待时间和其他服务质量要求。以这种方式交织的分组被视为不可分割的,并且不在分段级别上交织。

    RTMP定义了几个可以在其上发送和接收分组的虚拟信道,并且它们彼此独立地操作。例如,存在用于处理RPC请求和响应的信道,用于视频流数据的信道,用于音频流数据的信道,用于带外控制消息的信道(片段大小协商等)等等。 。在典型的RTMP会话期间,在任何给定时间可以同时激活多个通道。当编码RTMP数据时,生成包头。除其他事项外,包头指定了发送它的信道的ID,生成它的时间戳(如果需要),以及包的有效载荷的大小。然后,此标头后跟数据包的实际有效内容,在通过连接发送之前,根据当前商定的片段大小进行分段。数据包标头本身从不分段,其大小不计入数据包第一个片段中的数据。换句话说,只有实际的数据包有效负载(媒体数据)会受到碎片的影响。

    在更高级别,RTMP封装MP3或AAC音频和FLV1视频多媒体流,并且可以使用动作消息格式进行远程过程调用(RPC)。所需的任何RPC服务都是使用单个客户端/服务器请求/响应模型异步进行的,因此不需要实时通信。
    在这里插入图片描述
    在这里插入图片描述

    RTP

    实时传输协议(RTP)是一种网络协议,用于在传送音频和视频IP网络。RTP用于涉及流媒体的通信和娱乐系统,例如电话,包括WebRTC的视频电话会议应用,电视服务和基于网络的即按即说功能。

    RTP通常在用户数据报协议(UDP)上运行。RTP与RTP控制协议(RTCP)结合使用。当RTP承载媒体流(例如,音频和视频)时,RTCP用于监视传输统计和服务质量(QoS)并帮助多个流的同步。RTP是IP语音的技术基础之一,并且在这种情况下通常与诸如会话发起协议(SIP)之类的信令协议结合使用,该协议建立跨网络的连接。

    RTP由互联网工程任务组(IETF)的音频 - 视频传输工作组开发,并于1996年首次发布为RFC 1889,于2003年被RFC 3550取代。

    RTP专为端到端,实时,流媒体传输而设计。该协议提供抖动补偿和丢包检测以及无序传送的功能,这些功能在IP网络上的UDP传输过程中尤为常见。RTP允许通过IP多播将数据传输到多个目的地。 RTP被视为IP网络中音频/视频传输的主要标准,并与相关的配置文件和有效载荷格式一起使用。 RTP的设计基于称为应用层框架的架构原理协议功能在应用程序中实现,而不是在操作系统的协议栈中实现。

    实时多媒体流应用程序需要及时传递信息,并且通常可以容忍一些数据包丢失以实现此目标。例如,音频应用中的分组丢失可能导致丢失一小部分音频数据,这可以通过适当的错误隐藏算法而变得不明显。[3]所述的传输控制协议(TCP),尽管标准化的RTP使用,[4]没有被正常在RTP应用中使用,因为TCP倾向于过度时效的可靠性。相反,大多数RTP实现都是基于用户数据报协议(UDP)构建的。专门为多媒体会话设计的其他传输协议是SCTP [5]和DCCP,但截至2012年,它们并未得到广泛使用。

    RTP由IETF标准组织的音频/视频传输工作组开发。RTP与其他协议(如H.323和RTSP)结合使用。[2] RTP规范描述了两种协议:RTP和RTCP。RTP用于传输多媒体数据,RTCP用于周期性地发送控制信息和QoS参数。

    数据传输协议RTP承载实时数据。该协议提供的信息包括时间戳(用于同步),序列号(用于分组丢失和重新排序检测)和有效载荷格式,其指示数据的编码格式。所述的控制协议,RTCP,用于媒体流之间的服务质量(QoS)的反馈和同步质量。与RTP相比,RTCP流量的带宽很小,通常约为5%。

    RTP会话通常使用信令协议在通信对等体之间发起,例如H.323,会话发起协议(SIP),RTSP或Jingle(XMPP)。这些协议可以使用会话描述协议来指定会话的参数。

    为每个多媒体流建立RTP会话。音频和视频流可以使用单独的RTP会话,使接收器能够选择性地接收特定流的组件。会话由目的地IP地址和一对RTP和RTCP端口组成。规范建议选择RTP端口号为偶数,并且每个关联的RTCP端口是下一个更高的奇数。但是,在复用协议的应用程序中,为RTP和RTCP选择单个端口。 RTP和RTCP通常使用非特权UDP端口(1024到65535),但也可能使用其他传输协议,最值得注意的是,SCTP和DCCP,因为协议设计是独立于传输的。

    在这里插入图片描述

    RTSP

    实时流协议(RTSP)是一种网络控制协议,专为娱乐和通信系统的使用,以控制流媒体 服务器。该协议用于建立和控制端点之间的媒体会话。媒体服务器的客户端发出VHS风格的命令,例如播放,录制和暂停,以便于实时控制从服务器到客户端(视频点播)或从客户端到服务器的媒体流(录音) 。

    流数据本身的传输不是RTSP的任务。大多数RTSP服务器将实时传输协议(RTP)与实时控制协议(RTCP)结合使用以进行媒体流传输。但是,一些供应商实施专有传输协议。例如,RealNetworks的RTSP服务器软件也使用了RealNetworks的专有实时数据传输(RDT)。

    RTSP由RealNetworks,Netscape 和哥伦比亚大学开发,第一份草案于1996年提交给IETF。[2]它由互联网工程任务组(IETF )的多方多媒体会话控制工作组(MMUSIC WG)标准化。并于1998年作为RFC 2326发布。RTSP 2.0 于2016年作为RFC 7826发布,作为RTSP 1.0的替代品。RTSP 2.0基于RTSP 1.0,但除了基本版本协商机制外,不向后兼容。

    虽然在某些方面类似于HTTP,但RTSP定义了用于控制多媒体回放的控制序列。虽然HTTP是无状态的,但RTSP具有状态; 在需要跟踪并发会话时使用标识符。与HTTP类似,RTSP使用TCP来维护端到端连接,并且虽然大多数RTSP控制消息由客户端发送到服务器,但是一些命令在另一个方向上传播(即从服务器到客户端)。

    SIP

    会话发起协议(SIP)是一种信令协议用于发起,维持和终止实时会话包括语音,视频和消息应用程序。[1] SIP用于信令和控制多媒体通信会话中的应用网络电话的语音和视频通话,在私有IP电话系统,在即时通讯上的互联网协议(IP)网络以及手机拨打了LTE(VoLTE的)。

    该协议定义了交换的消息的特定格式以及参与者合作的通信顺序。SIP是一种基于文本的协议,包含超文本传输​​协议(HTTP)和简单邮件传输协议(SMTP)的许多元素。[2]使用SIP建立的呼叫可以由多个媒体流组成,但是在SIP消息中作为有效载荷交换数据的应用(例如文本消息)不需要单独的流。

    SIP与指定和携带会话媒体的其他几种协议一起工作。最常见的是,媒体类型和参数协商以及媒体设置使用会话描述协议(SDP)来执行,该协议作为SIP消息中的有效载荷来承载。SIP被设计为独立于基础的传输层的协议,并且可与使用用户数据报协议(UDP),所述传输控制协议(TCP),和流控制传输协议(SCTP)。为了在不安全的网络链路上安全地传输SIP消息,可以使用传输层安全性来加密协议(TLS)。对于媒体流(语音,视频)的传输,SIP消息中携带的SDP有效载荷通常采用实时传输协议(RTP)或安全实时传输协议(SRTP)。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 多媒体技术期末复习资料

    千次阅读 2019-01-11 22:02:32
    采用具有自主知识产权的移动多媒体广播电视技术,系统可运营、可维护、可管理,具备广播式、双向式服务功能,可根据运营要求逐步扩展。 支持中央和地方相结合的运营体系,具备加密授权控制管理体系,支持统一标准...

    流媒体:流媒体(streaming media)是指将一连串的媒体数据压缩后,经过网络分段发送数据,在网络上即时传输影音以供观赏的一种技术与过程,此技术使得数据报文得以像流水一样发送;如果不使用此技术,就必须在使用前下载整个媒体文件。流媒体文件一般定义在bit层次结构,因此流数据包并不一定必须按照字节对齐,虽然通常的媒体文件都是按照这种字节对齐的方式打包的。流媒体的三大操作平台是微软公司RealNetworks苹果公司提供的

     

    MPEG-2MPEG工作组于1994年发布的视频音频压缩国际标准。MPEG-2通常用来为广播信号提供视频和音频编码,包括卫星电视有线电视等。MPEG-2经过少量修改后,也成为DVD产品的核心技术。MPEG-2图像压缩的原理是利用了图像中的两种特性:空间相关性和时间相关性。这两种相关性使得图像中存在大量的冗余信息。如果我们能将这些冗余信息去除,只保留少量非相关信息进行传输,就可以大大节省传输频带。而接收机利用这些非相关信息,按照一定的解码算法,可以在保证一定的图像质量的前提下恢复原始图像。

    MPEG-4是一套用于音频视频信息的压缩编码标准,MPEG-4格式的主要用途在于网络上光盘、语音发送(视频电话),以及电视广播。而MPEG-4比MPEG-2更先进的其中一个特点,就是不再使用宏区块做视频分析,而是以视频上个体为变化记录,因此尽管视频变化速度很快、码率不足时,也不会出现方块画面。

     

     

    SIP协议,英文为 Session Initiation Protocol,  中文翻译为会话发起协议。顾名思义,就是在网络上发起会话。协议(Protocol)是计算机与计算机之间的语言。SIP协议的目的就是在IP网络中实现电话功能。在IP网络中,通话两端的不是电话机,而是运行在计算机上的软件电话(软电话)。同传统电话,用SIP协议打一个电话,过程是一样的。两个软电话之间,也有电话号码,也需传递信号。这时的电话号码是SIP帐号。这时的信号不是一个电磁波信号,而是一个IP数据包(称为SIP消息)。

     

    虚拟现实(英语:virtual reality,缩写VR),简称虚拟技术,也称虚拟环境,是利用计算机模拟产生一个三维空间的虚拟世界,提供用户关于视觉等感官的模拟,让用户感觉仿佛身历其境,可以即时、没有限制地观察三维空间内的事物。用户进行位置移动时,计算机可以立即进行复杂的运算,将精确的三维世界视频传回产生临场感。该技术集成了计算机图形、计算机仿真、人工智能、感应、显示及网络并行处理等技术的最新发展成果,是一种由计算机技术辅助生成的高技术模拟系统。

     

    增强现实Augmented Reality,简称AR),也有对应VR虚拟实境一词的翻译称为实拟虚境扩张现实,是指透过摄影机视频的位置角度精算并加上图像分析技术,让显示屏上的虚拟世界能够与现实世界场景进行结合与交互的技术。这种技术于1990年提出。随着随身电子产品运算能力的提升,增强现实的用途也越来越广。

     

    所谓实时就是在人的感官系统允许的情况下, 进行多媒体交互, 就好像面对面(Face To Face)一样, 图像和声音都是连续的。实时多媒体分布系统是把计算机的交互性、通信的分布性和电视的真实性有机地结合在一起。

     

     

    1. 空间冗余:图像内部相邻像素之间存在较强的相关性多造成的冗余。
    2. 时间冗余:视频图像序列中的不同帧之间的相关性所造成的冗余。

     

    多媒体数据库相对传统数据库,区别在于存储的内容更加丰富,但是这些视频、音频、图像的数据库操作用传统的字符匹配操作方法是不适用的。数据量巨大且媒体之间量的差异十分明显,而使得数据在库中的组织方法和存储方法复杂。媒体的复合、分散、时序性质及其形象化的特点,使得查询不再只是通过字符查询,查询的结果也不仅是一张表,而是多媒体的一组“表现”。接口的多媒体化将对查询提出更复杂、更友好的设计要求。

     

     

    • 便携式移动设备得到越来越广泛的应用,结合学到的知识和自身的体验,请论述移动设备上开发UI需要注意的方面有哪些?
    1. 文字、图标之间风格的统一性。
    2. 适当的留白空间。无论是文字部分的行间距与字间距,还是各内容版块之间的混排距离都要适当留出间隙。不要将界面设计得太满。
    3. 巧用渐变色和阴影优化界面视觉效果。渐变色和阴影的处理将在一定程度上增加界面交互菜单的立体感,从而使整个界面变得更加高级。
    4. 让用户在体验瞬间感受到人性化的设计,提高可用性和互动性。
    5. 注意要对用户操作作适当反馈。如:让用户了解当前状态、位置、 是否成功、进度如何、减少用户不确定性。
    6. 一致性和标准化。设计者应遵循一致性原则,统一标准能确保用户理解各个元素在设计中,并且知道去哪里寻找哪些功能。
    7. 让用户选择而不是输入。自动读取、记录信息、减少操作路径。

     

     

     

     

     

     

     

    • 移动端增强现实特点和应用前景。

    移动增强现实技术除了要具备传统增强现实的虚实结合、 实时交互和三维注册的特点外, 还需要具备较高的自由移动性, 不会因为环境因素而只能固定在一个较小范围内活动。前景:可应用于旅游、教学、游戏、导航、科研勘探等方面。如:穿戴设备、Vyking - 人体扫描技术,洛天依 - 全息投影虚拟人物演唱会,Meta - 通过手和物体的距离和景深做虚拟物体的自然抓取、信息可视化下的内容平台、treetmuseum 是伦敦博物馆出的一个AR应用, 实现了时间回溯等。

     

     

    • 在多媒体数字视频中,影响视频图像质量的因素有哪些:

    比特率,分辨率,编码类型,帧速,原图像质量。。。光照强度,光照方向,目标距离,焦距,采样率,曝光时间和增益,暗漏电流, 像素密度,分辨率(像素数量)

     

    • 移动设备软件开发和传统计算机软件开发有什么不同?

    1.android中java可以加载c/c++编写的so库文件,web中不可以;web中只能将c/c++翻译成wasm文件,然后进行调用。(分析:web中之所以不能加载so文件的原因应该是浏览器不能直接操作文件系统)

    2.android是c/s架构,web是b/s架构

    android的市场机会已经结束了之前的井喷期,进入了存量阶段。市场的整体需求,尤其是对初级人才的需求已经饱和。Web开发需求方向未艾。

     

    • 5G网络的核心技术是什么,将对移动端多媒体技术产生什么影响?
    1. 5G将采用512-QAM或1024-QAM更高的数据压缩密度调制/解调制器,当前4G使用256-QAM或64-QAM的调制以压缩传输数据,因此频谱效率每Mbps/100MHz的利用效率更高提高更多传输速率。
    2. 5G将采用28GHz毫米波通信,比如当前4G使用700MHz、900MHz、1800Mhz、2600Mhz等低频段,虽然电波衍射能力比较高但是在低频上频谱资源就却相当有限,在高频的毫米波大多是军用战斗机雷达或测速照相等少数设备,频谱宽度更高,而且更容易找到连续频谱,使空白频谱非常容易获取。
    3. 波束指向配合多输入多输出(Multi-input Multi-output ; MIMO)相控数组天线,MIMO多输入多输出利用电磁波的空分复用和路径不同多天线系统提高传输速率,类似在军用领域的技术将延伸出的商用技术版本
    4. 波束自适应和波束成形,能够提高特定方向的波瓣优化传输距离[3]
    5. 新材料将使用GaN氮化镓或是GaAs砷化镓材料的RF射频天线和功率放大器,此材料的RF射频天线能在更高的频段有更高的能源效率,设备会比较省电。
    6. 为了适应工业物联网、无人驾驶汽车、商用无人机等新技术的应用,网络延迟时间将降低到1毫秒以下[7]

     

    影响:对移动多媒体硬件要求增加,万物互联时代到来,5G+8K超高清视频,推动VR技术落地,VR高清直播。5G时代的到来,将VR、AR技术与物联网的M2M(Machine-tO-Machine)技术结合,结合人工智能和信息融合技术,将会引爆下一轮产业革新。

     

    • CMMB(中国移动多媒体广播)特点是什么,采用了哪些相关的技术?
    1. 可提供数字广播电视节目、综合信息和紧急广播服务,实现卫星传输与地面网络相结合的无缝协同覆盖,支持公共服务。
    2. 支持手机、PDA、MP3、MP4、数码相机、笔记本电脑以及在汽车、火车、轮船、飞机上的小型接收终端,接收视频、音频、数据等多媒体业务。
    3. 采用具有自主知识产权的移动多媒体广播电视技术,系统可运营、可维护、可管理,具备广播式、双向式服务功能,可根据运营要求逐步扩展。
    4. 支持中央和地方相结合的运营体系,具备加密授权控制管理体系,支持统一标准和统一运营,支持用户全国漫游。
    5. 系统安全可靠,具有安全防范能力,具有良好的可扩展性,能够适应移动多媒体广播电视技术和业务的发展要求。
    1. 采用卫星和地面网络相结合的方式实现“天地一体”协同覆盖,信道传输采用STiMi技术。
    2. 全国节目通过S波段卫星对全国实现覆盖,卫星遮挡地区可采取地面同频增补方式,在城市人口密集区域采用U波段增补。
    3. 地方节目采用U波段地面网络实现覆盖。
    4. 电视业务视频压缩编码采用AVS、H.264/AVC,伴音压缩编码采用MPEG-4 HE AAC;广播业务音频压缩编码采用DRA。
    5. 数据广播采用可扩展的多协议封装复用传输,支持流模式、文件模式传输。
    6. 加密授权系统对音视频流和数据广播流采用ISMACryp进行加扰,系统前端支持同密,终端采用多密,系统支持单向、双向和基于电子钱包的授权管理方式。
    7. 运营支撑系统原则上采用两级架构体系,对内容统一加密,统一管理,支持公共服务、基本服务和扩展服务,实现各类终端用户的合法注册。

     

    展开全文
  • 而点对多点的多播业务目前只能开展文本格式的短消息服务,不能满足音视频和数据等多样化服务的需求。  3GPP在R6版本中引入了多媒体广播组播业务功能——MBMS,其目的是为了支持广播业务,在同一时间为了多用户提供...
  • 多媒体复习资料

    千次阅读 2020-01-20 09:39:11
    多媒体技术复习要点 1.根据CCITT定义,多媒体有哪几种类型? 1). 感觉媒体:直接作用于人的感官 ,使人直接产生感觉。 2). 表示媒体:是为了加工、处理和传输感觉媒体而人为构造出来的一种媒体 ,即各种编码。 3). ...
  • 包括屏幕广播与点播、屏幕监视、遥控辅导、屏幕录制、屏幕回放、网络考试、网上语音广播、两人...消息、电子举手、锁定学生机的键盘和鼠标、远程开关机和重启、学生机同步升级服务、远程安装、倒计时、班级和学生管理等...
  • 多媒体技术与应用》知识点整理

    千次阅读 2021-01-08 13:46:14
    第一章 多媒体技术概述 多媒体是指信息表示媒体的多样化,常见的多媒体有文字、图形、图像、声音、音乐、视频、动画 等多种形式。 多媒体技术是利用计算机技术把文本、声音、视频、动画、图形和图像等多种媒体进行...
  • 多媒体编程

    千次阅读 2016-07-11 14:10:26
    多媒体编程 文字、图片、音频、视频(这里仅仅对银频和视频详解) 音频播放器创建方法方式一、 MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1); mediaPlayer.start(); // no need to ...
  • 配置微信公众号当普通微信用户向公众号发送消息或者与微信公众号进行互动触发某些事件时,微信服务器将会把这些消息或者事件以XML数据包格式POST到开发者在微信公众号管理平台中配置的服务器地址URL上。
  • Windows多媒体开发框架介绍

    千次阅读 2019-01-27 15:55:21
    Windows 多媒体开发框架介绍欢迎来到 Windows 的多媒体开发世界2D 图形 API1. [GDI](https://docs.microsoft.com/en-us/windows/desktop/gdi/windows-gdi)2. [GDI+]...
  • ...公众号可调用本接口来上传图片、语音、视频等文件到微信服务器,上传后服务器会返回对应的media_id,公众号此后可根据该media_id来获取多媒体。请注意,media_id是可复用的,调用该接口需http
  • 包括屏幕教学演示与示范、屏幕监视、遥控辅导、黑屏肃静、屏幕录制、屏幕...消息、电子举手、获取远端信息、获取学生机打开的程序和进程信息、学生上线情况即时监测、锁定学生机的键盘和鼠标、远程开关机和重启、学生机...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,192
精华内容 14,876
关键字:

多媒体消息服务