Dump Rtmp Stream To FLV File (从Rtmp流保存为FLV文件)
一、准备工作
搭建本地rtmp服务:
https://www.cnblogs.com/doudouyoutang/p/6602430.html
获取使用到的库,openssl 和 librtmp
参考:
https://www.jianshu.com/p/b38656443e71
https://github.com/x2on/OpenSSL-for-iPhone
也可以从我的工程中直接拿
二、代码编写
利用librtmp中的RTMP_Read函数,直接读取到的就是FLV流,然后写入文件,就可以正常播放了。
void RtmpStreamDumper::startDump()
{
int readBytes = 0;
bool bLiveStream = true;
int bufsize = 1024*1024*10;
long countbufsize = 0;
char *buf = (char*)calloc(sizeof(char), bufsize);
char *path = (char*)calloc(sizeof(char), this->rtmp_rsource_url.size() + 1);
strcpy(path, this->rtmp_rsource_url.c_str()); RTMP_LogPrintf("Start Dump To %s", this->dump_flv_path.c_str()); RTMP *rtmp = RTMP_Alloc();
RTMP_Init(rtmp);
rtmp->Link.timeout=10; if(!RTMP_SetupURL(rtmp, path))
{
RTMP_Log(RTMP_LOGERROR,"SetupURL Err\n");
RTMP_Free(rtmp);
return;
} if (bLiveStream){
rtmp->Link.lFlags|=RTMP_LF_LIVE;
} RTMP_SetBufferMS(rtmp, 3600*1000); if(!RTMP_Connect(rtmp,NULL)){
RTMP_Log(RTMP_LOGERROR,"Connect Err\n");
RTMP_Free(rtmp);
return ;
} if(!RTMP_ConnectStream(rtmp,0)){
RTMP_Log(RTMP_LOGERROR,"ConnectStream Err\n");
RTMP_Close(rtmp);
RTMP_Free(rtmp);
return ;
} while((readBytes = RTMP_Read(rtmp,buf,bufsize))){
this->dumpBytesToFlv((const unsigned char *)buf, readBytes);
countbufsize += readBytes;
RTMP_LogPrintf("Receive: %5dByte, Total: %5.2fkB\n",readBytes,countbufsize*1.0/1024);
} if(buf){
free(buf);
} if(rtmp){
RTMP_Close(rtmp);
RTMP_Free(rtmp);
rtmp=NULL;
} }
三、执行效果

