`
haoningabc
  • 浏览: 1476293 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

srt学习笔记五:手写个srt的socket

阅读更多
参考:https://www.jianshu.com/p/3957c55a702d

实时模式用于传送实时多媒体流。

实时模式下,数据分片(默认是1316 = 7 * 188,188是单个MPEG TS大小)在一定的速率控制下发出,并且在接收端按照发送端发送的时间间隔重新组织好。

默认情况下,接收端重组会有一定的时延,默认为120ms。




参考
https://github.com/Haivision/srt/blob/master/examples/test-c-server.c

https://github.com/Haivision/srt/blob/master/examples/test-c-client.c

test-c-server.c
#include <stdio.h>
#include <stdlib.h>
#include "srt/srt.h"
int main(int argc, char** argv)
{
    int ss, st;
    struct sockaddr_in sa;
    int yes = 1;
    struct sockaddr_storage their_addr;

    if (argc != 3) {
      fprintf(stderr, "Usage: %s <host> <port>\n", argv[0]);
      return 1;
    }

    printf("srt startup\n");
    srt_startup();

    printf("srt socket\n");
    ss = srt_create_socket();
    if (ss == SRT_ERROR)
    {
        fprintf(stderr, "srt_socket: %s\n", srt_getlasterror_str());
        return 1;
    }

    printf("srt bind address\n");
    sa.sin_family = AF_INET;
    sa.sin_port = htons(atoi(argv[2]));
    if (inet_pton(AF_INET, argv[1], &sa.sin_addr) != 1)
    {
        return 1;
    }

    printf("srt setsockflag\n");
    srt_setsockflag(ss, SRTO_RCVSYN, &yes, sizeof yes);

    printf("srt bind\n");
    st = srt_bind(ss, (struct sockaddr*)&sa, sizeof sa);
    if (st == SRT_ERROR)
    {
        fprintf(stderr, "srt_bind: %s\n", srt_getlasterror_str());
        return 1;
    }

    printf("srt listen\n");
    st = srt_listen(ss, 2);
    if (st == SRT_ERROR)
    {
        fprintf(stderr, "srt_listen: %s\n", srt_getlasterror_str());
        return 1;
    }

    printf("srt accept\n");
    int addr_size = sizeof their_addr;
    int their_fd = srt_accept(ss, (struct sockaddr *)&their_addr, &addr_size);

    int i;
    for (i = 0; i < 100; i++)
    {
        printf("srt recvmsg #%d... ",i);
        char msg[2048];
        st = srt_recvmsg(their_fd, msg, sizeof msg);
        if (st == SRT_ERROR)
        {
            fprintf(stderr, "srt_recvmsg: %s\n", srt_getlasterror_str());
            goto end;
        }

        printf("Got msg of len %d << %s\n", st, msg);
    }

end:
    printf("srt close\n");
    st = srt_close(ss);
    if (st == SRT_ERROR)
    {
        fprintf(stderr, "srt_close: %s\n", srt_getlasterror_str());
        return 1;
    }

    printf("srt cleanup\n");
    srt_cleanup();
    return 0;
}


test-c-client.c
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#define usleep(x) Sleep(x / 1000)
#else
#include <unistd.h>
#endif
#include "srt/srt.h"
int main(int argc, char** argv)
{
    int ss, st;
    struct sockaddr_in sa;
    int yes = 1;
    const char message [] = "This message should be sent to the other side";

    if (argc != 3) {
      fprintf(stderr, "Usage: %s <host> <port>\n", argv[0]);
      return 1;
    }
    printf("srt startup\n");
    srt_startup();

    printf("srt socket\n");
    ss = srt_create_socket();
    if (ss == SRT_ERROR)
    {
        fprintf(stderr, "srt_socket: %s\n", srt_getlasterror_str());
        return 1;
    }
    printf("srt remote address\n");
    sa.sin_family = AF_INET;
    sa.sin_port = htons(atoi(argv[2]));
    if (inet_pton(AF_INET, argv[1], &sa.sin_addr) != 1)
    {
        return 1;
    }
    printf("srt setsockflag\n");
    srt_setsockflag(ss, SRTO_SENDER, &yes, sizeof yes);
    // Test deprecated
    //srt_setsockflag(ss, SRTO_STRICTENC, &yes, sizeof yes);
    printf("srt connect\n");
    st = srt_connect(ss, (struct sockaddr*)&sa, sizeof sa);
    if (st == SRT_ERROR)
    {
        fprintf(stderr, "srt_connect: %s\n", srt_getlasterror_str());
        return 1;
    }

    int i;
    for (i = 0; i < 100; i++)
    {
        printf("srt sendmsg2 #%d >> %s\n",i,message);
        st = srt_sendmsg2(ss, message, sizeof message, NULL);
        if (st == SRT_ERROR)
        {
            fprintf(stderr, "srt_sendmsg: %s\n", srt_getlasterror_str());
            return 1;
        }

        usleep(1000);   // 1 ms
    }


    printf("srt close\n");
    st = srt_close(ss);
    if (st == SRT_ERROR)
    {
        fprintf(stderr, "srt_close: %s\n", srt_getlasterror_str());
        return 1;
    }

    printf("srt cleanup\n");
    srt_cleanup();
    return 0;
}

#gcc -std=c99 -lsrt testcserver.c -o server
gcc  -lsrt test-c-server.c -o server


测试:
./test-c-server 127.0.0.1 10086
./test-c-client 127.0.0.1 10086



docs/api.md要仔细看
srt.h中的接口文件
如果只想看cpp里的注释
grep -nR "//" `find . -name *.cpp`  >zhushi.txt
分享到:
评论

相关推荐

    srt协议的caller模式的c语言源码

    SRT(Secure Reliable Transport)协议是一种专为实时流媒体传输设计的高效、低延迟的传输...通过理解和学习这些知识点,开发者可以更好地利用提供的C语言源码,进一步开发和优化SRT应用,提升实时传输的效率和稳定性。

    字幕文件字幕文件

    非常好的字幕文件非常好的字幕文件非常好的字幕文件

    TXT 转 SRT 字幕

    在压缩包内的“txt转srt”文件中,可能包含了上述转换过程的详细指南,或者是一个实际的转换脚本或程序。使用时,请根据文件类型(如批处理脚本、Python脚本等)和操作系统(Windows、MacOS、Linux)的兼容性来运行...

    B站Json字幕转换为Srt字幕源码

    B站(哔哩哔哩)作为一个流行的视频平台,其字幕格式通常是Json,而Srt是一种广泛支持的、用户友好的字幕格式。这个项目是关于将B站的Json字幕转换为Srt格式的源码实现,这有助于用户在不支持Json字幕的环境下观看...

    没序号webvtt to srt

    2. **创建SRT编号**:由于SRT格式要求每条字幕都有一个唯一的编号,而WebVTT文件通常不包含这样的编号,所以在转换过程中,我们需要为每条字幕自动生成一个序列号。 3. **格式化时间轴**:WebVTT和SRT的时间表示...

    windows编译SRT流媒体协议所有lib和dll以及exe等

    在获取源代码后,打开Visual Studio 2013,创建一个新的解决方案,然后将SRT的源代码文件导入到项目中。配置项目属性以适应32位编译,确保选择正确的平台工具集。编译过程可能需要设置额外的链接器选项,如包含路径...

    android 外挂字幕,目前仅支持SRT格式

    "android 外挂字幕,目前仅支持SRT格式"这一标题揭示了这个项目专注于实现对SRT(SubRip)字幕文件的支持。SRT是一种常见的字幕格式,其结构简单,易于读写,因此成为许多应用程序的首选。 描述中提到,开发者可以...

    srt2txt srt格式文件转txt

    标题 "srt2txt srt格式文件转txt" 涉及的是将srt字幕文件转换成纯文本(txt)格式的过程。srt是一种常见的字幕文件格式,主要用于存储电影、视频或讲座等多媒体内容的同步文字脚本。这种格式包含时间码信息,使得...

    srt字幕制作软件

    【标题】:“srt字幕制作软件” 在多媒体领域,字幕是不可或缺的一部分,尤其对于非母语观众或听力障碍者来说,字幕能够帮助他们理解视频内容。srt(SubRip Subtitle)格式是一种常见的字幕文件格式,被广泛应用于...

    srt.rar_SRT java_srt校准

    5. **写入新SRT文件**:创建一个新的SRT文件,将校准后的时间码和文本写入。 在实际操作中,你可能还需要处理一些特殊情况,如空行、注释行等。此外,为了提高代码的可读性和可维护性,建议将这些功能封装成单独的...

    Srt.sub.edit.rar_SRT显示_Srt edi_edit srt_sub_字幕文件

    标题中的"Srt.sub.edit.rar"是一个压缩包文件,主要用于编辑SRT字幕文件,以便解决在观看电影或视频时,字幕与音频不同步的问题。SRT是一种常见的字幕格式,它包含了时间码和字幕文本,使得我们可以将文字字幕与视频...

    java程序B站json字幕转srt

    这个程序利用了Java的强大处理能力,将B站特有的JSON格式解析,然后转化为SRT这种更为通用的字幕格式。以下是关于这个过程涉及的关键知识点和详细说明: 1. **Java编程语言**:Java是一种广泛使用的面向对象的编程...

    srt制作助手srt16

    《srt制作助手srt16:轻松驾驭字幕制作的艺术》 在多媒体内容日益丰富的今天,字幕作为辅助理解的重要手段,其制作质量直接影响着观众的观看体验。特别是对于外语影片、听障人士以及听力有障碍的人来说,字幕更是不...

    translator-srt:这是一个用于将 SRT (SubRip) 文件翻译成其他语言的 Ruby 库

    这是一个用于将 SRT 文件翻译成其他语言的 Ruby 库。 当前功能包括用于翻译 srt 文件的谷歌翻译。 安装 将此行添加到应用程序的 Gemfile 中: gem 'translator-srt' 或者从 github 添加最新版本: gem '...

    【VTT转换SRT工具】Vtt2Srt 1.0.0.0

    在UI上选择一个文件夹目录,这个工具会自动把这个目录下(包括子目录)的所有VTT文件自动转化成SRT文件。这样方便影音播放软件自动加载字幕。 注:这是第一个版本,如果在使用过程中遇到什么问题,请回帖。我会升级...

    srt字幕分析器代码-Java版简易版

    【标题】"srt字幕分析器代码-Java版简易版"揭示了这是一...这个项目为学习Java编程和理解SRT字幕格式提供了一个实用的实践平台,有助于提升对文本解析和文件操作的理解,同时也展示了如何将理论知识应用到实际项目中。

    SRT流媒体协议启用实测

    - 在“Stream Files”中添加SRT接收链接,例如:“srt://0.0.0.0:9998”。 - 设置应用和流属性,选择SRT作为传输协议。 3. **推流客户端配置**: - 使用Larix Broadcaster APP进行推流。 - 配置SRT流地址,格式...

    SRT2TXT:将srt转换为txt-开源

    标题中的"SRT2TXT"指的是一个工具或程序,它的功能是将SRT字幕文件转换成纯文本(TXT)格式。SRT文件是一种常见的字幕文件格式,常用于电影、视频或讲座等多媒体内容的字幕,其中包含了时间码和对应的字幕文本。这种...

    SRT协议技术概述草案

    SRT能够实时检测并适应两个终端之间的网络状况变化,自动调整传输策略以应对网络抖动、带宽波动等问题。 ##### 2.5 改进的控制包机制 SRT引入了改进的控制包机制,用于更高效地管理数据包的发送与接收,提高传输...

    srt-editor:在线字幕编辑器(.srt 文件)

    在互联网上,srt-editor 是一个基于 JavaScript 开发的在线版本,它为用户提供了方便快捷的方式来处理.srt 字幕文件,无需安装任何桌面应用程序。 JavaScript,一种广泛使用的编程语言,是构建这个在线编辑器的核心...

Global site tag (gtag.js) - Google Analytics