看了雷博的一篇关于rtmp的文章,学习记录以作备忘。

使用librtmp接收RTMP流的函数执行流程图如下图:

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

InitSockets():初始化Socket

RTMP_Alloc():为结构体“RTMP”分配内存。

RTMP_Init():初始化结构体“RTMP”中的成员变量。

RTMP_SetupURL():设置输入的RTMP连接的URL。

RTMP_Connect():建立RTMP连接,创建一个RTMP协议规范中的NetConnection。

RTMP_ConnectStream():创建一个RTMP协议规范中的NetStream。

RTMP_Read():从服务器读取数据。

RTMP_Close():关闭RTMP连接。

RTMP_Free():释放结构体“RTMP”。

CleanupSockets():关闭Socket。

其中NetStream和NetConnection是RTMP协议规范中的两个逻辑结构。NetStream建立在NetConnection之上。一个NetConnection可以包含多个NetStream。它们之间的关系如下图所示:

源代码rtmp2flv.c:

#include #include #include "librtmp/rtmp_sys.h"

#include "librtmp/log.h"

#include "librtmp/rtmp.h"

int InitSockets()

{

#if 0

WORD version;

WSADATA wsaData;

version = MAKEWORD(1, 1);

return (WSAStartup(version, &wsaData) == 0);

#endif

}

void CleanupSockets()

{

#if 0

WSACleanup();

#endif

}

int main(int argc, char* argv[])

{

InitSockets();

double duration=-1;

int nRead;

//is live stream ?

char bLiveStream=1;

int bufsize=1024*1024*10;

char *buf=(char*)malloc(bufsize);

memset(buf,0,bufsize);

long countbufsize=0;

FILE *fp=fopen("receive.flv","wb");

if (!fp){

RTMP_LogPrintf("Open File Error.\n");

CleanupSockets();

return -1;

}

/* set log level */

//RTMP_LogLevel loglvl=RTMP_LOGDEBUG;

//RTMP_LogSetLevel(loglvl);

RTMP *rtmp=RTMP_Alloc();

RTMP_Init(rtmp);

//set connection timeout,default 30s

rtmp->Link.timeout=10;

// HKS's live URL

if(!RTMP_SetupURL(rtmp,"rtmp://live.hkstv.hk.lxdns.com/live/hks"))

{

RTMP_Log(RTMP_LOGERROR,"SetupURL Err\n");

RTMP_Free(rtmp);

CleanupSockets();

return -1;

}

if (bLiveStream){

rtmp->Link.lFlags|=RTMP_LF_LIVE;

}

//1hour

RTMP_SetBufferMS(rtmp, 3600*1000);

if(!RTMP_Connect(rtmp,NULL)){

RTMP_Log(RTMP_LOGERROR,"Connect Err\n");

RTMP_Free(rtmp);

CleanupSockets();

return -1;

}

if(!RTMP_ConnectStream(rtmp,0)){

RTMP_Log(RTMP_LOGERROR,"ConnectStream Err\n");

RTMP_Close(rtmp);

RTMP_Free(rtmp);

CleanupSockets();

return -1;

}

while(nRead=RTMP_Read(rtmp,buf,bufsize)){

fwrite(buf,1,nRead,fp);

countbufsize+=nRead;

RTMP_LogPrintf("Receive: %5dByte, Total: %5.2fkB\n",nRead,countbufsize*1.0/1024);

}

if(fp)

fclose(fp);

if(buf){

free(buf);

}

if(rtmp){

RTMP_Close(rtmp);

RTMP_Free(rtmp);

CleanupSockets();

rtmp=NULL;

}

return 0;

}

这里面包含rtmp的几个头文件,需要借助librtmp的库,可以随意在网上下个,我找了雷神的那个:

http://download.csdn.net/download/leixiaohua1020/8291757我只拷贝了librtmp,和顶层的Makefile,Makefile做了一点点修改来编译rtmp2flv.c

Makefile:

VERSION=v2.3

prefix=/usr/local

CC=$(CROSS_COMPILE)gcc

LD=$(CROSS_COMPILE)ld

SYS=posix

#SYS=mingw

CRYPTO=OPENSSL

#CRYPTO=POLARSSL

#CRYPTO=GNUTLS

LIB_GNUTLS=-lgnutls -lgcrypt

LIB_OPENSSL=-lssl -lcrypto