四、已经封装为可执行文件
std::cout<<"use example :RtmpDumper [rtmp_live_url] [flv_save_path(default to excute folder)]"<<std::endl;
std::string url((argc > 1)?argv[1]:"");
std::string path((argc > 2)?argv[2]:"");
RtmpStreamDumper *dp = new RtmpStreamDumper(url, path);
dp->startDump();
return 0;
使用方法
RtmpDumper rtmp://localhost:1935/myapp/room
五、代码
p.p1 { margin: 0; font: 23px Menlo; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { font-variant-ligatures: no-common-ligatures }
https://github.com/liqiushui/RtmpDumpAsFlv.git
Dump Rtmp Stream To FLV File (从Rtmp流保存为FLV文件)的更多相关文章
- Android 音视频深入 十七 FFmpeg 获取RTMP流保存为flv (附源码下载)
项目地址https://github.com/979451341/RtmpSave 这个项目主要代码我是从雷神那弄过来的,不愧是雷神,我就配个环境搞个界面就可以用代码了. 这一次说的是将RTMP流媒体 ...
- 最简单的基于librtmp的示例:接收(RTMP保存为FLV)
===================================================== 最简单的基于libRTMP的示例系列文章列表: 最简单的基于librtmp的示例:接收(RT ...
- (转)rtmp协议简单解析以及用其发送h264的flv文件
Adobe公司太坑人了,官方文档公布的信息根本就不全,如果只按照他上面的写的话,是没法用的.按照文档上面的流程,server和client连接之后首先要进行握手,握手成功之后进行一些交互,其实就是交互 ...
- 推荐下:开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !
视频播放, 原本是想h5 自带视频播放,使用很简单,结果现实很骨感. <video controls="controls" preload="auto" ...
- iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流
最近项目中想实现直播的功能,所以研究了一段时间的直播功能,当然也是在别人的基础上不断的学习实现的,所以记录一下,希望对大家有所帮助. 直播拉流功能: 这里使用了开源的IJKPlayer第三框架,ijk ...
- 流媒体压力测试rtmp&hls(含推流和拉流)
http://blog.csdn.net/sinat_34194127/article/details/50816045 [root@localhost ~]# yum install git unz ...
- Warning: require(D:\wamp\www\glink-smart\bootstrap/../vendor/autoload.php): failed to open stream: No such file or directory in D:\wamp\www\glink-smart\bootstrap\autoload.php on line 1
Laravel访问出错错误信息:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or dire ...
- iis服务器php环境 failed to open stream: No such file or directory解决办法
项目主机用的windows系统,iis服务器:远程连接桌面—>本地资源->映射D盘驱动器,将本地d盘修改后的文件放在远程主机项目目录里,访问报出failed to open stream: ...
- Laravel5.6安裝:Warning: require(../vendor/autoload.php): failed to open stream: No such file or directory
在phpstudy下使用composer+laravel安装器的方式安装了Laravel,但是访问的时候报错: Warning: require(D:\phpstudy\WWW\public\mybl ...
- Laravel访问出错错误信息:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or dire
错误信息:`Warning: require(/http/www.mywakavLee.cn/bootstrap/../vendor/autoload.php): failed to open str ...
随机推荐
- 用存储过程和 JAVA 写报表数据源有什么弊端?
我们在报表开发中经常会使用存储过程准备数据,存储过程支持分步计算,可以实现非常复杂的计算逻辑,为报表开发带来便利.所以,报表开发中这样的存储过程并不少见: 3008 行,141KB 的存储过程,会给报 ...
- 在ashx中如何使用session
前言 都是写陈年往事罢了,如何在ashx 使用session 正文 我们知道在ashx 中使用context.Session 我们即读取不到值,同时设置完也感觉无效. 原因是我们在ashx 中使用的s ...
- 力扣640(java)-求解方程(中等)
题目: 求解一个给定的方程,将x以字符串 "x=#value" 的形式返回.该方程仅包含 '+' , '-' 操作,变量 x 和其对应系数. 如果方程没有解,请返回 "N ...
- TiDB、OceanBase、PolarDB-X、CockroachDB二级索引写入性能测评
简介: 二级索引是关系型数据库相较于NoSQL数据库的一个关键差异.二级索引必须是强一致的,因此索引的写入需要与主键的写入放在一个事务当中,事务的性能是二级索引性能的基础.本次测试将重点关注不同分布式 ...
- 龙蜥开源内核追踪利器 Surftrace:协议包解析效率提升 10 倍! | 龙蜥技术
简介:如何将网络报文与内核协议栈清晰关联起来精准追踪到关注的报文行进路径呢? 文/系统运维 SIG Surftrace 是由系统运维 SIG 推出的一个 ftrace 封装器和开发编译平台,让用 ...
- Serverless 场景下 Pod 创建效率优化
简介: 众所周知,Kubernetes 是云原生领域的基石,作为容器编排的基础设施,被广泛应用在 Serverless 领域.弹性能力是 Serverless 领域的核心竞争力,本次分享将重点介绍基于 ...
- WPF开源轻便、快速的桌面启动器
前言 今天大姚给大家分享一款WPF开源.简单.轻便.快速的桌面启动器(支持多主题.多语言:简体中文.繁体中文.英文等):CurvaLauncher. WPF介绍 WPF 是一个强大的桌面应用程序框架, ...
- [FAQ] Phpstorm 代码提示功能失效问题
如果是之前有代码提示,中间突然不出现提示了,那么考虑重建一下项目索引. 示例: Refer:Phpstorm代码提示 Link:https://www.cnblogs.com/farwish/p/13 ...
- 数字电路中的等效电路和FPGA中的等效电路
欢迎各位朋友关注"郝旭帅电子设计团队",本微信公众号会定时更新相关技术类资料.软件等等,希望各位朋友都能在本微信公众号获得一些自己想要的"东西". 本篇内容主要 ...
- Oracle和达梦:获取更新随机时间sql
需求 1.修改数据库中表的创建.更新时间,日期固定,时间随机(日期也可以随机): 2.拿到这些sql去数据库执行就行了. 前提 -- 生成8-12间的随机数(小数) SELECT DBMS_RANDO ...