美文网首页视频处理
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