LIB_POLARSSL=-lpolarssl

CRYPTO_LIB=$(LIB_$(CRYPTO))

DEF_=-DNO_CRYPTO

CRYPTO_DEF=$(DEF_$(CRYPTO))

DEF=-DRTMPDUMP_VERSION=\"$(VERSION)\" $(CRYPTO_DEF) $(XDEF)

OPT=-O2

CFLAGS=-Wall $(XCFLAGS) $(INC) $(DEF) $(OPT)

LDFLAGS=-Wall $(XLDFLAGS)

bindir=$(prefix)/bin

sbindir=$(prefix)/sbin

mandir=$(prefix)/man

BINDIR=$(DESTDIR)$(bindir)

SBINDIR=$(DESTDIR)$(sbindir)

MANDIR=$(DESTDIR)$(mandir)

LIBS_posix=

LIBS_mingw=-lws2_32 -lwinmm -lgdi32

LIBS=$(CRYPTO_LIB) -lz $(LIBS_$(SYS)) $(XLIBS)

THREADLIB_posix=-lpthread

THREADLIB_mingw=

THREADLIB=$(THREADLIB_$(SYS))

SLIBS=$(THREADLIB) $(LIBS)

LIBRTMP=librtmp/librtmp.a

INCRTMP=librtmp/rtmp_sys.h librtmp/rtmp.h librtmp/log.h librtmp/amf.h

EXT_posix=

EXT_mingw=.exe

EXT=$(EXT_$(SYS))

all:$(LIBRTMP) progs

progs:rtmp2flv rtmpdump rtmpgw rtmpsrv rtmpsuck

install:progs

-mkdir -p $(BINDIR) $(SBINDIR) $(MANDIR)/man1 $(MANDIR)/man8

cp rtmpdump$(EXT) $(BINDIR)

cp rtmpgw$(EXT) rtmpsrv$(EXT) rtmpsuck$(EXT) $(SBINDIR)

cp rtmpdump.1 $(MANDIR)/man1

cp rtmpgw.8 $(MANDIR)/man8

@cd librtmp; $(MAKE) install

clean:

rm -f *.o rtmp2flv$(EXT) rtmpdump$(EXT) rtmpgw$(EXT) rtmpsrv$(EXT) rtmpsuck$(EXT)

@cd librtmp; $(MAKE) clean

FORCE:

$(LIBRTMP): FORCE

@cd librtmp; $(MAKE) all

# note: $^ is GNU Make's equivalent to BSD $>

# we use both since either make will ignore the one it doesn't recognize

rtmp2flv: rtmp2flv.o $(LIBRTMP)

$(CC) $(LDFLAGS) $^ $> -o $@$(EXT) $(LIBS)

rtmpdump: rtmpdump.o $(LIBRTMP)

$(CC) $(LDFLAGS) $^ $> -o $@$(EXT) $(LIBS)

rtmpsrv: rtmpsrv.o thread.o $(LIBRTMP)

$(CC) $(LDFLAGS) $^ $> -o $@$(EXT) $(SLIBS)

rtmpsuck: rtmpsuck.o thread.o $(LIBRTMP)

$(CC) $(LDFLAGS) $^ $> -o $@$(EXT) $(SLIBS)

rtmpgw: rtmpgw.o thread.o $(LIBRTMP)

$(CC) $(LDFLAGS) $^ $> -o $@$(EXT) $(SLIBS)

rtmp2flv.o: rtmp2flv.c $(INCRTMP) Makefile

rtmpgw.o: rtmpgw.c $(INCRTMP) Makefile

rtmpdump.o: rtmpdump.c $(INCRTMP) Makefile

rtmpsrv.o: rtmpsrv.c $(INCRTMP) Makefile

rtmpsuck.o: rtmpsuck.c $(INCRTMP) Makefile

thread.o: thread.c thread.h

./rtmp2flv运行程序

用smplayer receive.flv 来播放视频:

感谢雷神!

