精华内容
下载资源
问答
  • 媒体的业务特征和TCP,UDP各种特点,UDP在媒体传输方面具有很大优越性,但UDP可靠性需要业务开发这投入大量的人力;相反 tcp 技术成熟,可以复用已稳定的http 服务器技术,不需要投入人力和技术解决可靠性问题,...

    一、引言

    从流媒体的业务特征和TCP,UDP各种特点,UDP在媒体传输方面具有很大优越性,但UDP可靠性需要业务开发这投入大量的人力;相反 tcp 技术成熟,可以复用已稳定的http 服务器技术,不需要投入人力和技术解决可靠性问题,成熟,开发简单,拿来即用。故TCP在传统的流媒体协议还是广泛存在。但实际的网络拥塞,带宽不足,信号衰减会造成tcp 传输的音视频体验很糟糕。对稳定性,实时性,抗弱网抖动性的要求高的场景,UDP媒体传输技术正在崛起。

                                     

     

    二、UDP传输常见使用场景:

    1)视频监控

    在视频监控场景,无论是RTSP,还是gb28181,媒体都是UDP承载(也存在通过TCP承载RTSP封装RTP媒体流,但这种用法不多,不符合国标用法和通用做法)

    2)IPTV电视

    在IPTV中,无法是点播还是直播,都是UDP承载电视节目码流。

    3)会议电视

       在传统的会议电视,信令协议从h323过度到主流的sip,但媒体承载还是UDP封装的RTP流

    4)音视频通话

    无论是传统的VoIP还是目前互联网上流行的webrtc,也都是UDP承载的RTP码流

    三、可靠性的UDP传输方案

    既然udp是音视频传输的理想方案,但udp可靠性工作需要投入大量工作,技术门槛高,小团队几乎望而却步。那有没有一种可用的开源技术即具备tcp的可靠性,又具备udp的低延迟性?答案是肯定的。类似的sctp,quic,kcp的可靠UDP传输方法某些大厂开始引入媒体传输中,下面介绍几种目前比较流行的可靠UDP技术。

    1)UDT(UDP-based Data Transfer Protocol)

     UDT的主要目的是支持高速广域网上的海量数据传输,所以除了在UDP之上实现类似TCP的协议和算法之外,UDT还对TCP的拥塞算法做了一些细节上的调整,包括Negative-ACK(NAK)、ACK to ACK(ACK2)、基于对数的动态AIMD等。不过UDT的重传效率较低,无效报文,实际效果并不理想。

    参考实现:https://git.dorkbox.com/dorkbox/UDT/src/branch/master/src

    2)KCP

    KCP是一个很简单的ARQ的实现,包括选择重传和快重传等机制,对上层提供一个可靠的字节流。应用层可以使用多流复用的框架来实现对多个流的支持。另外,KCP增加了可配置启用的加密和FEC选项,FEC用的是Reed-Solomon纠删码,例如可以配置发送10%的冗余数据,来减少丢包时需要的重传,从而降低数据传输的延时。

    参考实现:https://github.com/skywind3000/kcp

    3)QUIC

    QUIC是Google实现的一种可靠UDP传输协议,并且已经被选择作为HTTP/3的基础。它的特点有:

    a)内建安全性,集成TLS

    b)连接建立过程和TLS协商过程合并,减少往返请求次数,提高连接速度

    c)集成多种拥塞算法,包括最新的BBR

    d)多流支持,每个流有独立的拥塞控制,避免单个流中的丢包阻塞其它所有流(Head-of-line Blocking问题),更好的支持类似HTTP/2中的乱序请求

    e)连接迁移:QUIC可以通过连接ID来唯一标识一个连接,当用户在有线、无线、移动网络之间切换时,可以保持上层连接的有效性,不需要再进行重连。

    另外,早期的QUIC还使用了一种基于异或的FEC算法,不过在新版本中已经去掉。该协议已经在chromium中实现,参考获取方法:https://www.chromium.org/quic/playing-with-quic

    4)uTP

    uTP是BitTorrent中新增加的一种UDP传输协议,主要特点是使用了LEDBAT(Low Extra Delay Background Transport)拥塞算法。这种算法基于延时来检测网络拥塞,可以更早的探测到拥塞和更早的以及更大幅度的进行避让,从而避免影响用户上网操作的进行,保持后台下载跟前台操作的和平共处。

    参考实现:https://github.com/bittorrent/libutp

    5)SCTP(Stream Control Transmission Protocol,流控制传输协议)

    准确的说,SCTP不是一种可靠UDP协议,而是一种跟TCP/UDP平级的传输层协议,是IETF在2000年指定的标准协议。目前Linux和部分UNIX已经集成,Windows和Mac需要使用第三方包来实现。SCTP最初主要用于电信系统,它的特点有:

    a)跟TCP一样面向连接,提供可靠传输

    b)跟UDP一样面向消息

    c)多流支持

    d)每个流可以配置成接受有序或无序的消息

    e)Multi-Homing:可以配置多个地址,利用多条网络传输通道

    f)更好的安全性:要求四次握手,避免TCP的SYN Flooding攻击

    注意webrtc的sctp不是跟tcp和UDP平级的传输层协议,它是基于UDP的开发实现,详见webrtc代码或https://github.com/sctplab/usrsctp

    参考:https://zhuanlan.zhihu.com/p/68466363

    四、总结

    以上基于UDP的可靠性传输技术在某些领域已经有成功的应用案例。在音视频传输领域可以根据业务需求,移植过来替换已有协议底层的TCP或UDP接口,改善传输性能。更多更详细信息请关注微信公众号:AV_Chat

    展开全文
  • netty系列之:基于的数据传输

    千次阅读 2021-08-10 09:35:27
    我们知道由两种数据的传输方式,分别是字符和字节,字符的意思是传输的对象就是字符串,格式已经被设置好了,发送方和接收方按照特定的格式去读取就行了,而字节是指将数据作为最原始的二进制字节来进行传输...

    简介

    我们知道由两种数据的传输方式,分别是字符流和字节流,字符流的意思是传输的对象就是字符串,格式已经被设置好了,发送方和接收方按照特定的格式去读取就行了,而字节流是指将数据作为最原始的二进制字节来进行传输。

    今天给大家介绍一下在netty中的基于流的数据传输。

    package和byte

    熟悉TCP/IP协议的同学应该知道,在TCP/IP中,因为底层协议有支持的数据包的最大值,所以对于大数据传输来说,需要对数据进行拆分和封包处理,并将这些拆分组装过的包进行发送,最后在接收方对这些包进行组合。在各个包中有固定的结构,所以接收方可以很清楚的知道到底应该组合多少个包作为最终的结果。

    那么对于netty来说,channel中传输的是ByteBuf,实际上最最最底层的就是byte数组。对于这种byte数组来说,接收方并不知道到底应该组合多少个byte来合成原来的消息,所以需要在接收端对收到的byte进行组合,从而生成最终的数据。

    那么对于netty中的byte数据流应该怎么组合呢?我们接下来看两种组合方法。

    手动组合

    这种组合的方式的基本思路是构造一个目标大小的ByteBuf,然后将接收到的byte通过调用ByteBuf的writeBytes方法写入到ByteBuf中。最后从ByteBuf中读取对应的数据。

    比如我们想从服务端发送一个int数字给客户端,一般来说int是32bits,然后一个byte是8bits,那么一个int就需要4个bytes组成。

    在server端,可以建立一个byte的数组,数组中包含4个元素。将4个元素的byte发送给客户端,那么客户端该如何处理呢?

    首先我们需要建立一个clientHander,这个handler应该继承ChannelInboundHandlerAdapter,并且在其handler被添加到ChannelPipeline的时候初始化一个包含4个byte的byteBuf。

    handler被添加的时候会触发一个handlerAdded事件,所以我们可以这样写:

        private ByteBuf buf;
        
        @Override
        public void handlerAdded(ChannelHandlerContext ctx) {
            //创建一个4个byte的缓冲器
            buf = ctx.alloc().buffer(4); 
        }
    

    上例中,我们从ctx分配了一个4个字节的缓冲器,并将其赋值给handler中的私有变量buf。

    当handler执行完毕,从ChannelPipeline中删除的时候,会触发handlerRemoved事件,在这个事件中,我们可以对分配的Bytebuf进行清理,通常来说,可以调用其release方法,如下所示:

        public void handlerRemoved(ChannelHandlerContext ctx) {
            buf.release(); // 释放buf
            buf = null;
        }
    

    然后最关键的一步就是从channel中读取byte并将其放到4个字节的byteBuf中。在之前的文章中我们提到了,可以在channelRead方法中,处理消息读取的逻辑。

        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            ByteBuf m = (ByteBuf) msg;
            buf.writeBytes(m); // 写入一个byte
            m.release();
            
            if (buf.readableBytes() >= 4) { // 已经凑够4个byte,将4个byte组合称为一个int
                long result = buf.readUnsignedInt();
                ctx.close();
            }
        }
    

    每次触发channelRead方法,都会将读取到的一个字节的byte通过调用writeBytes方法写入buf中。当buf的可读byte大于等于4个的时候就说明4个字节已经读满了,可以对其进行操作了。

    这里我们将4个字节组合成一个unsignedInt,并使用readUnsignedInt方法从buf中读取出来组合称为一个int数字。

    上面的例子虽然可以解决4个字节的byte问题,但是如果数据结构再负责一点,上面的方式就会力不从心,需要考虑太多的数据组合问题。接下来我们看另外一种方式。

    Byte的转换类

    netty提供了一个ByteToMessageDecoder的转换类,可以方便的对Byte转换为其他的类型。

    我们只需要重新其中的decode方法,就可以实现对ByteBuf的转换:

           public class SquareDecoder extends ByteToMessageDecoder {
                @Override
               public void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)
                       throws Exception {
                   out.add(in.readBytes(in.readableBytes()));
               }
           }
    

    上面的例子将byte从input转换到output中,当然,你还可以在上面的方法中进行格式转换,如下所示:

    public class TimeDecoder extends ByteToMessageDecoder { 
        @Override
        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { 
            if (in.readableBytes() < 4) {
                return; 
            }
            
            out.add(in.readBytes(4)); 
        }
    }
    

    上面的例子会先判断in中是否有4个byte,如果有就将其读出来放到out中去。那么有同学会问了,输入不是一个byte一个byte来的吗?为什么这里可以一次读取到4个byte?这是因为ByteToMessageDecoder内置了一个缓存装置,所以这里的in实际上是一个缓存集合。

    ReplayingDecoder

    netty还提供了一个更简单的转换ReplayingDecoder,如果使用ReplayingDecoder重新上面的逻辑就是这样的:

    public class TimeDecoder extends ReplayingDecoder<Void> {
        @Override
        protected void decode(
                ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
            out.add(in.readBytes(4));
        }
    }
    

    只需要一行代码即可。

    事实上ReplayingDecoder 是ByteToMessageDecoder 的子类,是在ByteToMessageDecoder上丰富了一些功能的结果。

    他们两的区别在于ByteToMessageDecoder 还需要通过调用readableBytes来判断是否有足够的可以读byte,而使用ReplayingDecoder直接读取即可,它假设的是所有的bytes都已经接受成功了。

    比如下面使用ByteToMessageDecoder的代码:

       public class IntegerHeaderFrameDecoder extends ByteToMessageDecoder {
      
          @Override
         protected void decode(ChannelHandlerContext ctx,
                                 ByteBuf buf, List<Object> out) throws Exception {
      
           if (buf.readableBytes() < 4) {
              return;
           }
      
           buf.markReaderIndex();
           int length = buf.readInt();
      
           if (buf.readableBytes() < length) {
              buf.resetReaderIndex();
              return;
           }
      
           out.add(buf.readBytes(length));
         }
       }
       
    

    上例假设在byte的头部是一个int大小的数组,代表着byte数组的长度,需要先读取int值,然后再根据int值来读取对应的byte数据。

    和下面的代码是等价的:

       public class IntegerHeaderFrameDecoder
            extends ReplayingDecoder<Void> {
      
         protected void decode(ChannelHandlerContext ctx,
                                 ByteBuf buf, List<Object> out) throws Exception {
      
           out.add(buf.readBytes(buf.readInt()));
         }
       }
       
    

    上面代码少了判断的步骤。

    那么这是怎么实现的呢?

    事实上ReplayingDecoder 会传递一个会抛出 Error的 ByteBuf , 当 ByteBuf 读取的byte个数不满足要求的时候,会抛出异常,当ReplayingDecoder 捕获到这个异常之后,会重置buffer的readerIndex到最初的状态,然后等待后续的数据进来,然后再次调用decode方法。

    所以,ReplayingDecoder的效率会比较低,为了解决这个问题,netty提供了checkpoint() 方法。这是一个保存点,当报错的时候,可以不会退到最初的状态,而是回退到checkpoint() 调用时候保存的状态,从而可以减少不必要的浪费。

    总结

    本文介绍了在netty中进行stream操作和变换的几种方式,希望大家能够喜欢。

    本文已收录于 http://www.flydean.com/07-netty-stream-based-transport/

    最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

    欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

    展开全文
  • 在程序中所有的数据都是以的方式进行传输或保存的,程序需要数据的时候要使用输入读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出完成。程序中的输入输出都是以的形式...

    一、二进制、字节、字符流概念

    字(Byte)节是长度单位。位(bit)也是长度单位。

    计算机通信和存储的时候都是以010101这样的二进制数据为基础的

    二进制数有两个特点:它由两个基本字符0,1组成,二进制数运算规律是逢二进一。

    在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。

    程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。

    在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)

    java中提供了专用于输入输出功能的包Java.io,其中包括:

    InputStream,OutputStream,Reader,Writer

    InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象,

    Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串.

    字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点

    所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列

    字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以

    字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的 但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。

    二、HTTP协议数据传输

    通常上的理解,http协议中请求、相应都是以ascii字符方式传输,如果要传输二进制需要经过BASE64或MIME等编码(因为HTTP协议pop3、smtp邮件协议都是针对文本的,而FTP支持传输二进制数据,即不需要经过编码转换成字符型数据)

    如果直接使用http传输二进制(不经过base64编码),可能会造成一下问题:

    1) 不知道传输字节的具体长度,如传输的int类型,将int类型之间转为char以后,丢失掉了长度的信息,如数字1234567,本来只有4个字节,但是转化成文本的“1234567”是有7个字节。在int类型的时候固然好办,但是一个数组的时候,经过转化以后,在转化回来就很麻烦了。

    2) 对于一些数字,二进制传输Server是没法处理的。如int 1,二进制数据是0x00000001,按字节传输的时候,client能够正常发送,但是libevent收到以后,在抛给libevent_http层是,会把数据截断,前两位0x00是字符串的停止符。

    HTTP请求头和响应头都是以ASCII文本方式传输的,但是传输内容(请求响应体)可能是多种形式的。接收方处理数据时是根据请求头/响应头中的content-type属性来处理的。 Content-Type:image/gif 这说明传输的是一个image对象(二进制数据),该对象为gif格式,Content-length:91 这说明传输的数据大小为91个字节,响应头若没有Transfer-Encoding这个字段,说明传输的数据没有经过任何形式的编码转换,传输的就是源文件的内容。

    展开全文
  • 第23章 媒体服务器架设媒体技术也称为流式传输技术,是指在网络上按时间先后次序传输和播放的连续音、视频数据。随着网络速度的提高,以媒体技术为核心的视频点播、在线电视、远程培训等业务开展得越来越...

    第23章  流媒体服务器架设

    流媒体技术也称为流式传输技术,是指在网络上按时间先后次序传输和播放的连续音、视频数据流。随着网络速度的提高,以流媒体技术为核心的视频点播、在线电视、远程培训等业务开展得越来越广泛。本章主要介绍流媒体技术的基础知识、流媒体服务器的安装、运行、配置和使用等内容。

    23.1  流媒体技术基础

    流媒体是指利用流式传输技术传送的音频、视频等连续媒体数据,它的核心是串流(Streaming)技术和数据压缩技术,具有连续性、实时性、时序性3个特点,可以使用顺序流式传输和实时流式传输两种传输方式。本节主要介绍有关流媒体的技术基础。

    23.1.1  流媒体传输的基本原理

    实现流式传输需要使用缓存机制。因为音频或视频数据在网络中是以包的形式传输的,而网络是动态变化的,各个数据包选择的路由可能不尽相同,到达客户端所需的时间也就不一样,有可能会出现先发的数据包却后到。因此,客户端如果按照包到达的次序播放数据,必然会得到不正确的结果。使用缓存机制就可以解决这个问题,客户端收到数据包后先缓存起来,播放器再从缓存中按次序读取数据。

    使用缓存机制还可以解决停顿问题。网络由于某种原因经常会有一些突发流量,此时会造成暂时的拥塞,使流数据不能实时到达客户端,客户端的播放就会出现停顿。如果采用了缓存机制,暂时的网络阻塞并不会影响播放效果,因为播放器可以读取以前缓存的数据。等网络正常后,新的流数据将会继续添加到缓存中。

    虽然音频或视频等流数据容量非常大,但播放流数据时所需的缓存容量并不需要很大,因为缓存可以使用环形链表结构来存储数据,已经播放的内容可以马上丢弃,缓存可以腾出空间用于存放后续尚未播放的内容。

    当传输流数据时,需要使用合适的传输协议。TCP虽然是一种可靠的传输协议,但由于需要的开销较多,并不适合传输实时性要求很高的流数据。因此,在实际的流式传输方案中,TCP协议一般用来传输控制信息,而实时的音视频数据则是用效率更高的RTP/UDP等协议来传输。流媒体传输的基本原理如图23-1所示。

    在图23-1中,Web服务器只是为用户提供了使用流媒体的操作界面。客户机上的用户在浏览器中选中播放某***媒体资源后,Web服务器把有关这一资源的流媒体服务器地址、资源路径及编码类型等信息提供给客户端,于是客户端就启动了流媒体播放器,与流媒体服务器进行连接。

    e2dca1e3a90c3fd540dfa42527e5cac4.png

    (点击查看大图)图23-1  流媒体传输原理

    客户端的流媒体播放器与流媒体服务器之间交换控制信息时使用的是RTSP协议,它是基于TCP协议的一种应用层协议,默认使用的是554端口。RTSP协议提供了有关流媒体播放、快进、快倒、暂停及录制等操作的命令和方法。通过RTSP协议,客户端向服务器提出了播放某***媒体资源的请求,服务器响应了这个请求后,就可以把流媒体数据传输给客户端了。

    需要注意的是,RTSP协议并不具备传输流媒体数据的功能,承担流媒体数据传输任务的是另一种基于UDP的RTP协议,但在RTP协议传输流媒体数据的过程中,RTSP连接是一直存在的,并且控制着流媒体数据的传输。一旦流媒体数据到达了客户端,流媒体播放器就可以播放输出了。流媒体的数据和控制信息使用不同的协议和连接时,还可以带来一个好处,就是播放流媒体的客户机和控制流媒体播放的客户机可以是不同的计算机。

    点赞 0

    展开全文
  • 实时摄像头流传输(直播)

    千次阅读 2021-11-23 14:28:39
    主要是给自己这两周折腾的东西收尾一下,踩了很坑,比如用ffmpeg推、自己配置nginx-rtmp环境等,没必要而且很容易出错。 前提知识 需要学习docker的简单使用,b站狂神,质量非常高。(别看写的java,我是...
  • 可以,流流的填凭证制记账。按照的有下列应采用红字更正法更正。传输本”的结的结下列同账户账户构与构相“实收资。的收括(企业入包,数据的规定号—业会则第计准《企根据入》—收。下列中各类错账,不同的错应...
  • 关于媒体传输协议,涉及到不同领域,不同业务场景,种类众多,下面一张图是目前常见的媒体协议。 常见的媒体传输协议 1)从交互方式来看,媒体分为点播(VOD)和直播(LIVE) 直播(LIVE):HLS,RTMP,...
  • 一、TS概述 ES(Elementary Stream,基本):数字...PS (Program Stream,节目):将一个节目的个组成部分按照它们之间的互相关系进行组织并加入各组成部分关系描述后的码。PS是一种路复用数字音频、视
  • 如何用它实现传送视频数据呢?Flask应用拥有这样一种能力,以分割成小数据块的方式,高效地为大型请求提供数据。什么是媒体?媒体是一种技术,其中,服务器以数据块的形式响应请求。我能想到一个原因来解释为...
  • Dubbo协议默认是单连接模型,个请求用同一个连接(一个provider的所有请求都是用一个TCP连接,默认使用Netty传输),即个consumer对应一个provider,这些consumer排队等待使用provider,当一个consumer占用过多...
  • 媒体:媒体是指利用流式传输技术传送的视、音频等连续媒体数据,其核心是“”技术和数据压缩技术,具有连续性、实时性、时序性等3个主要特点,可以使用顺序流式传输和实时流式传输等两种传输方式传输媒体...
  • grpc服务实现传输文件及源码解析

    千次阅读 2021-02-23 09:59:57
    二、简单的grpc接口三、服务接口四、服务原理五、总结六、参考资料七、下载 前言 由于需要传送200M的压缩包文件,之前的同步存根Stub无法满足需求。再经过调研后,发现客户端能够很好的解决这个问题。 注:...
  • 前言:本文来自论文《基于RTMP协议的媒体技术的原理与应用》,文中研究了基于 Flash平台的媒体系统中使用的RTMP 协议的原理和应用,并对网络上实时媒体的各种传输方式的优缺点进行了分析。然后,重点分析了基于...
  • 使用树莓派专用摄像头实现rtsp传输,并调用Opencv显示 树莓派>——树莓派通过csi摄像头实时传输rtsp 树莓派CSI/USB摄像头使用mjpg实现网页摄像头监控 Liunx树莓派(ARM)开发篇—基于mjpg-streamer的摄像头...
  • 我正在寻找一种方法,将网络摄像头的数据从浏览器传输到网络服务器。使用getUserMedia获取网络摄像头数据。一个常见的选择似乎是使用画布和计时器来向服务器发送屏幕截图,但我想要一个合适的视频。WEBRTC似乎是另...
  • kafka(传输数据

    千次阅读 2020-12-28 23:20:29
    %d offset:%d key:%v value:%v\n",msg.Partition,msg.Offset,msg.Key,string(msg.Value)) } }(pc) } select { } } 验证kafka是实时的数据处理平台,这个很关键。 我的日志内容增加了kafaka的topic需要处理,如果...
  • /** * 二进制形式上传文 * */ public class Fss { //客户端上传文件 public static void uploadStream(String targetURL, byte[] data) { PostMethod filePost = null; try { filePost = new PostMethod...
  • H264网络传输之UDP码与图像的相关性 一、H264编码中会有I帧、P帧、B帧的产生。其中I帧为原始帧,此帧编码后的数据很大,其中1080P图像会达到几百至上千Kbit,一般会设置最大码限制,在限制的同时会影响到图像...
  • 全名为 “Motion Joint Photographic Experts Group”,是一种视频编码格式, Motion JPEG技术常用与闭合电路的电视摄像机的模拟视频信号“翻译”成视频,并存储在硬盘上。典型的应用如数字视频记录器等。MJPEG不...
  • 》这篇文章中的一番折腾,只要你知道另一位伙伴 B 的 IP 地址,且你们之间的网络是通的,无论远,你都可以将一个数据包发送给你的伙伴 B 这就是物理层、数据链路层、网络层这三层所做的事情。 站在第四层的你,就...
  • 前文已经大概介绍了传输,本文我们详细展开讲讲。 我们假设发送方要向接收方发送32字节的数据,用传统CAN,CAN帧的DLC为8。下图是整个传输过程的示例: 我们来详细看一下每个步骤: ① 发送方先向接收方...
  • 如何流式传输音频?

    2021-03-14 03:50:04
    当我在listview中触摸列表时,我想让媒体播放器从网址播放音乐 .我的问题是媒体播放器只播放一首歌 . 当我在播放第一个列表音频时触摸第二个列表时,它不播放第二个列表音频 .但我不知道原因,媒体播放器在播放第...
  • Android蓝牙传输16进制的字节数据

    千次阅读 2021-10-27 16:20:51
    本文主要介绍android蓝牙传输数据时,对数据的处理方法,在物联网蓝牙设备连接和数据传输使用较。(java/kotlin) 1.字节发送 mOut!!.write(byteArrays, 0, byteArrays.size) mOut!!.flush() 2.十六进制...
  • 媒体技术介绍

    千次阅读 多人点赞 2021-03-08 17:11:36
    媒体(streaming media)技术,是指将一连串的多媒体数据压缩后,经过互联网分段发送数据,在互联网上即时传输影音,以供用户观赏的一种技术。 媒体技术使得数据包可以像流水一样发送,如果不使用此技术,用户...
  • 传输

    千次阅读 2021-06-18 11:56:26
    由于一个主机同时运行个进程,因此运输层具有复用和分用功能。传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层在给定的链路上通过流量控制、分段/重组和差错控制来保证数据传输的...
  • // 下面是获取文件并发送给前端,response会将文件发送给前端 response.setCharacterEncoding("UTF-8"); if (file == null || !file.exists()){ throw new IllegalArgumentException("文件不存在!"); } String...
  • java实现在服务器之间的文件传输(Jsch)JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。我主要是今天完成个分布式架构下获取其他服务器文件的功能,顺便记...
  • 流式传输模式

    2021-03-01 23:08:14
      媒体之所以能够实现多媒体数据的实时播放是采用了专门的网络控制协议和数据传输机制。服务器端有专门的媒体发布系统,而客户端则有专门的播放器,这两部分都需要通过缓存区进行数据的缓存。   与普通的...
  • 我们的上位机软件里的变量往往都是整型、浮点型、字符串等等,但是我们在数据传输的过程中,往往需要的是ByteArray格式。 这里有两组非常重要的方法:struct.pack()和struct.unpack,以及encode()和decode(); 下面...
  • 用micropython picoweb为esp32-cam 传输视频 1.安装picoweb import upip upip.install('picoweb') 服务端 from lib import picoweb import camera import gc app = picoweb.WebApp("app") def send_frame...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 610,512
精华内容 244,204
关键字:

多流传输