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();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/217099.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在新疆乌鲁木齐的汽车托运

在新疆乌鲁木齐要托运的宝! 看过来了 找汽车托运公司了 连夜吐血给你们整理了攻略!! ⬇️以下: 1 网上搜索 可以在搜索引擎或专业的货运平台上搜索相关的汽车托运公司信息。在网站上可以了解到公司的服务范围、托运价格、运输时效等信息,也可以参考其他车…

Hive内置表生成函数

Hive内置UDTF 1、UDF、UDAF、UDTF简介2、Hive内置UDTF 1、UDF、UDAF、UDTF简介 在Hive中,所有的运算符和用户定义函数,包括用户定义的和内置的,统称为UDF(User-Defined Functions)。如下图所示: UDF官方文档…

Proto3语法详解01

1.字段规则 消息的字段可以用下面几种规则来修饰: ●singular: 消息中可以包含该字段零次或一次(不超过一次)。proto3语法中,字段默认使用该 规则。 ●repeated :消息中可以包含该字段任意多次(包括零次),其中重复值的顺序会被保留。可以理 解为定义了一…

MYSQL基础知识之【数据类型】

文章目录 前言标题一数值类型日期和时间类型字符串类型后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错…

基于51单片机的FM数字收音机系统电路设计

**单片机设计介绍,基于51单片机的FM数字收音机系统电路设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的FM数字收音机系统是一种用于接收和播放FM广播信号的设备,以下是一个基本的电路设…

LeetCode OJ循环队列(C语言)

1.题目的初步分析 我们分析上述题目的时候会发现题目非常的长,不好整理思路,我这里可以大致的将本题的几个核心点说出来: 1.队列的思路 循环队列说来说去不还是队列嘛,那么队列的基本操作增删查改、以及队列的基本结构肯定都是不能…

sql查询优化实际案例

1、第一步:sql优化 正对于海量数据的查询优化,且外键关联比较多的情况,通常情况是下sql层面的优化,有些时候是由于sql不合理的编写导致,如尽量少使用sql内查询等 如:避免使用 left join (select * form …

排序算法-----基数排序

目录 前言 基数排序 算法思想 ​编辑 算法示例 代码实现 1.队列queue.h 头文件 2.队列queue.c 源文件 3.主函数(radix_sort实现) 算法分析 前言 今天我想把前面未更新完的排序算法补充一下,也就是基数排序的一种,这是跟…

【数据库】数据库物理执行计划最基本操作-表扫描机制与可选路径,基于代价的评估模型以及模型参数的含义

物理执行计划基本操作符 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏…

css三角,鼠标样式,溢出文字

目录 css三角 鼠标样式 例子:页码模块 溢出文字表示方式 margin负值运用 css三角强化 css三角 css三角中:line-height:0和font-size:0是防止兼容性的问题 jd {position: relative;width: 120px;height: 249px;background-…

斐讯K2结合Padavan实现锐捷认证破解方法

前言 众所周知,校园网在传统模式下是不能直接插路由使用的,但苦于校园网只能连接一台设备的烦恼,不得不“另辟蹊径”来寻求新的解决路径,这不,它来了,它来了,它带着希望走来了。 本文基于斐讯…

电子学会C/C++编程等级考试2021年09月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:字符统计 给定一个由a-z这26个字符组成的字符串,统计其中哪个字符出现的次数最多。输入 输入包含一行,一个字符串,长度不超过1000。输出 输出一行,包括出现次数最多的字符和该字符出现的次数,中间以一个空格分开。如果有多…