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流,然后写入文件,就可以正常播放了。

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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;
    }
 
}

 

三、执行效果

  

 

四、已经封装为可执行文件

  

1
2
3
4
5
6
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;

  

使用方法

1
RtmpDumper rtmp://localhost:1935/myapp/room

  

五、代码

https://github.com/liqiushui/RtmpDumpAsFlv.git

posted @   兜兜有糖的博客  阅读(1570)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示