当前位置: 首页 > news >正文

zlmediakit实现rtsp流服务器

本次实现是将内存中的H264数据经过zlmediakit实现为rtsp流。

我是用的是CAPI的方式,将zlmediakit作为一个sdk嵌入到自己的程序中而不是作为一个独立的进进程服务。

1.编译完成zkmedialit后会得到bin include lib三个文件夹如图

其中bin中的MediaServer是作为独立的进程使用的zlmediakit服务,我们这里不用

我们使用lib下的libmk_api.so

下面说一些使用的API以及调用顺序

1.首先包含头文件

#include "mk_mediakit.h"

2.从zkmediakit工程中拷贝demo的配置文件config.ini过来

3.初始化环境,日志以及设置配置文件

  char *ini_path = mk_util_get_exe_dir("config.ini");mk_config config = {.ini = ini_path,.ini_is_path = 1,.log_level = 0,.log_mask = LOG_CONSOLE,.log_file_path = NULL,.log_file_days = 0,.ssl = NULL,.ssl_is_path = 1,.ssl_pwd = NULL,.thread_num = 0};mk_env_init(&config);mk_free(ini_path);

4.启动各个服务

 mk_http_server_start(80, 0);mk_rtsp_server_start(554, 0);mk_rtmp_server_start(1935, 0);mk_rtc_server_start(atoi(mk_get_option("rtc.port")));

5.监听事件,我这里没有处理所以把回调都设置为空

    mk_events events = {.on_mk_media_changed = NULL,.on_mk_media_publish = NULL,.on_mk_media_play = NULL,.on_mk_media_not_found = NULL,.on_mk_media_no_reader = NULL,.on_mk_http_request = NULL,.on_mk_http_access = NULL,.on_mk_http_before_access = NULL,.on_mk_rtsp_get_realm = NULL,.on_mk_rtsp_auth = NULL,.on_mk_record_mp4 = NULL,.on_mk_shell_login = NULL,.on_mk_flow_report = NULL};mk_events_listen(&events);

6.创建媒体源

 mk_media media = mk_media_create("__defaultVhost__", "live", "stream1", 0, 0, 0);

这么写的话最终rtsp日志为rtsp://ip:554/live/stream1

7.添加视频轨道并设置视频编码参数

    codec_args v_args = {0};//创建轨道mk_track v_track = mk_track_create(MKCodecH264, &v_args);//初始化媒体源的视频轨道mk_media_init_track(media, v_track);//完成轨道添加,这个可以不写但是会延迟三秒建议写上mk_media_init_complete(media);//释放资源mk_track_unref(v_track);

8.循环网里面塞入H264帧,记得计算dts我这里是25帧所以每一帧dts加40

    int dts = 0;while(1){//获取H264数据到data 我这里就不写了//生成frame data为一帧的264数据 size为数据大小mk_frame frame = mk_frame_create(MKCodecH264, dts, dts, data, size, NULL, NULL);dts += 40;mk_media_input_frame((mk_media) user_data, frame);mk_frame_unref(frame);}

9.程序结束的时候调用下面销毁资源

    mk_media_release(media);mk_stop_all_server();

相关文章:

  • 力扣104. 二叉树的最大深度
  • pytorch导出rot90算子至onnx
  • 24. 深度学习进阶 - 矩阵运算的维度和激活函数
  • 嵌入式硬件电路·电平
  • Linux中vi常用命令-批量替换
  • 智能医疗越发周到!新的机器人系统评估中风后的活动能力
  • 从零开始学习管道:管道程序的优化和文件描述符继承问题
  • gitee推荐-1Panel
  • 搜索百度可以直接生成代码拉
  • 【广州华锐互动】节约用水VR互动教育:身临其境体验水资源的珍贵!
  • ubuntu/vscode下的c/c++开发之-CMake语法与练习
  • Git多库多账号本地SSH连接配置方法
  • gitea仓库镜像同步至gitlab
  • 阿里云跨账号建立局域网
  • 深入理解RC4加密算法
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • in typeof instanceof ===这些运算符有什么作用
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • learning koa2.x
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • rc-form之最单纯情况
  • vue中实现单选
  • 从0到1:PostCSS 插件开发最佳实践
  • 第十八天-企业应用架构模式-基本模式
  • 前端路由实现-history
  • 前言-如何学习区块链
  • 十年未变!安全,谁之责?(下)
  • 如何在招聘中考核.NET架构师
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $.ajax中的eval及dataType
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (十六)Flask之蓝图
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .apk文件,IIS不支持下载解决
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 8.0 中有哪些新的变化?
  • .Net mvc总结
  • .net MySql
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 程序发生了一个不可捕获的异常
  • .NET和.COM和.CN域名区别
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET开发者必备的11款免费工具
  • .net生成的类,跨工程调用显示注释
  • /bin/rm: 参数列表过长"的解决办法
  • /var/log/cvslog 太大
  • []sim300 GPRS数据收发程序