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,设置rtmp
的link.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
帧,这时需要将spspps
与I
帧一起发送
4,如果是其他类型则为B
帧或P
帧,直接进行包装发送,需要按照rtmp
的规则进行包装后进行发送
5,需要注意,I
帧,B
,P
帧还有sps_pps
帧不能直接进行发送,需要按照rtmp
的规则进行包装后进行发送,就是类似I
帧前加0x17
加三个0x00
然后四个字节长度,后跟数据类似的这种协议规则
6,使用RTMP_SendPacket
进行发送,需要在发送完后使用RTMPacket_Free
进行释放
三、推流音频数据
1,将音频开源FAAC搭建在项目中
2,通过AudioRecord
将麦克风采集的 PCM
音频采样编码成 AAC
格式音频 , 并封装到 RTMP
包中 , 推流到客户端