RTMP使用流程文述

RTMP使用流程文述

在现在网络流媒体的协议中,最常见的就为RTMP,在一搬的工程或项目想要实现rtmp,需要借助rtmpdump来实现,我们可以去rtmpdump官网去下载资源包,去集成在我们的项目中,用以实现rtmp

在android的音视频项目中,我们在获取到视频数据后,需要利用rtmpdump主要做两件事,1是建立连接,2是发送数据。

(ex:在安卓中如果解码速度和发送数据包速度差异过大,可以采用数据队列存储的方式,例如LinkedBlockingQueue)

一、建立连接

1,在native层,先用JNI的env的GetStringUTFchars方法将Java里的String转换成C里面的字符串char

2, 使用RTMP_Alloc得到一个实例的对象rtmp

3, 使用RTMP_Init方法将rtmp传进去进行初始化

4,设置rtmplink.timeout超时时间,一般为10

5,使用RTMP_SetupURL方法去设置连接路径,将rtmp实例化对象和url作为参数传入进去,会返回一个int值。如果返回0即为FALSE,返回1就说明设置成功

6,使用RTMP_Enablewrite方法开启可写

7, 使用RTMP_connect方法开始连接,如果返回为1,代表初步连接成功

8,使用RTMP_connectstream,如果他连接成功,则代表真的成功

二、发送数据

1,在native层,首先拿到从Java层中的一条视频原始数据包byte data

2, 解析此byte data buf中的前四个字节,如果是0x67,则代表是spspps配置帧,一般来说一个视频的spspps只会生成一次,所以我们要先将他缓存起来,不需要推流,待会和I帧一起推流

3,如果解析到的是0x65则代表是I帧,这时需要将spsppsI帧一起发送

4,如果是其他类型则为B帧或P帧,直接进行包装发送,需要按照rtmp的规则进行包装后进行发送

5,需要注意,I帧,BP帧还有sps_pps帧不能直接进行发送,需要按照rtmp的规则进行包装后进行发送,就是类似I帧前加0x17 加三个0x00 然后四个字节长度,后跟数据类似的这种协议规则

6,使用RTMP_SendPacket 进行发送,需要在发送完后使用RTMPacket_Free进行释放

三、推流音频数据

1,将音频开源FAAC搭建在项目中

2,通过AudioRecord将麦克风采集的 PCM 音频采样编码成 AAC 格式音频 , 并封装到 RTMP 包中 , 推流到客户端

你可能感兴趣的:(音视频,C,android,native,面试)