参考:
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(Secure Reliable Transport)协议是一种专为实时流媒体传输设计的高效、低延迟的传输...通过理解和学习这些知识点,开发者可以更好地利用提供的C语言源码,进一步开发和优化SRT应用,提升实时传输的效率和稳定性。
非常好的字幕文件非常好的字幕文件非常好的字幕文件
在压缩包内的“txt转srt”文件中,可能包含了上述转换过程的详细指南,或者是一个实际的转换脚本或程序。使用时,请根据文件类型(如批处理脚本、Python脚本等)和操作系统(Windows、MacOS、Linux)的兼容性来运行...
B站(哔哩哔哩)作为一个流行的视频平台,其字幕格式通常是Json,而Srt是一种广泛支持的、用户友好的字幕格式。这个项目是关于将B站的Json字幕转换为Srt格式的源码实现,这有助于用户在不支持Json字幕的环境下观看...
2. **创建SRT编号**:由于SRT格式要求每条字幕都有一个唯一的编号,而WebVTT文件通常不包含这样的编号,所以在转换过程中,我们需要为每条字幕自动生成一个序列号。 3. **格式化时间轴**:WebVTT和SRT的时间表示...
在获取源代码后,打开Visual Studio 2013,创建一个新的解决方案,然后将SRT的源代码文件导入到项目中。配置项目属性以适应32位编译,确保选择正确的平台工具集。编译过程可能需要设置额外的链接器选项,如包含路径...
"android 外挂字幕,目前仅支持SRT格式"这一标题揭示了这个项目专注于实现对SRT(SubRip)字幕文件的支持。SRT是一种常见的字幕格式,其结构简单,易于读写,因此成为许多应用程序的首选。 描述中提到,开发者可以...
标题 "srt2txt srt格式文件转txt" 涉及的是将srt字幕文件转换成纯文本(txt)格式的过程。srt是一种常见的字幕文件格式,主要用于存储电影、视频或讲座等多媒体内容的同步文字脚本。这种格式包含时间码信息,使得...
【标题】:“srt字幕制作软件” 在多媒体领域,字幕是不可或缺的一部分,尤其对于非母语观众或听力障碍者来说,字幕能够帮助他们理解视频内容。srt(SubRip Subtitle)格式是一种常见的字幕文件格式,被广泛应用于...
5. **写入新SRT文件**:创建一个新的SRT文件,将校准后的时间码和文本写入。 在实际操作中,你可能还需要处理一些特殊情况,如空行、注释行等。此外,为了提高代码的可读性和可维护性,建议将这些功能封装成单独的...
标题中的"Srt.sub.edit.rar"是一个压缩包文件,主要用于编辑SRT字幕文件,以便解决在观看电影或视频时,字幕与音频不同步的问题。SRT是一种常见的字幕格式,它包含了时间码和字幕文本,使得我们可以将文字字幕与视频...
这个程序利用了Java的强大处理能力,将B站特有的JSON格式解析,然后转化为SRT这种更为通用的字幕格式。以下是关于这个过程涉及的关键知识点和详细说明: 1. **Java编程语言**:Java是一种广泛使用的面向对象的编程...
《srt制作助手srt16:轻松驾驭字幕制作的艺术》 在多媒体内容日益丰富的今天,字幕作为辅助理解的重要手段,其制作质量直接影响着观众的观看体验。特别是对于外语影片、听障人士以及听力有障碍的人来说,字幕更是不...
这是一个用于将 SRT 文件翻译成其他语言的 Ruby 库。 当前功能包括用于翻译 srt 文件的谷歌翻译。 安装 将此行添加到应用程序的 Gemfile 中: gem 'translator-srt' 或者从 github 添加最新版本: gem '...
在UI上选择一个文件夹目录,这个工具会自动把这个目录下(包括子目录)的所有VTT文件自动转化成SRT文件。这样方便影音播放软件自动加载字幕。 注:这是第一个版本,如果在使用过程中遇到什么问题,请回帖。我会升级...
【标题】"srt字幕分析器代码-Java版简易版"揭示了这是一...这个项目为学习Java编程和理解SRT字幕格式提供了一个实用的实践平台,有助于提升对文本解析和文件操作的理解,同时也展示了如何将理论知识应用到实际项目中。
标题中的"SRT2TXT"指的是一个工具或程序,它的功能是将SRT字幕文件转换成纯文本(TXT)格式。SRT文件是一种常见的字幕文件格式,常用于电影、视频或讲座等多媒体内容的字幕,其中包含了时间码和对应的字幕文本。这种...
SRT能够实时检测并适应两个终端之间的网络状况变化,自动调整传输策略以应对网络抖动、带宽波动等问题。 ##### 2.5 改进的控制包机制 SRT引入了改进的控制包机制,用于更高效地管理数据包的发送与接收,提高传输...
在互联网上,srt-editor 是一个基于 JavaScript 开发的在线版本,它为用户提供了方便快捷的方式来处理.srt 字幕文件,无需安装任何桌面应用程序。 JavaScript,一种广泛使用的编程语言,是构建这个在线编辑器的核心...
例如,如果你有一个KRC格式的卡拉OK歌词文件,但你需要在不支持KRC的设备或平台上显示字幕,那么你可以通过这个工具将其转换为LRC或SRT格式。同样,如果你拥有的是一些LRC格式的歌词,但需要为视频制作字幕,可以将...