1.推流
配置好rtmpdump库后,我们可以先用命令行来推流看下效果
2.流程图
使用librtmp发布RTMP流的可以使用两种API:RTMP_SendPacket()和RTMP_Write()。
使用RTMP_SendPacket()发布流的时候的函数执行流程图如下图所示。
流程图中关键函数的作用如下所列:
- InitSockets():初始化Socket
- RTMP_Alloc():为结构体“RTMP”分配内存。
- RTMP_Init():初始化结构体“RTMP”中的成员变量。
- RTMP_SetupURL():设置输入的RTMP连接的URL。
- RTMP_EnableWrite():发布流的时候必须要使用。如果不使用则代表接收流。
- RTMP_Connect():建立RTMP连接,创建一个RTMP协议规范中的NetConnection。
- RTMP_ConnectStream():创建一个RTMP协议规范中的NetStream。
- Delay:发布流过程中的延时,保证按正常播放速度发送数据。
- RTMP_SendPacket():发送一个RTMP数据RTMPPacket。
- RTMP_Close():关闭RTMP连接。
- RTMP_Free():释放结构体“RTMP”。
- CleanupSockets():关闭Socket。
下面将本地FLV文件发布到RTMP流媒体服务器。这个只是简单的demo。
#define uint32_t unsigned int
#define HTON16(x) ((x>>8&0xff)|(x<<8&0xff00))
#define HTON24(x) ((x>>16&0xff)|(x<<16&0xff0000)|(x&0xff00))
#define HTON32(x) ((x>>24&0xff)|(x>>8&0xff00)|\
(x<<8&0xff0000)|(x<<24&0xff000000))
#define HTONTIME(x) ((x>>16&0xff)|(x<<16&0xff0000)|(x&0xff00)|(x&0xff000000))
/*read 1 byte*/
int ReadU8(uint32_t *u8,FILE*fp){
if(fread(u8,1,1,fp)!=1)
return 0;
return 1;
}
/*read 2 byte*/
int ReadU16(uint32_t *u16,FILE*fp){
if(fread(u16,2,1,fp)!=1)
return 0;
*u16=HTON16(*u16);
return 1;
}
/*read 3 byte*/
int ReadU24(uint32_t