• SRT一个简单的客户端和服务端


    1.客户端

            支持将UDP数据流接收后进行SRT流的推送,也支持从服务端拉取SRT流,同时支持SRT会话模式的测试。项目依赖于msprotocol: 一个轻量级的网络协议,扩展方便使用简单。可应用于X86和ARM64嵌入式设备,目前已支持file,hls,http,rtmp,msav,raw,rtp,rtsp,tcp,udp,udplite,srt等协议;

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. #include
    16. #include
    17. #include
    18. #include
    19. #include
    20. #include
    21. #define FLAG "PTC_CLENT"
    22. #define mshostname_ipaddr "192.168.200.244"
    23. #define mshostname_port 50000
    24. #define mshostname_url_http "http://127.0.0.1:8010/ch31.ts"
    25. #define mshostname_url_rtsp "rtsp://127.0.0.1:8010/ch31.ts"
    26. int main(int argc, char **argv)
    27. {
    28. mslog_api_init( 53, ms_null,ms_null, ms_null);
    29. if(argc<2){
    30. ms_error("Userage:%s url" ,argv[0]);
    31. return 0;
    32. }
    33. msthread_api_setName("ptc_client");
    34. msmem_api_init(ms_false);
    35. msptc_api_init();
    36. msptc_api_register();
    37. msmd_api_setUlimit();
    38. ms_debug("Get param");
    39. mslog_api_init( 53, "/home/sugao","client.log", ms_null);
    40. URLContext cilent_ctt;
    41. URLContext *pcilent_ctt=&cilent_ctt;
    42. ms_memset0(pcilent_ctt, sizeof(URLContext));
    43. ms_strcpy(pcilent_ctt->url,(argv[1]));
    44. //Get msptl_in
    45. msptc_api_urlSplit_urlctt(pcilent_ctt);
    46. URLProtocol *msptl_in=msptc_api_match(pcilent_ctt->url_info.protocol_name);
    47. ms_debug("url_open");
    48. if(ms_strncmp_saeq(msptl_in->name, PTLNAME_WEBSOCKECT)){
    49. pcilent_ctt->urlctt_opt.ws_opt.dataType=WDT_TXTDATA;
    50. }
    51. if(msptl_in->url_open(pcilent_ctt)<0){
    52. ms_errGoto(ms_end, "open %s failed",pcilent_ctt->url);
    53. }
    54. ms_sleep(1);
    55. ms_debug("url_write");
    56. ms_byte *sendstr="Hello,I am client";
    57. ms_s32 len_need_send=ms_buflen(sendstr);
    58. ms_s32 len_send=msptl_in->url_write(pcilent_ctt,sendstr,len_need_send);
    59. if(len_send>0){
    60. ms_verbose("test:Send success!(len_send,len_need_send:%d,%d)-Context:%s%s ",len_send,len_need_send,LINE_END,sendstr);
    61. if(ms_strncmp_saeq(msptl_in->name, PTLNAME_WEBSOCKECT)){
    62. ms_verbose("dataType:%d ",pcilent_ctt->urlctt_opt.ws_opt.dataType);
    63. }
    64. }else{
    65. ms_error("test:Send failed!(len_send,len_need_send:%d,%d)-Context:%s%s ",len_send,len_need_send,LINE_END,sendstr);
    66. }
    67. ms_sleep(1);
    68. ms_byte recvbuf[1024]={0};
    69. ms_debug("url_read");
    70. ms_s32 len=msptl_in->url_read(pcilent_ctt,recvbuf,ms_bufsize(recvbuf));
    71. if(len>0){
    72. ms_verbose("test:Read success!Context:%s%s", LINE_END,recvbuf);
    73. if(ms_strncmp_saeq(msptl_in->name, PTLNAME_WEBSOCKECT)){
    74. ms_verbose("dataType:%d ",pcilent_ctt->urlctt_opt.ws_opt.dataType);
    75. }
    76. }else{
    77. ms_error("test:Read failed!");
    78. }
    79. msptl_in->url_close(pcilent_ctt);
    80. ms_end:
    81. msptc_api_deinit();
    82. msmem_api_deinit();
    83. mslog_api_deinit();
    84. }
    85. #undef MAIN_C

    2.服务端

            支持接收SRT推流,并转换为UDP输出。项目依赖于msprotocol: 一个轻量级的网络协议,扩展方便使用简单。可应用于X86和ARM64嵌入式设备,目前已支持file,hls,http,rtmp,msav,raw,rtp,rtsp,tcp,udp,udplite,srt等协议;

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. #include
    16. #include
    17. #define FLAG "SRTSERVER_SAMPLE"
    18. static char * pinurl=ms_null;
    19. static char * pouturl=ms_null;
    20. void* srtserver_send(void* args)
    21. {
    22. URLVal *purlval_srt=(URLVal *)args;
    23. URLVal urlval_udp;
    24. memset(&urlval_udp,0,sizeof(URLVal));
    25. urlval_udp.purl_ptl=msptc_api_match(PTLNAME_UDP);
    26. ms_strcpy(urlval_udp.url_ctt.url, pouturl);
    27. urlval_udp.url_ctt.urlctt_opt.udp_opt.interfacein="p2p1";
    28. urlval_udp.url_ctt.urlctt_opt.udp_opt.localhostipin="192.168.200.244";
    29. urlval_udp.url_ctt.flags|=FLAG_WRITE;
    30. if(urlval_udp.purl_ptl->url_open(&urlval_udp.url_ctt)<0){
    31. ms_errExit(-1, "Open in url failed");
    32. }
    33. char data[1316]={0};
    34. while (1){
    35. int recvlen=purlval_srt->purl_ptl->url_read(&purlval_srt->url_ctt,data,sizeof(data));
    36. if(recvlen>0){
    37. if (urlval_udp.purl_ptl->url_write(&urlval_udp.url_ctt, data , recvlen)<0){
    38. printf("url_write failed\r\n");
    39. break;
    40. }
    41. }
    42. }
    43. urlval_udp.purl_ptl->url_close(&urlval_udp.url_ctt);
    44. return NULL;
    45. }
    46. int main(int argc, char **argv)
    47. {
    48. mslog_api_init( 54, ms_null,ms_null, ms_null);
    49. if(3!=argc){
    50. ms_error("usage:%s inurl(srt) outurl(udp)",argv[0]);
    51. mslog_api_deinit();
    52. return -1;
    53. }
    54. pinurl=argv[1];
    55. pouturl=argv[2];
    56. msptc_api_init();
    57. msptc_api_register();
    58. URLVal urlval_srt;
    59. memset(&urlval_srt,0,sizeof(URLVal));
    60. urlval_srt.purl_ptl=msptc_api_match(PTLNAME_SRT);
    61. ms_memset(&urlval_srt.url_ctt,0,sizeof(URLContext));
    62. ms_strcpy(urlval_srt.url_ctt.url, pinurl);
    63. urlval_srt.url_ctt.urlctt_opt.srt_opt.listen=1;
    64. if(urlval_srt.purl_ptl->url_open(&urlval_srt.url_ctt)<0){
    65. ms_errExit(-1, "Open out url failed");
    66. }
    67. char buf[2048]={0};
    68. int len=0;
    69. int recver=0;
    70. while(1){
    71. recver=urlval_srt.purl_ptl->priv_func.srt.accept(&urlval_srt.url_ctt);
    72. if(recver<0){
    73. ms_errRet(-1, "url_accept error");
    74. }
    75. pthread_t rcvthread;
    76. pthread_create(&rcvthread, NULL, srtserver_send, &urlval_srt);
    77. ms_sleep(1);
    78. }
    79. urlval_srt.purl_ptl->url_close(&urlval_srt.url_ctt);
    80. msptc_api_deinit();
    81. mslog_api_deinit();
    82. }
    83. #undef MAIN_C
  • 相关阅读:
    秋招每日一题T30——每个元音包含偶数次的最长子字符串
    (附源码)ssm学生考勤管理系统 毕业设计 260952
    Office 2019 激活-探索(仅供参考)
    java 实现二维码打印并设计标题
    【第28天】给定一个字符串S,请你判断它是否为回文字符串 | 回文的判断
    画图中编辑颜色47种颜色rgb格式
    PCL库点云小知识
    基于Restful的WebService
    为 Go 开发配置Visual Studio Code
    7. dws 层建设(大宽表)
  • 原文地址:https://blog.csdn.net/weixin_35804181/article/details/132906837