美文网首页视频处理
iOS 关于视频流,你真的需要知道 ---<慢慢完善中&g

iOS 关于视频流,你真的需要知道 ---<慢慢完善中&g

作者: 忘川_之上 | 来源:发表于2016-11-28 17:48 被阅读110次

    一、RTMP协议

    RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP。同样需要实现三步握手:

    1、Client → Server :向服务器发出握手请求.这不属于协议包一部分,该握手请求第一个字节为(0×03),其后跟着1536个字节.尽管看上去这部分的内容对于RTMP协议来说并不是至关重要的,但也不可随意对待.

    2、Server → Client :服务器向客户端回应握手请求.这部分的数据仍然不属于RTMP协议的部分.该回应的起始字节仍然为(0x03),但是后边跟着两个长度为1536个字节(一共为3072字节 )的包块.第一个1536块看上去似乎可以是任意内容,甚至好像可以是Null都没有关系.第二个1536的代码块,是上一步客户端向服务器端发送的握手请求的内容.

    3、Client→Server:把上一步服务器向客户端回应的第二块1536个字节的数据块.

    然后Client → Server :向服务器发送连接包.Server → Client :服务器回应.  ...

    4、RTMP消息结构,由一个包头和一个包体组成。

    包头:包头可以是4种长度的任意一种:12, 8, 4,  1 byte(s)

    完整的12字节RTMP包头每个字节的含义:

    用途 大小(Byte) 含义

    Head_Type 1 包头

    TiMMER 3 时间戳

    AMFSize 3 数据大小

    AMFType 1 数据类型

    StreamID 4 流ID

    包体:AMF数据

    Rtmp包默认的最大长度为128字节,(或通过chunksize改变rtmp包最大长度), 当AMF数据超过128Byte的时候就可能有多个rtmp包组成,如果需要解码的rtmp包太长则被TCP协议分割成多个TCP包.那么解码的时候需要先将包含rtmp包的tcp封包合并, 再把合并的数据解码,解码后可得到amf格式的数据,将这些AMF数据取出来就可以对AMF数据解码了.

    RTMP封包包括包头和AMF数据2部分,AMF数据里面可以是命令也可以是音视频数据。组成服务器和Flash客户端之间的所有数据都是用AMF格式的数据在传送,例如connect() publish()等命令. AMF数据由2部分组成: ObjType 加上 ObjValue。ObjType的大小为一个字节。ObjValue的大小不固定,和ObjType相关。 常用的ObjType类型和对应的ObjValue大小整理如下,详细的ObjType的数据在本文的最下面列出:

    类型说明(ObjType)       数据 dataSize

    CORE_String 0x02  2字节 (2字节的数据纪录了String的实际长度)

    CORE_Object  0x03 0字节 (开始嵌套0x00000009表示嵌套结束)

    NULL      0x05 0字节 空字节无意义

    CORE_NUMBER 0x00  8字节

    CORE_Map 0x08    4字节 (开始嵌套)

    CORE_BOOLEAN 0x01    1字节

    ObjValue不一定是一个固定的大小,他可以包含另外一个AMF数据,这另外一个AMF数据里面又有ObjType 加上 ObjValue,也就是AMF数据的嵌套关系

    AMF0数据的嵌套关系如下:

    Object={ObjType + ObjValue}

    CORE_BOOLEAN={Value(1 Byte)}

    CORE_NUMBER={Value(8 Byte)}

    CORE_String={StringLen(2 Byte) + StringValue(StringLen Byte)}

    CORE_DATE={value(10 Byte)}

    CORE_Array={ArrayLen(4 Byte) + Object}

    CORE_Map={MapNum(4 Byte) + CORE_Object}

    CORE_Object={CORE_String + Object}

    看起来有些复杂,所以我这里图文并茂来详解,例如完成握手后,Flash向FMS发送的第一个RTMP数据,内容如下:

    蓝色的表示包头,红色的表示ObjType,绿色的表示数据。上面一段数据由2个RTMP包组成,2个RTMP包头分别用蓝色表示,第一个蓝色的是12字节的包头,后面一个蓝色的C3是一个字节的包头,绿色部分是数据,红色的是AMF数据类型

    二、大多数做直播的时候使用 FFMpeg,非常强大的一款视频工具

    //http://baike.baidu.com/link?url=eTqBHMldK7DJUSl90h4DrXJ5VAiw5uAB6GNRhLAh_mJCvcEDgngYDcAa5xxxaHYlDKhix-P43eIYPIL9QvmhN_  详细了解

    视频采集功能

    ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可

    以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。

    视频格式转换功能

    ffmpeg视频转换功能。视频格式转换,比如可以将多种视频格式转换为flv格式,可不是视频信号转换 。

    ffmpeg可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod等),例如可以将摄录下的视频avi等转成视频网站所采用的flv格式。

    视频截图功能

    对于选定的视频,截取指定时间的缩略图。视频抓图,获取静态图和动态图,不提倡抓gif文件;因为抓出的gif文件大而播放不流畅。

    给视频加水印功能

    使用ffmpeg 视频添加水印(logo)。

    三、IJKMedIJKMediaPlayer的使用

    导入IJKMediaFramework.framework

    添加依赖库

    libz.tbd

    libbz2.tbd

    AudioToolbox.framework

    AVFoundation.framework

    CoreGraphics.framework

    CoreMedia.framework

    CoreVideo.framework

    MediaPlayer.framework

    MobileCoreServices.framework

    OpenGLES.framework

    QuartzCore.framework

    UIKit.framework

    VideoToolbox.framework

    在ViewController.m 导入IJKMediaFramework.h头文件编译看有没有错, 如果没有错说明集成成功

    相关文章

      网友评论

        本文标题:iOS 关于视频流,你真的需要知道 ---<慢慢完善中&g

        本文链接:https://www.haomeiwen.com/subject/ptyopttx.html