一、准备工作

  搭建本地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文件)的更多相关文章

  1. Android 音视频深入 十七 FFmpeg 获取RTMP流保存为flv (附源码下载)

    项目地址https://github.com/979451341/RtmpSave 这个项目主要代码我是从雷神那弄过来的,不愧是雷神,我就配个环境搞个界面就可以用代码了. 这一次说的是将RTMP流媒体 ...

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

    ===================================================== 最简单的基于libRTMP的示例系列文章列表: 最简单的基于librtmp的示例:接收(RT ...

  3. (转)rtmp协议简单解析以及用其发送h264的flv文件

    Adobe公司太坑人了,官方文档公布的信息根本就不全,如果只按照他上面的写的话,是没法用的.按照文档上面的流程,server和client连接之后首先要进行握手,握手成功之后进行一些交互,其实就是交互 ...

  4. 推荐下:开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !

    视频播放, 原本是想h5 自带视频播放,使用很简单,结果现实很骨感. <video controls="controls" preload="auto" ...

  5. iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

    最近项目中想实现直播的功能,所以研究了一段时间的直播功能,当然也是在别人的基础上不断的学习实现的,所以记录一下,希望对大家有所帮助. 直播拉流功能: 这里使用了开源的IJKPlayer第三框架,ijk ...

  6. 流媒体压力测试rtmp&hls(含推流和拉流)

    http://blog.csdn.net/sinat_34194127/article/details/50816045 [root@localhost ~]# yum install git unz ...

  7. 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 ...

  8. iis服务器php环境 failed to open stream: No such file or directory解决办法

    项目主机用的windows系统,iis服务器:远程连接桌面—>本地资源->映射D盘驱动器,将本地d盘修改后的文件放在远程主机项目目录里,访问报出failed to open stream: ...

  9. 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 ...

  10. 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 ...

随机推荐

  1. 使用ISS服务器方式跑C#程序

    使用ISS服务器方式跑C#程序 VS2010,临时接了一个C#系统的小系统,需要本地调试跑一下 但是老是在conn.open提示06413,简单来说就是连接不上数据库 尝试了很多方法,最后还是决定配置 ...

  2. 一位 sealer maintainer 的心路历程

    简介: 本文作者将回顾个人参与 sealer 开源项目的机缘巧合,参与过程中的挑战,以及从中获取的所悟所感,写下一段文字进行分享,希望对开源新人有所帮助,能够激励想参与开源工作但还未踏出第一步的同学. ...

  3. [GPT] 数据分析工具可以使用机器学习技术来预测未来趋势和提供数据可视化?

      数据分析工具使用机器学习技术来预测未来趋势和提供数据可视化是靠谱的. 机器学习算法可以通过对历史数据的学习来发现数据中的模式和趋势,并利用这些模式和趋势来预测未来的趋势.这种方法已经被广泛应用于许 ...

  4. linux安装nvm和node

    linux安装nvm和node 一.环境 debian10 nodejs 二.安装 2.1 安装NVM 运行以下命令下载并运行 NVM 安装脚本: curl https://raw.githubuse ...

  5. Golang csv操作

    目录 csv读写 追加写入 追加写入封装 csv读写 封装成工具包 package utils import ( "encoding/csv" "fmt" &q ...

  6. centos 文件系统权限

    模板:drwxrwxrwx r表是读 (Read) .w表示写 (Write) .x表示执行 (eXecute) 读.写.运行三项权限可以用数字表示,就是r=4,w=2,x=1, 777就是rwxrw ...

  7. 支持4k的远程桌面软件有哪些

    在当今的数字时代,在全球向灵活工作安排和分布式团队转变的推动下,对远程工作解决方案的需求猛增.远程桌面软件已成为寻求让员工能够在任何地方工作的企业的重要工具.在用户在此类软件中寻求的众多功能中,对 4 ...

  8. 八大远程控制软件,完美替代Teamviewer

    理想情况下,最好的远程桌面软件应该物有所值,同时为用户提供快速.安全和可靠的远程连接.还应该有一套强大的解决方案,提供高级报告和增强功能.跨平台支持和通信. TeamViewer 拥有超过 25 亿的 ...

  9. Akima算法

    测量数据的内插已有各种方法,如线性内插.多项式内插.样条函数插值等,但这里的Akima插值法具有独特的优点. 线性内插只顾及其附近两点的影响. 多项式内插时,低阶多项式由于参数较少,内插精度很低,而使 ...

  10. swagger文档枚举类型描述

    背景: 问题:使用swagger作为api文档,但文档中的枚举类型仅显示枚举name,对于使用文档的人员来讲不容易理解 解决思路:枚举类型加上自定义的描述 解决方案 maven配置 <depen ...