linux下基于libRTMP的接收流媒体的程序
来源:互联网 发布:福彩3d软件分析软件 编辑:程序博客网 时间:2024/05/17 22:43
看了雷博的一篇关于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 <stdio.h>#include <stdlib.h>#include "librtmp/rtmp_sys.h"#include "librtmp/log.h"#include "librtmp/rtmp.h"int InitSockets(){#if 0WORD version;WSADATA wsaData;version = MAKEWORD(1, 1);return (WSAStartup(version, &wsaData) == 0);#endif}void CleanupSockets(){#if 0WSACleanup();#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 30srtmp->Link.timeout=10;// HKS's live URLif(!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;}//1hourRTMP_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;}
http://download.csdn.net/download/leixiaohua1020/8291757我只拷贝了librtmp,和顶层的Makefile,Makefile做了一点点修改来编译rtmp2flv.c
Makefile:
VERSION=v2.3prefix=/usr/localCC=$(CROSS_COMPILE)gccLD=$(CROSS_COMPILE)ldSYS=posix#SYS=mingwCRYPTO=OPENSSL#CRYPTO=POLARSSL#CRYPTO=GNUTLSLIB_GNUTLS=-lgnutls -lgcryptLIB_OPENSSL=-lssl -lcryptoLIB_POLARSSL=-lpolarsslCRYPTO_LIB=$(LIB_$(CRYPTO))DEF_=-DNO_CRYPTOCRYPTO_DEF=$(DEF_$(CRYPTO))DEF=-DRTMPDUMP_VERSION=\"$(VERSION)\" $(CRYPTO_DEF) $(XDEF)OPT=-O2CFLAGS=-Wall $(XCFLAGS) $(INC) $(DEF) $(OPT)LDFLAGS=-Wall $(XLDFLAGS)bindir=$(prefix)/binsbindir=$(prefix)/sbinmandir=$(prefix)/manBINDIR=$(DESTDIR)$(bindir)SBINDIR=$(DESTDIR)$(sbindir)MANDIR=$(DESTDIR)$(mandir)LIBS_posix=LIBS_mingw=-lws2_32 -lwinmm -lgdi32LIBS=$(CRYPTO_LIB) -lz $(LIBS_$(SYS)) $(XLIBS)THREADLIB_posix=-lpthreadTHREADLIB_mingw=THREADLIB=$(THREADLIB_$(SYS))SLIBS=$(THREADLIB) $(LIBS)LIBRTMP=librtmp/librtmp.aINCRTMP=librtmp/rtmp_sys.h librtmp/rtmp.h librtmp/log.h librtmp/amf.hEXT_posix=EXT_mingw=.exeEXT=$(EXT_$(SYS))all:$(LIBRTMP) progsprogs:rtmp2flv rtmpdump rtmpgw rtmpsrv rtmpsuckinstall:progs-mkdir -p $(BINDIR) $(SBINDIR) $(MANDIR)/man1 $(MANDIR)/man8cp rtmpdump$(EXT) $(BINDIR)cp rtmpgw$(EXT) rtmpsrv$(EXT) rtmpsuck$(EXT) $(SBINDIR)cp rtmpdump.1 $(MANDIR)/man1cp rtmpgw.8 $(MANDIR)/man8@cd librtmp; $(MAKE) installclean:rm -f *.o rtmp2flv$(EXT) rtmpdump$(EXT) rtmpgw$(EXT) rtmpsrv$(EXT) rtmpsuck$(EXT)@cd librtmp; $(MAKE) cleanFORCE:$(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 recognizertmp2flv: 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) Makefilertmpgw.o: rtmpgw.c $(INCRTMP) Makefilertmpdump.o: rtmpdump.c $(INCRTMP) Makefilertmpsrv.o: rtmpsrv.c $(INCRTMP) Makefilertmpsuck.o: rtmpsuck.c $(INCRTMP) Makefilethread.o: thread.c thread.h
./rtmp2flv运行程序
用smplayer receive.flv 来播放视频:
感谢雷神!
0 0
- linux下基于libRTMP的接收流媒体的程序
- 【基于libRTMP的流媒体直播之 AAC、H264 推送】
- 基于libRTMP的流媒体直播之 AAC、H264 推送
- 基于libRTMP的流媒体直播之 AAC、H264 推送
- 基于libRTMP的流媒体直播之 AAC、H264 推送
- 基于libRTMP的流媒体直播之 AAC、H264 解析
- 【基于libRTMP的流媒体直播之 AAC、H264 推送】
- 【基于libRTMP的流媒体直播之 AAC、H264 推送】
- 基于libRTMP的流媒体直播之音频推送
- 基于libRTMP的流媒体直播之 AAC、H264 推送
- 【基于libRTMP的流媒体直播之 AAC、H264 推送】
- 基于libRTMP的流媒体直播之 AAC、H264 推送
- 【基于libRTMP的流媒体直播之 AAC、H264 推送】
- 【基于libRTMP的流媒体直播之 AAC、H264 推送】
- 基于libRTMP的流媒体直播之 AAC、H264 推送
- linux下基于udp的简单的接收与发送程序,开发板与本机接收与发送信息
- linux下基于tcp的简单的接收与发送程序,开发板与本机接收与发送信息
- 最简单的基于librtmp的示例:接收(RTMP保存为FLV)
- React Native error: Raw “ ” must be wrapped in an explicit <Text> Component
- 安装第三方工具对redis数据库进行导出或导入
- VUE2.0不可忽视的很多变化
- js补充笔记 1
- haproxy 4层和7层负载
- linux下基于libRTMP的接收流媒体的程序
- Oracle ADDM性能诊断利器及报告解读
- linux 防火墙设置及查看
- 分析服务升级数据库脚本编码问题
- ASSIGN COMPONENT <comp> OF STRUCTURE <s> TO <FS>.
- 斗地主AI算法——第十四章の主动出牌(3)
- selenium的chromedriver与chrome浏览器的对应关系表
- Linux netstat命令详解
- bzoj1057(洛谷1169)最大01子矩阵和最大01子正方形