最简单的基于librtmp的示例 发布(FLV通过RTMP发布)

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

=====================================================

最简单的基于libRTMP的示例系列文章列表:

最简单的基于librtmp的示例:接收(RTMP保存为FLV)

最简单的基于librtmp的示例:发布(FLV通过RTMP发布)

最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)

=====================================================


本文记录一个基于libRTMP的发布流媒体的程序:Simplest libRTMP Send FLV。该程序可以将本地FLV文件发布到RTMP流媒体服务器。是最简单的基于libRTMP的流媒体发布示例。

 

流程图


使用librtmp发布RTMP流的可以使用两种API:RTMP_SendPacket()和RTMP_Write()。使用RTMP_SendPacket()发布流的时候的函数执行流程图如下图所示。使用RTMP_Write()发布流的时候的函数执行流程图相差不大。
 

流程图中关键函数的作用如下所列:

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。
 

源代码

源代码中包含了使用两种API函数RTMP_SendPacket()和RTMP_Write()发布流媒体的源代码,如下所示。
/** * Simplest Librtmp Send FLV * * 雷霄骅,张晖 * leixiaohua1020@126.com * zhanghuicuc@gmail.com * 中国传媒大学/数字电视技术 * Communication University of China / Digital TV Technology * http://blog.youkuaiyun.com/leixiaohua1020 * * 本程序用于将FLV格式的视音频文件使用RTMP推送至RTMP流媒体服务器。 * This program can send local flv file to net server as a rtmp live stream. */ #include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#ifndef WIN32#include <unistd.h>#endif  #include "librtmp/rtmp_sys.h"#include "librtmp/log.h" #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 *u24,FILE*fp){         if(fread(u24,3,1,fp)!=1)                   return 0;         *u24=HTON24(*u24);         return 1;}/*read 4 byte*/int ReadU32(uint32_t *u32,FILE*fp){         if(fread(u32,4,1,fp)!=1)                   return 0;         *u32=HTON32(*u32);         return 1;}/*read 1 byte,and loopback 1 byte at once*/int PeekU8(uint32_t *u8,FILE*fp){         if(fread(u8,1,1,fp)!=1)                   return 0;         fseek(fp,-1,SEEK_CUR);         return 1;}/*read 4 byte and convert to time format*/int ReadTime(uint32_t *utime,FILE*fp){         if(fread(utime,4,1,fp)!=1)                   return 0;         *utime=HTONTIME(*utime);         return 1;} int InitSockets(){         WORD version;         WSADATA wsaData;         version=MAKEWORD(2,2);         return (WSAStartup(version, &wsaData) == 0);} void CleanupSockets(){         WSACleanup();} //Publish using RTMP_SendPacket()int publish_using_packet(){         RTMP *rtmp=NULL;                                    RTMPPacket *packet=NULL;         uint32_t start_time=0;         uint32_t now_time=0;         //the timestamp of the previous frame         long pre_frame_time=0;         long lasttime=0;         int bNextIsKey=1;         uint32_t preTagsize=0;                 //packet attributes         uint32_t type=0;                                 uint32_t datalength=0;                    uint32_t timestamp=0;                    uint32_t streamid=0;                                  FILE*fp=NULL;         fp=fopen("cuc_ieschool.flv","rb");         if (!fp){                   RTMP_LogPrintf("Open File Error.\n");                   CleanupSockets();                   return -1;         }          /* set log level */         //RTMP_LogLevel loglvl=RTMP_LOGDEBUG;         //RTMP_LogSetLevel(loglvl);                           if (!InitSockets()){                   RTMP_LogPrintf("Init Socket Err\n");                   return -1;         }          rtmp=RTMP_Alloc();         RTMP_Init(rtmp);         //set connection timeout,default 30s         rtmp->Link.timeout=5;                               if(!RTMP_SetupURL(rtmp,"rtmp://localhost/publishlive/livestream"))         {                   RTMP_Log(RTMP_LOGERROR,"SetupURL Err\n");               &nbs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值