linux 下librtmp源码,linux下基于libRTMP的接收流媒体的程序相关推荐

  1. linux下free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  2. linux c free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  3. linux 循环缓冲区 源码,Linux中的循环缓冲区

    在学习到 并发和竞态 时,其中的提到了缓冲区,用于实现免锁算法,这里转载的是大神有关循环缓冲区做的一些操作. 其中源代码在最下面的附件中,有关作者的讲解感觉很清晰,很好,不过这里说一下自己的见解: 点 ...

  4. 传奇游戏源码 Linux版本 传奇源码 Linux版 三端源码和搭建, 然后打包生成APP

    此源码牛逼拉萨, 因为鄙人玩了好一段时间, 故此搞篇文章记录下几个技术关键点 Linux架设教程 先决条件: CentOS 7 Nginx 1.8 mysql 5.6 php 5.6 建议使用 IP: ...

  5. linux usb摄像头 源码,Linux USB摄像头驱动实现源码分析

    Spac5xx的实现是按照标准的USB VIDEO设备的驱动框架编写(其具体的驱动框架可参照/usr/src/linux/drivers/usb/usbvideo.c文件),整个源程序由四个主体部分组 ...

  6. linux 虚拟网卡 源码,Linux的虚拟网卡TUN和TAP

    TUN/TAP 提供了给用户空间程序的包的接收和传输,它可以看成是简单的点对点设备或是 以太网设备.它不是从物理设备接收包,而是从用户空间程序接收包.它发送包不是通过物 理设备来发送包,而是将这些包写 ...

  7. linux声卡驱动源码,Linux声卡驱动移植和測试(示例代码)

    一.分析驱动程序,依据开发板改动代码 代码太长,就不贴了,几个注意点: 1. 查看开发板原理图和S3C2410的datasheet,UDA1341的L3MODE.L3DATA.L3CLOCK分别与S3 ...

  8. linux内核io源码,Linux Kernel do_io_submit()函数整数溢出漏洞

    发布日期:2010-09-21 更新日期:2010-09-27 受影响系统: Linux kernel 2.6.x 不受影响系统: Linux kernel 2.6.36-rc4 描述: ------ ...

  9. [附源码]JAVA+ssm基于Internet快递柜管理系统(程序+Lw)

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  10. 大厂程序员接私活被坑, 还被放鸽子,那源码就开源-基于SSM仿知乎小程序

    最近很郁闷,一个女粉丝找我要开发一个系统.说是很着急.   但是费用不高,说自己没钱.   我平时事也很多,又不是很想接.   说了一大堆苦情的话,然后说自己的要求不高,没有ui要求,   我就接了. ...

最新文章

  1. 探索机器学习的公平性(Delayed Impact of Fair Machine Learning)论文 pdf
  2. 浅谈tomcat中间件的优化【转】
  3. windows 2012执行计划任务错误:操作员或系统管理员拒绝了请求(0x800710E0)
  4. elementui 如何修改表格里面cell的样式
  5. Linux下Web效力器架设攻略-1
  6. Java注解参数类型枚举值_EffectiveJava-5-枚举和注解
  7. VMWare 虚拟机工作站 + Ubuntu操作系统安装
  8. linux hosts和hostname
  9. @ Before,@ BeforeClass,@ BeforeEach和@BeforeAll之间的区别
  10. 查看app包名和启动页Activity的方法
  11. 【CNN回归预测】基于matlab卷积神经网络CNN数据回归预测【含Matlab源码 2003期】
  12. android+反编译加广告,追书神器Android版,反编译去广告基本教程
  13. Excel如何批量快速从复杂文本中提取汉字
  14. 深度学习结合SLAM的研究思路/成果整理之(二)语义SLAM 端到端
  15. 股票交易接口是什么?
  16. 深度学习:深度复数网络(Deep Complex Networks)-从论文到pytorch实现
  17. 良人从零开始的踩坑笔记:浮点数
  18. 未明学院数据分析报告:金融专业如何找实习?数据分析告诉你整个金融实习市场全貌!
  19. BZOJ1791 基环树直径
  20. pd.melt() vs reshape2::melt()

热门文章

  1. CPDA数据分析师:一个完整的数据分析流程
  2. 创业/商业计划书10大禁忌
  3. linux退出热键_LINUX常用快捷键
  4. css面试题之Flex布局
  5. 人工智能技术专家系统
  6. 怎么进入机顶盒linux系统,如何在机顶盒中刷入原生的Debian系统
  7. ABBYY FineReader 超强OCR识别软件 V15.0.0 特别版
  8. Solidworks CAM入门教程,简单生成雕刻机刀路,经验分享
  9. Android APP原型设计,五款移动APP在线原型设计工具,值得收藏
  10. Linux-C 文件操作