rknn_usb_rtsp-master/ 这是RTSP推流的代码,用了rockcip硬件推流
This commit is contained in:
212
rknn_usb_rtsp-master/mk_api/include/mk_common.h
Normal file
212
rknn_usb_rtsp-master/mk_api/include/mk_common.h
Normal file
@@ -0,0 +1,212 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_COMMON_H
|
||||
#define MK_COMMON_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#if defined(GENERATE_EXPORT)
|
||||
#include "mk_export.h"
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) && defined(_MSC_VER)
|
||||
# define API_CALL __cdecl
|
||||
#else
|
||||
# define API_CALL
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) && defined(_MSC_VER)
|
||||
# if !defined(GENERATE_EXPORT)
|
||||
# if defined(MediaKitApi_EXPORTS)
|
||||
# define API_EXPORT __declspec(dllexport)
|
||||
# else
|
||||
# define API_EXPORT __declspec(dllimport)
|
||||
# endif
|
||||
# endif
|
||||
#elif !defined(GENERATE_EXPORT)
|
||||
# define API_EXPORT __attribute__((visibility("default")))
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//输出日志到shell
|
||||
#define LOG_CONSOLE (1 << 0)
|
||||
//输出日志到文件
|
||||
#define LOG_FILE (1 << 1)
|
||||
//输出日志到回调函数(mk_events::on_mk_log)
|
||||
#define LOG_CALLBACK (1 << 2)
|
||||
|
||||
//回调user_data回调函数
|
||||
typedef void(API_CALL *on_user_data_free)(void *user_data);
|
||||
|
||||
typedef struct {
|
||||
// 线程数
|
||||
int thread_num;
|
||||
|
||||
// 日志级别,支持0~4
|
||||
int log_level;
|
||||
//控制日志输出的掩模,请查看LOG_CONSOLE、LOG_FILE、LOG_CALLBACK等宏
|
||||
int log_mask;
|
||||
//文件日志保存路径,路径可以不存在(内部可以创建文件夹),设置为NULL关闭日志输出至文件
|
||||
const char *log_file_path;
|
||||
//文件日志保存天数,设置为0关闭日志文件
|
||||
int log_file_days;
|
||||
|
||||
// 配置文件是内容还是路径
|
||||
int ini_is_path;
|
||||
// 配置文件内容或路径,可以为NULL,如果该文件不存在,那么将导出默认配置至该文件
|
||||
const char *ini;
|
||||
|
||||
// ssl证书是内容还是路径
|
||||
int ssl_is_path;
|
||||
// ssl证书内容或路径,可以为NULL
|
||||
const char *ssl;
|
||||
// 证书密码,可以为NULL
|
||||
const char *ssl_pwd;
|
||||
} mk_config;
|
||||
|
||||
/**
|
||||
* 初始化环境,调用该库前需要先调用此函数
|
||||
* @param cfg 库运行相关参数
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_env_init(const mk_config *cfg);
|
||||
|
||||
/**
|
||||
* 关闭所有服务器,请在main函数退出时调用
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_stop_all_server();
|
||||
|
||||
/**
|
||||
* 基础类型参数版本的mk_env_init,为了方便其他语言调用
|
||||
* @param thread_num 线程数
|
||||
* @param log_level 日志级别,支持0~4
|
||||
* @param log_mask 日志输出方式掩模,请查看LOG_CONSOLE、LOG_FILE、LOG_CALLBACK等宏
|
||||
* @param log_file_path 文件日志保存路径,路径可以不存在(内部可以创建文件夹),设置为NULL关闭日志输出至文件
|
||||
* @param log_file_days 文件日志保存天数,设置为0关闭日志文件
|
||||
* @param ini_is_path 配置文件是内容还是路径
|
||||
* @param ini 配置文件内容或路径,可以为NULL,如果该文件不存在,那么将导出默认配置至该文件
|
||||
* @param ssl_is_path ssl证书是内容还是路径
|
||||
* @param ssl ssl证书内容或路径,可以为NULL
|
||||
* @param ssl_pwd 证书密码,可以为NULL
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_env_init1(int thread_num,
|
||||
int log_level,
|
||||
int log_mask,
|
||||
const char *log_file_path,
|
||||
int log_file_days,
|
||||
int ini_is_path,
|
||||
const char *ini,
|
||||
int ssl_is_path,
|
||||
const char *ssl,
|
||||
const char *ssl_pwd);
|
||||
|
||||
/**
|
||||
* 设置日志文件
|
||||
* @param file_max_size 单个切片文件大小(MB)
|
||||
* @param file_max_count 切片文件个数
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_set_log(int file_max_size, int file_max_count);
|
||||
|
||||
/**
|
||||
* 设置配置项
|
||||
* @deprecated 请使用mk_ini_set_option替代
|
||||
* @param key 配置项名
|
||||
* @param val 配置项值
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_set_option(const char *key, const char *val);
|
||||
|
||||
/**
|
||||
* 获取配置项的值
|
||||
* @deprecated 请使用mk_ini_get_option替代
|
||||
* @param key 配置项名
|
||||
*/
|
||||
API_EXPORT const char * API_CALL mk_get_option(const char *key);
|
||||
|
||||
|
||||
/**
|
||||
* 创建http[s]服务器
|
||||
* @param port htt监听端口,推荐80,传入0则随机分配
|
||||
* @param ssl 是否为ssl类型服务器
|
||||
* @return 0:失败,非0:端口号
|
||||
*/
|
||||
API_EXPORT uint16_t API_CALL mk_http_server_start(uint16_t port, int ssl);
|
||||
|
||||
/**
|
||||
* 创建rtsp[s]服务器
|
||||
* @param port rtsp监听端口,推荐554,传入0则随机分配
|
||||
* @param ssl 是否为ssl类型服务器
|
||||
* @return 0:失败,非0:端口号
|
||||
*/
|
||||
API_EXPORT uint16_t API_CALL mk_rtsp_server_start(uint16_t port, int ssl);
|
||||
|
||||
/**
|
||||
* 创建rtmp[s]服务器
|
||||
* @param port rtmp监听端口,推荐1935,传入0则随机分配
|
||||
* @param ssl 是否为ssl类型服务器
|
||||
* @return 0:失败,非0:端口号
|
||||
*/
|
||||
API_EXPORT uint16_t API_CALL mk_rtmp_server_start(uint16_t port, int ssl);
|
||||
|
||||
/**
|
||||
* 创建rtp服务器
|
||||
* @param port rtp监听端口(包括udp/tcp)
|
||||
* @return 0:失败,非0:端口号
|
||||
*/
|
||||
API_EXPORT uint16_t API_CALL mk_rtp_server_start(uint16_t port);
|
||||
|
||||
/**
|
||||
* 创建rtc服务器
|
||||
* @param port rtc监听端口
|
||||
* @return 0:失败,非0:端口号
|
||||
*/
|
||||
API_EXPORT uint16_t API_CALL mk_rtc_server_start(uint16_t port);
|
||||
|
||||
//获取webrtc answer sdp回调函数
|
||||
typedef void(API_CALL *on_mk_webrtc_get_answer_sdp)(void *user_data, const char *answer, const char *err);
|
||||
|
||||
/**
|
||||
* webrtc交换sdp,根据offer sdp生成answer sdp
|
||||
* @param user_data 回调用户指针
|
||||
* @param cb 回调函数
|
||||
* @param type webrtc插件类型,支持echo,play,push
|
||||
* @param offer webrtc offer sdp
|
||||
* @param url rtc url, 例如 rtc://__defaultVhost/app/stream?key1=val1&key2=val2
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_webrtc_get_answer_sdp(void *user_data, on_mk_webrtc_get_answer_sdp cb, const char *type,
|
||||
const char *offer, const char *url);
|
||||
|
||||
API_EXPORT void API_CALL mk_webrtc_get_answer_sdp2(void *user_data, on_user_data_free user_data_free, on_mk_webrtc_get_answer_sdp cb, const char *type,
|
||||
const char *offer, const char *url);
|
||||
|
||||
/**
|
||||
* 创建srt服务器
|
||||
* @param port srt监听端口
|
||||
* @return 0:失败,非0:端口号
|
||||
*/
|
||||
API_EXPORT uint16_t API_CALL mk_srt_server_start(uint16_t port);
|
||||
|
||||
|
||||
/**
|
||||
* 创建shell服务器
|
||||
* @param port shell监听端口
|
||||
* @return 0:失败,非0:端口号
|
||||
*/
|
||||
API_EXPORT uint16_t API_CALL mk_shell_server_start(uint16_t port);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* MK_COMMON_H */
|
||||
193
rknn_usb_rtsp-master/mk_api/include/mk_events.h
Normal file
193
rknn_usb_rtsp-master/mk_api/include/mk_events.h
Normal file
@@ -0,0 +1,193 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_EVENTS_H
|
||||
#define MK_EVENTS_H
|
||||
|
||||
#include "mk_common.h"
|
||||
#include "mk_events_objects.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
/**
|
||||
* 注册或反注册MediaSource事件广播
|
||||
* @param regist 注册为1,注销为0
|
||||
* @param sender 该MediaSource对象
|
||||
*/
|
||||
void (API_CALL *on_mk_media_changed)(int regist,
|
||||
const mk_media_source sender);
|
||||
|
||||
/**
|
||||
* 收到rtsp/rtmp推流事件广播,通过该事件控制推流鉴权
|
||||
* @see mk_publish_auth_invoker_do
|
||||
* @param url_info 推流url相关信息
|
||||
* @param invoker 执行invoker返回鉴权结果
|
||||
* @param sender 该tcp客户端相关信息
|
||||
*/
|
||||
void (API_CALL *on_mk_media_publish)(const mk_media_info url_info,
|
||||
const mk_publish_auth_invoker invoker,
|
||||
const mk_sock_info sender);
|
||||
|
||||
/**
|
||||
* 播放rtsp/rtmp/http-flv/hls事件广播,通过该事件控制播放鉴权
|
||||
* @see mk_auth_invoker_do
|
||||
* @param url_info 播放url相关信息
|
||||
* @param invoker 执行invoker返回鉴权结果
|
||||
* @param sender 播放客户端相关信息
|
||||
*/
|
||||
void (API_CALL *on_mk_media_play)(const mk_media_info url_info,
|
||||
const mk_auth_invoker invoker,
|
||||
const mk_sock_info sender);
|
||||
|
||||
/**
|
||||
* 未找到流后会广播该事件,请在监听该事件后去拉流或其他方式产生流,这样就能按需拉流了
|
||||
* @param url_info 播放url相关信息
|
||||
* @param sender 播放客户端相关信息
|
||||
* @return 1 直接关闭
|
||||
* 0 等待流注册
|
||||
*/
|
||||
int (API_CALL *on_mk_media_not_found)(const mk_media_info url_info,
|
||||
const mk_sock_info sender);
|
||||
|
||||
/**
|
||||
* 某个流无人消费时触发,目的为了实现无人观看时主动断开拉流等业务逻辑
|
||||
* @param sender 该MediaSource对象
|
||||
*/
|
||||
void (API_CALL *on_mk_media_no_reader)(const mk_media_source sender);
|
||||
|
||||
/**
|
||||
* 收到http api请求广播(包括GET/POST)
|
||||
* @param parser http请求内容对象
|
||||
* @param invoker 执行该invoker返回http回复
|
||||
* @param consumed 置1则说明我们要处理该事件
|
||||
* @param sender http客户端相关信息
|
||||
*/
|
||||
void (API_CALL *on_mk_http_request)(const mk_parser parser,
|
||||
const mk_http_response_invoker invoker,
|
||||
int *consumed,
|
||||
const mk_sock_info sender);
|
||||
|
||||
/**
|
||||
* 在http文件服务器中,收到http访问文件或目录的广播,通过该事件控制访问http目录的权限
|
||||
* @param parser http请求内容对象
|
||||
* @param path 文件绝对路径
|
||||
* @param is_dir path是否为文件夹
|
||||
* @param invoker 执行invoker返回本次访问文件的结果
|
||||
* @param sender http客户端相关信息
|
||||
*/
|
||||
void (API_CALL *on_mk_http_access)(const mk_parser parser,
|
||||
const char *path,
|
||||
int is_dir,
|
||||
const mk_http_access_path_invoker invoker,
|
||||
const mk_sock_info sender);
|
||||
|
||||
/**
|
||||
* 在http文件服务器中,收到http访问文件或目录前的广播,通过该事件可以控制http url到文件路径的映射
|
||||
* 在该事件中通过自行覆盖path参数,可以做到譬如根据虚拟主机或者app选择不同http根目录的目的
|
||||
* @param parser http请求内容对象
|
||||
* @param path 文件绝对路径,覆盖之可以重定向到其他文件
|
||||
* @param sender http客户端相关信息
|
||||
*/
|
||||
void (API_CALL *on_mk_http_before_access)(const mk_parser parser,
|
||||
char *path,
|
||||
const mk_sock_info sender);
|
||||
|
||||
/**
|
||||
* 该rtsp流是否需要认证?是的话调用invoker并传入realm,否则传入空的realm
|
||||
* @param url_info 请求rtsp url相关信息
|
||||
* @param invoker 执行invoker返回是否需要rtsp专属认证
|
||||
* @param sender rtsp客户端相关信息
|
||||
*/
|
||||
void (API_CALL *on_mk_rtsp_get_realm)(const mk_media_info url_info,
|
||||
const mk_rtsp_get_realm_invoker invoker,
|
||||
const mk_sock_info sender);
|
||||
|
||||
/**
|
||||
* 请求认证用户密码事件,user_name为用户名,must_no_encrypt如果为true,则必须提供明文密码(因为此时是base64认证方式),否则会导致认证失败
|
||||
* 获取到密码后请调用invoker并输入对应类型的密码和密码类型,invoker执行时会匹配密码
|
||||
* @param url_info 请求rtsp url相关信息
|
||||
* @param realm rtsp认证realm
|
||||
* @param user_name rtsp认证用户名
|
||||
* @param must_no_encrypt 如果为true,则必须提供明文密码(因为此时是base64认证方式),否则会导致认证失败
|
||||
* @param invoker 执行invoker返回rtsp专属认证的密码
|
||||
* @param sender rtsp客户端信息
|
||||
*/
|
||||
void (API_CALL *on_mk_rtsp_auth)(const mk_media_info url_info,
|
||||
const char *realm,
|
||||
const char *user_name,
|
||||
int must_no_encrypt,
|
||||
const mk_rtsp_auth_invoker invoker,
|
||||
const mk_sock_info sender);
|
||||
|
||||
/**
|
||||
* 录制mp4分片文件成功后广播
|
||||
*/
|
||||
void (API_CALL *on_mk_record_mp4)(const mk_mp4_info mp4);
|
||||
|
||||
/**
|
||||
* shell登录鉴权
|
||||
*/
|
||||
void (API_CALL *on_mk_shell_login)(const char *user_name,
|
||||
const char *passwd,
|
||||
const mk_auth_invoker invoker,
|
||||
const mk_sock_info sender);
|
||||
|
||||
/**
|
||||
* 停止rtsp/rtmp/http-flv会话后流量汇报事件广播
|
||||
* @param url_info 播放url相关信息
|
||||
* @param total_bytes 耗费上下行总流量,单位字节数
|
||||
* @param total_seconds 本次tcp会话时长,单位秒
|
||||
* @param is_player 客户端是否为播放器
|
||||
*/
|
||||
void (API_CALL *on_mk_flow_report)(const mk_media_info url_info,
|
||||
size_t total_bytes,
|
||||
size_t total_seconds,
|
||||
int is_player,
|
||||
const mk_sock_info sender);
|
||||
|
||||
|
||||
/**
|
||||
* 日志输出广播
|
||||
* @param level 日志级别
|
||||
* @param file 源文件名
|
||||
* @param line 源文件行
|
||||
* @param function 源文件函数名
|
||||
* @param message 日志内容
|
||||
*/
|
||||
void (API_CALL *on_mk_log)(int level, const char *file, int line, const char *function, const char *message);
|
||||
|
||||
/**
|
||||
* 发送rtp流失败回调,适用于mk_media_source_start_send_rtp/mk_media_start_send_rtp接口触发的rtp发送
|
||||
* @param vhost 虚拟主机
|
||||
* @param app 应用名
|
||||
* @param stream 流id
|
||||
* @param ssrc ssrc的10进制打印,通过atoi转换为整型
|
||||
* @param err 错误代码
|
||||
* @param msg 错误提示
|
||||
*/
|
||||
void(API_CALL *on_mk_media_send_rtp_stop)(const char *vhost, const char *app, const char *stream, const char *ssrc, int err, const char *msg);
|
||||
|
||||
} mk_events;
|
||||
|
||||
|
||||
/**
|
||||
* 监听ZLMediaKit里面的事件
|
||||
* @param events 各个事件的结构体,这个对象在内部会再拷贝一次,可以设置为null以便取消监听
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_events_listen(const mk_events *events);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif //MK_EVENTS_H
|
||||
355
rknn_usb_rtsp-master/mk_api/include/mk_events_objects.h
Normal file
355
rknn_usb_rtsp-master/mk_api/include/mk_events_objects.h
Normal file
@@ -0,0 +1,355 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_EVENT_OBJECTS_H
|
||||
#define MK_EVENT_OBJECTS_H
|
||||
#include "mk_common.h"
|
||||
#include "mk_tcp.h"
|
||||
#include "mk_track.h"
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////MP4Info/////////////////////////////////////////////
|
||||
//MP4Info对象的C映射
|
||||
typedef struct mk_mp4_info_t *mk_mp4_info;
|
||||
// GMT 标准时间,单位秒
|
||||
API_EXPORT uint64_t API_CALL mk_mp4_info_get_start_time(const mk_mp4_info ctx);
|
||||
// 录像长度,单位秒
|
||||
API_EXPORT float API_CALL mk_mp4_info_get_time_len(const mk_mp4_info ctx);
|
||||
// 文件大小,单位 BYTE
|
||||
API_EXPORT size_t API_CALL mk_mp4_info_get_file_size(const mk_mp4_info ctx);
|
||||
// 文件路径
|
||||
API_EXPORT const char* API_CALL mk_mp4_info_get_file_path(const mk_mp4_info ctx);
|
||||
// 文件名称
|
||||
API_EXPORT const char* API_CALL mk_mp4_info_get_file_name(const mk_mp4_info ctx);
|
||||
// 文件夹路径
|
||||
API_EXPORT const char* API_CALL mk_mp4_info_get_folder(const mk_mp4_info ctx);
|
||||
// 播放路径
|
||||
API_EXPORT const char* API_CALL mk_mp4_info_get_url(const mk_mp4_info ctx);
|
||||
// 应用名称
|
||||
API_EXPORT const char* API_CALL mk_mp4_info_get_vhost(const mk_mp4_info ctx);
|
||||
// 流 ID
|
||||
API_EXPORT const char* API_CALL mk_mp4_info_get_app(const mk_mp4_info ctx);
|
||||
// 虚拟主机
|
||||
API_EXPORT const char* API_CALL mk_mp4_info_get_stream(const mk_mp4_info ctx);
|
||||
|
||||
///////////////////////////////////////////Parser/////////////////////////////////////////////
|
||||
//Parser对象的C映射
|
||||
typedef struct mk_parser_t *mk_parser;
|
||||
//Parser::Method(),获取命令字,譬如GET/POST
|
||||
API_EXPORT const char* API_CALL mk_parser_get_method(const mk_parser ctx);
|
||||
//Parser::Url(),获取HTTP的访问url(不包括?后面的参数)
|
||||
API_EXPORT const char* API_CALL mk_parser_get_url(const mk_parser ctx);
|
||||
//Parser::Params(),?后面的参数字符串
|
||||
API_EXPORT const char* API_CALL mk_parser_get_url_params(const mk_parser ctx);
|
||||
//Parser::getUrlArgs()["key"],获取?后面的参数中的特定参数
|
||||
API_EXPORT const char* API_CALL mk_parser_get_url_param(const mk_parser ctx,const char *key);
|
||||
//Parser::Tail(),获取协议相关信息,譬如 HTTP/1.1
|
||||
API_EXPORT const char* API_CALL mk_parser_get_tail(const mk_parser ctx);
|
||||
//Parser::getValues()["key"],获取HTTP头中特定字段
|
||||
API_EXPORT const char* API_CALL mk_parser_get_header(const mk_parser ctx,const char *key);
|
||||
//Parser::Content(),获取HTTP body
|
||||
API_EXPORT const char* API_CALL mk_parser_get_content(const mk_parser ctx, size_t *length);
|
||||
|
||||
///////////////////////////////////////////MediaInfo/////////////////////////////////////////////
|
||||
//MediaInfo对象的C映射
|
||||
typedef struct mk_media_info_t *mk_media_info;
|
||||
//MediaInfo::param_strs
|
||||
API_EXPORT const char* API_CALL mk_media_info_get_params(const mk_media_info ctx);
|
||||
//MediaInfo::schema
|
||||
API_EXPORT const char* API_CALL mk_media_info_get_schema(const mk_media_info ctx);
|
||||
//MediaInfo::vhost
|
||||
API_EXPORT const char* API_CALL mk_media_info_get_vhost(const mk_media_info ctx);
|
||||
//MediaInfo::app
|
||||
API_EXPORT const char* API_CALL mk_media_info_get_app(const mk_media_info ctx);
|
||||
//MediaInfo::stream
|
||||
API_EXPORT const char* API_CALL mk_media_info_get_stream(const mk_media_info ctx);
|
||||
//MediaInfo::host
|
||||
API_EXPORT const char* API_CALL mk_media_info_get_host(const mk_media_info ctx);
|
||||
//MediaInfo::port
|
||||
API_EXPORT uint16_t API_CALL mk_media_info_get_port(const mk_media_info ctx);
|
||||
|
||||
|
||||
///////////////////////////////////////////MediaSource/////////////////////////////////////////////
|
||||
//MediaSource对象的C映射
|
||||
typedef struct mk_media_source_t *mk_media_source;
|
||||
//查找MediaSource的回调函数
|
||||
typedef void(API_CALL *on_mk_media_source_find_cb)(void *user_data, const mk_media_source ctx);
|
||||
|
||||
//MediaSource::getSchema()
|
||||
API_EXPORT const char* API_CALL mk_media_source_get_schema(const mk_media_source ctx);
|
||||
//MediaSource::getVhost()
|
||||
API_EXPORT const char* API_CALL mk_media_source_get_vhost(const mk_media_source ctx);
|
||||
//MediaSource::getApp()
|
||||
API_EXPORT const char* API_CALL mk_media_source_get_app(const mk_media_source ctx);
|
||||
//MediaSource::getId()
|
||||
API_EXPORT const char* API_CALL mk_media_source_get_stream(const mk_media_source ctx);
|
||||
//MediaSource::readerCount()
|
||||
API_EXPORT int API_CALL mk_media_source_get_reader_count(const mk_media_source ctx);
|
||||
//MediaSource::totalReaderCount()
|
||||
API_EXPORT int API_CALL mk_media_source_get_total_reader_count(const mk_media_source ctx);
|
||||
// get track count from MediaSource
|
||||
API_EXPORT int API_CALL mk_media_source_get_track_count(const mk_media_source ctx);
|
||||
// copy track reference by index from MediaSource, please use mk_track_unref to release it
|
||||
API_EXPORT mk_track API_CALL mk_media_source_get_track(const mk_media_source ctx, int index);
|
||||
// MediaSource::broadcastMessage
|
||||
API_EXPORT int API_CALL mk_media_source_broadcast_msg(const mk_media_source ctx, const char *msg, size_t len);
|
||||
|
||||
/**
|
||||
* 直播源在ZLMediaKit中被称作为MediaSource,
|
||||
* 目前支持3种,分别是RtmpMediaSource、RtspMediaSource、HlsMediaSource
|
||||
* 源的产生有被动和主动方式:
|
||||
* 被动方式分别是rtsp/rtmp/rtp推流、mp4点播
|
||||
* 主动方式包括mk_media_create创建的对象(DevChannel)、mk_proxy_player_create创建的对象(PlayerProxy)
|
||||
* 被动方式你不用做任何处理,ZLMediaKit已经默认适配了MediaSource::close()事件,都会关闭直播流
|
||||
* 主动方式你要设置这个事件的回调,你要自己选择删除对象
|
||||
* 通过mk_proxy_player_set_on_close、mk_media_set_on_close函数可以设置回调,
|
||||
* 请在回调中删除对象来完成媒体的关闭,否则又为什么要调用mk_media_source_close函数?
|
||||
* @param ctx 对象
|
||||
* @param force 是否强制关闭,如果强制关闭,在有人观看的情况下也会关闭
|
||||
* @return 0代表失败,1代表成功
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_media_source_close(const mk_media_source ctx,int force);
|
||||
//MediaSource::seekTo()
|
||||
API_EXPORT int API_CALL mk_media_source_seek_to(const mk_media_source ctx,uint32_t stamp);
|
||||
|
||||
/**
|
||||
* rtp推流成功与否的回调(第一次成功后,后面将一直重试)
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_media_source_send_rtp_result)(void *user_data, uint16_t local_port, int err, const char *msg);
|
||||
|
||||
//MediaSource::startSendRtp,请参考mk_media_start_send_rtp,注意ctx参数类型不一样
|
||||
API_EXPORT void API_CALL mk_media_source_start_send_rtp(const mk_media_source ctx, const char *dst_url, uint16_t dst_port, const char *ssrc, int is_udp, on_mk_media_source_send_rtp_result cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_media_source_start_send_rtp2(const mk_media_source ctx, const char *dst_url, uint16_t dst_port, const char *ssrc, int is_udp, on_mk_media_source_send_rtp_result cb, void *user_data, on_user_data_free user_data_free);
|
||||
//MediaSource::stopSendRtp,请参考mk_media_stop_send_rtp,注意ctx参数类型不一样
|
||||
API_EXPORT int API_CALL mk_media_source_stop_send_rtp(const mk_media_source ctx);
|
||||
|
||||
//MediaSource::find()
|
||||
API_EXPORT void API_CALL mk_media_source_find(const char *schema,
|
||||
const char *vhost,
|
||||
const char *app,
|
||||
const char *stream,
|
||||
int from_mp4,
|
||||
void *user_data,
|
||||
on_mk_media_source_find_cb cb);
|
||||
|
||||
API_EXPORT const mk_media_source API_CALL mk_media_source_find2(const char *schema,
|
||||
const char *vhost,
|
||||
const char *app,
|
||||
const char *stream,
|
||||
int from_mp4);
|
||||
//MediaSource::for_each_media()
|
||||
API_EXPORT void API_CALL mk_media_source_for_each(void *user_data, on_mk_media_source_find_cb cb, const char *schema,
|
||||
const char *vhost, const char *app, const char *stream);
|
||||
|
||||
///////////////////////////////////////////HttpBody/////////////////////////////////////////////
|
||||
//HttpBody对象的C映射
|
||||
typedef struct mk_http_body_t *mk_http_body;
|
||||
/**
|
||||
* 生成HttpStringBody
|
||||
* @param str 字符串指针
|
||||
* @param len 字符串长度,为0则用strlen获取
|
||||
*/
|
||||
API_EXPORT mk_http_body API_CALL mk_http_body_from_string(const char *str,size_t len);
|
||||
|
||||
/**
|
||||
* 生成HttpBufferBody
|
||||
* @param buffer mk_buffer对象
|
||||
*/
|
||||
API_EXPORT mk_http_body API_CALL mk_http_body_from_buffer(mk_buffer buffer);
|
||||
|
||||
|
||||
/**
|
||||
* 生成HttpFileBody
|
||||
* @param file_path 文件完整路径
|
||||
*/
|
||||
API_EXPORT mk_http_body API_CALL mk_http_body_from_file(const char *file_path);
|
||||
|
||||
/**
|
||||
* 生成HttpMultiFormBody
|
||||
* @param key_val 参数key-value
|
||||
* @param file_path 文件完整路径
|
||||
*/
|
||||
API_EXPORT mk_http_body API_CALL mk_http_body_from_multi_form(const char *key_val[],const char *file_path);
|
||||
|
||||
/**
|
||||
* 销毁HttpBody
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_body_release(mk_http_body ctx);
|
||||
|
||||
///////////////////////////////////////////HttpResponseInvoker/////////////////////////////////////////////
|
||||
//HttpSession::HttpResponseInvoker对象的C映射
|
||||
typedef struct mk_http_response_invoker_t *mk_http_response_invoker;
|
||||
|
||||
/**
|
||||
* HttpSession::HttpResponseInvoker(const string &codeOut, const StrCaseMap &headerOut, const HttpBody::Ptr &body);
|
||||
* @param response_code 譬如200
|
||||
* @param response_header 返回的http头,譬如 {"Content-Type","text/html",NULL} 必须以NULL结尾
|
||||
* @param response_body body对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_response_invoker_do(const mk_http_response_invoker ctx,
|
||||
int response_code,
|
||||
const char **response_header,
|
||||
const mk_http_body response_body);
|
||||
|
||||
/**
|
||||
* HttpSession::HttpResponseInvoker(const string &codeOut, const StrCaseMap &headerOut, const string &body);
|
||||
* @param response_code 譬如200
|
||||
* @param response_header 返回的http头,譬如 {"Content-Type","text/html",NULL} 必须以NULL结尾
|
||||
* @param response_content 返回的content部分,譬如一个网页内容
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_response_invoker_do_string(const mk_http_response_invoker ctx,
|
||||
int response_code,
|
||||
const char **response_header,
|
||||
const char *response_content);
|
||||
/**
|
||||
* HttpSession::HttpResponseInvoker(const StrCaseMap &requestHeader,const StrCaseMap &responseHeader,const string &filePath);
|
||||
* @param request_parser 请求事件中的mk_parser对象,用于提取其中http头中的Range字段,通过该字段先fseek然后再发送文件部分片段
|
||||
* @param response_header 返回的http头,譬如 {"Content-Type","text/html",NULL} 必须以NULL结尾
|
||||
* @param response_file_path 返回的content部分,譬如/path/to/html/file
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_response_invoker_do_file(const mk_http_response_invoker ctx,
|
||||
const mk_parser request_parser,
|
||||
const char *response_header[],
|
||||
const char *response_file_path);
|
||||
/**
|
||||
* 克隆mk_http_response_invoker对象,通过克隆对象为堆对象,可以实现跨线程异步执行mk_http_response_invoker_do
|
||||
* 如果是同步执行mk_http_response_invoker_do,那么没必要克隆对象
|
||||
*/
|
||||
API_EXPORT mk_http_response_invoker API_CALL mk_http_response_invoker_clone(const mk_http_response_invoker ctx);
|
||||
|
||||
/**
|
||||
* 销毁堆上的克隆对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_response_invoker_clone_release(const mk_http_response_invoker ctx);
|
||||
|
||||
///////////////////////////////////////////HttpAccessPathInvoker/////////////////////////////////////////////
|
||||
//HttpSession::HttpAccessPathInvoker对象的C映射
|
||||
typedef struct mk_http_access_path_invoker_t *mk_http_access_path_invoker;
|
||||
|
||||
/**
|
||||
* HttpSession::HttpAccessPathInvoker(const string &errMsg,const string &accessPath, int cookieLifeSecond);
|
||||
* @param err_msg 如果为空,则代表鉴权通过,否则为错误提示,可以为null
|
||||
* @param access_path 运行或禁止访问的根目录,可以为null
|
||||
* @param cookie_life_second 鉴权cookie有效期
|
||||
**/
|
||||
API_EXPORT void API_CALL mk_http_access_path_invoker_do(const mk_http_access_path_invoker ctx,
|
||||
const char *err_msg,
|
||||
const char *access_path,
|
||||
int cookie_life_second);
|
||||
|
||||
/**
|
||||
* 克隆mk_http_access_path_invoker对象,通过克隆对象为堆对象,可以实现跨线程异步执行mk_http_access_path_invoker_do
|
||||
* 如果是同步执行mk_http_access_path_invoker_do,那么没必要克隆对象
|
||||
*/
|
||||
API_EXPORT mk_http_access_path_invoker API_CALL mk_http_access_path_invoker_clone(const mk_http_access_path_invoker ctx);
|
||||
|
||||
/**
|
||||
* 销毁堆上的克隆对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_access_path_invoker_clone_release(const mk_http_access_path_invoker ctx);
|
||||
|
||||
///////////////////////////////////////////RtspSession::onGetRealm/////////////////////////////////////////////
|
||||
//RtspSession::onGetRealm对象的C映射
|
||||
typedef struct mk_rtsp_get_realm_invoker_t *mk_rtsp_get_realm_invoker;
|
||||
/**
|
||||
* 执行RtspSession::onGetRealm
|
||||
* @param realm 该rtsp流是否需要开启rtsp专属鉴权,至null或空字符串则不鉴权
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_rtsp_get_realm_invoker_do(const mk_rtsp_get_realm_invoker ctx,
|
||||
const char *realm);
|
||||
|
||||
/**
|
||||
* 克隆mk_rtsp_get_realm_invoker对象,通过克隆对象为堆对象,可以实现跨线程异步执行mk_rtsp_get_realm_invoker_do
|
||||
* 如果是同步执行mk_rtsp_get_realm_invoker_do,那么没必要克隆对象
|
||||
*/
|
||||
API_EXPORT mk_rtsp_get_realm_invoker API_CALL mk_rtsp_get_realm_invoker_clone(const mk_rtsp_get_realm_invoker ctx);
|
||||
|
||||
/**
|
||||
* 销毁堆上的克隆对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_rtsp_get_realm_invoker_clone_release(const mk_rtsp_get_realm_invoker ctx);
|
||||
|
||||
///////////////////////////////////////////RtspSession::onAuth/////////////////////////////////////////////
|
||||
//RtspSession::onAuth对象的C映射
|
||||
typedef struct mk_rtsp_auth_invoker_t *mk_rtsp_auth_invoker;
|
||||
|
||||
/**
|
||||
* 执行RtspSession::onAuth
|
||||
* @param encrypted 为true是则表明是md5加密的密码,否则是明文密码, 在请求明文密码时如果提供md5密码者则会导致认证失败
|
||||
* @param pwd_or_md5 明文密码或者md5加密的密码
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_rtsp_auth_invoker_do(const mk_rtsp_auth_invoker ctx,
|
||||
int encrypted,
|
||||
const char *pwd_or_md5);
|
||||
|
||||
/**
|
||||
* 克隆mk_rtsp_auth_invoker对象,通过克隆对象为堆对象,可以实现跨线程异步执行mk_rtsp_auth_invoker_do
|
||||
* 如果是同步执行mk_rtsp_auth_invoker_do,那么没必要克隆对象
|
||||
*/
|
||||
API_EXPORT mk_rtsp_auth_invoker API_CALL mk_rtsp_auth_invoker_clone(const mk_rtsp_auth_invoker ctx);
|
||||
|
||||
/**
|
||||
* 销毁堆上的克隆对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_rtsp_auth_invoker_clone_release(const mk_rtsp_auth_invoker ctx);
|
||||
|
||||
///////////////////////////////////////////Broadcast::PublishAuthInvoker/////////////////////////////////////////////
|
||||
//Broadcast::PublishAuthInvoker对象的C映射
|
||||
typedef struct mk_publish_auth_invoker_t *mk_publish_auth_invoker;
|
||||
|
||||
/**
|
||||
* 执行Broadcast::PublishAuthInvoker
|
||||
* @param err_msg 为空或null则代表鉴权成功
|
||||
* @param enable_hls 是否允许转换hls
|
||||
* @param enable_mp4 是否运行MP4录制
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_publish_auth_invoker_do(const mk_publish_auth_invoker ctx,
|
||||
const char *err_msg,
|
||||
int enable_hls,
|
||||
int enable_mp4);
|
||||
|
||||
/**
|
||||
* 克隆mk_publish_auth_invoker对象,通过克隆对象为堆对象,可以实现跨线程异步执行mk_publish_auth_invoker_do
|
||||
* 如果是同步执行mk_publish_auth_invoker_do,那么没必要克隆对象
|
||||
*/
|
||||
API_EXPORT mk_publish_auth_invoker API_CALL mk_publish_auth_invoker_clone(const mk_publish_auth_invoker ctx);
|
||||
|
||||
/**
|
||||
* 销毁堆上的克隆对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_publish_auth_invoker_clone_release(const mk_publish_auth_invoker ctx);
|
||||
|
||||
///////////////////////////////////////////Broadcast::AuthInvoker/////////////////////////////////////////////
|
||||
//Broadcast::AuthInvoker对象的C映射
|
||||
typedef struct mk_auth_invoker_t *mk_auth_invoker;
|
||||
|
||||
/**
|
||||
* 执行Broadcast::AuthInvoker
|
||||
* @param err_msg 为空或null则代表鉴权成功
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_auth_invoker_do(const mk_auth_invoker ctx, const char *err_msg);
|
||||
|
||||
/**
|
||||
* 克隆mk_auth_invoker对象,通过克隆对象为堆对象,可以实现跨线程异步执行mk_auth_invoker_do
|
||||
* 如果是同步执行mk_auth_invoker_do,那么没必要克隆对象
|
||||
*/
|
||||
API_EXPORT mk_auth_invoker API_CALL mk_auth_invoker_clone(const mk_auth_invoker ctx);
|
||||
|
||||
/**
|
||||
* 销毁堆上的克隆对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_auth_invoker_clone_release(const mk_auth_invoker ctx);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif //MK_EVENT_OBJECTS_H
|
||||
226
rknn_usb_rtsp-master/mk_api/include/mk_frame.h
Normal file
226
rknn_usb_rtsp-master/mk_api/include/mk_frame.h
Normal file
@@ -0,0 +1,226 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef ZLMEDIAKIT_MK_FRAME_H
|
||||
#define ZLMEDIAKIT_MK_FRAME_H
|
||||
|
||||
#include "mk_common.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//是否为关键帧
|
||||
#define MK_FRAME_FLAG_IS_KEY (1 << 0)
|
||||
//是否为配置帧(sps/pps/vps等)
|
||||
#define MK_FRAME_FLAG_IS_CONFIG (1 << 1)
|
||||
//是否可丢弃的帧(sei/aud)
|
||||
#define MK_FRAME_FLAG_DROP_ABLE (1 << 2)
|
||||
//是否不可单独解码的帧(多slice的非vcl帧)
|
||||
#define MK_FRAME_FLAG_NOT_DECODE_ABLE (1 << 3)
|
||||
|
||||
//codec id常量定义
|
||||
API_EXPORT extern const int MKCodecH264;
|
||||
API_EXPORT extern const int MKCodecH265;
|
||||
API_EXPORT extern const int MKCodecAAC;
|
||||
API_EXPORT extern const int MKCodecG711A;
|
||||
API_EXPORT extern const int MKCodecG711U;
|
||||
API_EXPORT extern const int MKCodecOpus;
|
||||
API_EXPORT extern const int MKCodecL16;
|
||||
API_EXPORT extern const int MKCodecVP8;
|
||||
API_EXPORT extern const int MKCodecVP9;
|
||||
API_EXPORT extern const int MKCodecAV1;
|
||||
API_EXPORT extern const int MKCodecJPEG;
|
||||
|
||||
typedef struct mk_frame_t *mk_frame;
|
||||
|
||||
// 用户自定义free回调函数
|
||||
typedef void(API_CALL *on_mk_frame_data_release)(void *user_data, char *ptr);
|
||||
|
||||
/**
|
||||
* 创建frame对象,并返回其引用
|
||||
* @param codec_id 编解码类型,请参考MKCodecXXX定义
|
||||
* @param dts 解码时间戳,单位毫秒
|
||||
* @param pts 显示时间戳,单位毫秒
|
||||
* @param data 单帧数据
|
||||
* @param size 单帧数据长度
|
||||
* @param cb data指针free释放回调, 如果为空,内部会拷贝数据
|
||||
* @param user_data data指针free释放回调用户指针
|
||||
* @return frame对象引用
|
||||
*/
|
||||
API_EXPORT mk_frame API_CALL mk_frame_create(int codec_id, uint64_t dts, uint64_t pts, const char *data, size_t size,
|
||||
on_mk_frame_data_release cb, void *user_data);
|
||||
API_EXPORT mk_frame API_CALL mk_frame_create2(int codec_id, uint64_t dts, uint64_t pts, const char *data, size_t size,
|
||||
on_mk_frame_data_release cb, void *user_data, on_user_data_free user_data_free);
|
||||
/**
|
||||
* 减引用frame对象
|
||||
* @param frame 帧对象引用
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_frame_unref(mk_frame frame);
|
||||
|
||||
/**
|
||||
* 引用frame对象
|
||||
* @param frame 被引用的frame对象
|
||||
* @return 新的对象引用
|
||||
*/
|
||||
API_EXPORT mk_frame API_CALL mk_frame_ref(mk_frame frame);
|
||||
|
||||
/**
|
||||
* 获取frame 编码codec类型,请参考MKCodecXXX定义
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_frame_codec_id(mk_frame frame);
|
||||
|
||||
/**
|
||||
* 获取帧编码codec名称
|
||||
*/
|
||||
API_EXPORT const char* API_CALL mk_frame_codec_name(mk_frame frame);
|
||||
|
||||
/**
|
||||
* 帧是否为视频
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_frame_is_video(mk_frame frame);
|
||||
|
||||
/**
|
||||
* 获取帧数据指针
|
||||
*/
|
||||
API_EXPORT const char* API_CALL mk_frame_get_data(mk_frame frame);
|
||||
|
||||
/**
|
||||
* 获取帧数据指针长度
|
||||
*/
|
||||
API_EXPORT size_t API_CALL mk_frame_get_data_size(mk_frame frame);
|
||||
|
||||
/**
|
||||
* 返回帧数据前缀长度,譬如H264/H265前缀一般是0x00 00 00 01,那么本函数返回4
|
||||
*/
|
||||
API_EXPORT size_t API_CALL mk_frame_get_data_prefix_size(mk_frame frame);
|
||||
|
||||
/**
|
||||
* 获取解码时间戳,单位毫秒
|
||||
*/
|
||||
API_EXPORT uint64_t API_CALL mk_frame_get_dts(mk_frame frame);
|
||||
|
||||
/**
|
||||
* 获取显示时间戳,单位毫秒
|
||||
*/
|
||||
API_EXPORT uint64_t API_CALL mk_frame_get_pts(mk_frame frame);
|
||||
|
||||
/**
|
||||
* 获取帧flag,请参考 MK_FRAME_FLAG
|
||||
*/
|
||||
API_EXPORT uint32_t API_CALL mk_frame_get_flags(mk_frame frame);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct mk_buffer_t *mk_buffer;
|
||||
typedef struct mk_frame_merger_t *mk_frame_merger;
|
||||
|
||||
/**
|
||||
* 创建帧合并器
|
||||
* @param type 起始头类型,0: none, 1: h264_prefix/AnnexB(0x 00 00 00 01), 2: mp4_nal_size(avcC)
|
||||
* @return 帧合并器
|
||||
*/
|
||||
API_EXPORT mk_frame_merger API_CALL mk_frame_merger_create(int type);
|
||||
|
||||
/**
|
||||
* 销毁帧合并器
|
||||
* @param ctx 对象指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_frame_merger_release(mk_frame_merger ctx);
|
||||
|
||||
/**
|
||||
* 清空merger对象缓冲,方便复用
|
||||
* @param ctx 对象指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_frame_merger_clear(mk_frame_merger ctx);
|
||||
|
||||
/**
|
||||
* 合并帧回调函数
|
||||
* @param user_data 用户数据指针
|
||||
* @param dts 解码时间戳
|
||||
* @param pts 显示时间戳
|
||||
* @param buffer 合并后数据buffer对象
|
||||
* @param have_key_frame 合并后数据中是否包含关键帧
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_frame_merger)(void *user_data, uint64_t dts, uint64_t pts, mk_buffer buffer, int have_key_frame);
|
||||
|
||||
/**
|
||||
* 输入frame到merger对象并合并
|
||||
* @param ctx 对象指针
|
||||
* @param frame 帧数据
|
||||
* @param cb 帧合并回调函数
|
||||
* @param user_data 帧合并回调函数用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_frame_merger_input(mk_frame_merger ctx, mk_frame frame, on_mk_frame_merger cb, void *user_data);
|
||||
|
||||
/**
|
||||
* 强制flush merger对象缓冲,调用此api前需要确保先调用mk_frame_merger_input函数并且回调参数有效
|
||||
* @param ctx 对象指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_frame_merger_flush(mk_frame_merger ctx);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct mk_mpeg_muxer_t *mk_mpeg_muxer;
|
||||
|
||||
/**
|
||||
* mpeg-ps/ts 打包器输出回调函数
|
||||
* @param user_data 设置回调时的用户数据指针
|
||||
* @param muxer 对象
|
||||
* @param frame 帧数据
|
||||
* @param size 帧数据长度
|
||||
* @param timestamp 时间戳
|
||||
* @param key_pos 是否关键帧
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_mpeg_muxer_frame)(void *user_data, mk_mpeg_muxer muxer, const char *frame, size_t size, uint64_t timestamp, int key_pos);
|
||||
|
||||
/**
|
||||
* mpeg-ps/ts 打包器
|
||||
* @param cb 打包回调函数
|
||||
* @param user_data 回调用户数据指针
|
||||
* @param is_ps 是否是ps
|
||||
* @return 打包器对象
|
||||
*/
|
||||
API_EXPORT mk_mpeg_muxer API_CALL mk_mpeg_muxer_create(on_mk_mpeg_muxer_frame cb, void *user_data, int is_ps);
|
||||
|
||||
/**
|
||||
* 删除mpeg-ps/ts 打包器
|
||||
* @param ctx 打包器
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_mpeg_muxer_release(mk_mpeg_muxer ctx);
|
||||
|
||||
/**
|
||||
* 添加音视频track
|
||||
* @param ctx mk_mpeg_muxer对象
|
||||
* @param track mk_track对象,音视频轨道
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_mpeg_muxer_init_track(mk_mpeg_muxer ctx, void* track);
|
||||
|
||||
/**
|
||||
* 初始化track完毕后调用此函数,
|
||||
* 在单track(只有音频或视频)时,因为ZLMediaKit不知道后续是否还要添加track,所以会多等待3秒钟
|
||||
* 如果产生的流是单Track类型,请调用此函数以便加快流生成速度,当然不调用该函数,影响也不大(会多等待3秒)
|
||||
* @param ctx 对象指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_mpeg_muxer_init_complete(mk_mpeg_muxer ctx);
|
||||
|
||||
/**
|
||||
* 输入frame对象
|
||||
* @param ctx mk_mpeg_muxer对象
|
||||
* @param frame 帧对象
|
||||
* @return 1代表成功,0失败
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_mpeg_muxer_input_frame(mk_mpeg_muxer ctx, mk_frame frame);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //ZLMEDIAKIT_MK_FRAME_H
|
||||
58
rknn_usb_rtsp-master/mk_api/include/mk_h264_splitter.h
Normal file
58
rknn_usb_rtsp-master/mk_api/include/mk_h264_splitter.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef ZLMEDIAKIT_MK_H264_SPLITTER_H
|
||||
#define ZLMEDIAKIT_MK_H264_SPLITTER_H
|
||||
|
||||
#include "mk_common.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct mk_h264_splitter_t *mk_h264_splitter;
|
||||
|
||||
/**
|
||||
* h264 分帧器输出回调函数
|
||||
* @param user_data 设置回调时的用户数据指针
|
||||
* @param splitter 对象
|
||||
* @param frame 帧数据
|
||||
* @param size 帧数据长度
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_h264_splitter_frame)(void *user_data, mk_h264_splitter splitter, const char *frame, int size);
|
||||
|
||||
/**
|
||||
* 创建h264分帧器
|
||||
* @param cb 分帧回调函数
|
||||
* @param user_data 回调用户数据指针
|
||||
* @param is_h265 是否是265
|
||||
* @return 分帧器对象
|
||||
*/
|
||||
API_EXPORT mk_h264_splitter API_CALL mk_h264_splitter_create(on_mk_h264_splitter_frame cb, void *user_data, int is_h265);
|
||||
API_EXPORT mk_h264_splitter API_CALL mk_h264_splitter_create2(on_mk_h264_splitter_frame cb, void *user_data, on_user_data_free user_data_free, int is_h265);
|
||||
|
||||
/**
|
||||
* 删除h264分帧器
|
||||
* @param ctx 分帧器
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_h264_splitter_release(mk_h264_splitter ctx);
|
||||
|
||||
/**
|
||||
* 输入数据并分帧
|
||||
* @param ctx 分帧器
|
||||
* @param data h264/h265数据
|
||||
* @param size 数据长度
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_h264_splitter_input_data(mk_h264_splitter ctx, const char *data, int size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif //ZLMEDIAKIT_MK_H264_SPLITTER_H
|
||||
159
rknn_usb_rtsp-master/mk_api/include/mk_httpclient.h
Normal file
159
rknn_usb_rtsp-master/mk_api/include/mk_httpclient.h
Normal file
@@ -0,0 +1,159 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_HTTPCLIENT_H_
|
||||
#define MK_HTTPCLIENT_H_
|
||||
|
||||
#include "mk_common.h"
|
||||
#include "mk_events_objects.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////HttpDownloader/////////////////////////////////////////////
|
||||
|
||||
typedef struct mk_http_downloader_t *mk_http_downloader;
|
||||
|
||||
/**
|
||||
* @param user_data 用户数据指针
|
||||
* @param code 错误代码,0代表成功
|
||||
* @param err_msg 错误提示
|
||||
* @param file_path 文件保存路径
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_download_complete)(void *user_data, int code, const char *err_msg, const char *file_path);
|
||||
|
||||
/**
|
||||
* 创建http[s]下载器
|
||||
* @return 下载器指针
|
||||
*/
|
||||
API_EXPORT mk_http_downloader API_CALL mk_http_downloader_create();
|
||||
|
||||
/**
|
||||
* 销毁http[s]下载器
|
||||
* @param ctx 下载器指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_downloader_release(mk_http_downloader ctx);
|
||||
|
||||
/**
|
||||
* 开始http[s]下载
|
||||
* @param ctx 下载器指针
|
||||
* @param url http[s]下载url
|
||||
* @param file 文件保存路径
|
||||
* @param cb 回调函数
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_downloader_start(mk_http_downloader ctx, const char *url, const char *file, on_mk_download_complete cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_http_downloader_start2(mk_http_downloader ctx, const char *url, const char *file, on_mk_download_complete cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
///////////////////////////////////////////HttpRequester/////////////////////////////////////////////
|
||||
typedef struct mk_http_requester_t *mk_http_requester;
|
||||
|
||||
/**
|
||||
* http请求结果回调
|
||||
* 在code == 0时代表本次http会话是完整的(收到了http回复)
|
||||
* 用户应该通过user_data获取到mk_http_requester对象
|
||||
* 然后通过mk_http_requester_get_response等函数获取相关回复数据
|
||||
* 在回调结束时,应该通过mk_http_requester_release函数销毁该对象
|
||||
* 或者调用mk_http_requester_clear函数后再复用该对象
|
||||
* @param user_data 用户数据指针
|
||||
* @param code 错误代码,0代表成功
|
||||
* @param err_msg 错误提示
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_http_requester_complete)(void *user_data, int code, const char *err_msg);
|
||||
|
||||
/**
|
||||
* 创建HttpRequester
|
||||
*/
|
||||
API_EXPORT mk_http_requester API_CALL mk_http_requester_create();
|
||||
|
||||
/**
|
||||
* 在复用mk_http_requester对象时才需要用到此方法
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_requester_clear(mk_http_requester ctx);
|
||||
|
||||
/**
|
||||
* 销毁HttpRequester
|
||||
* 如果调用了mk_http_requester_start函数且正在等待http回复,
|
||||
* 也可以调用mk_http_requester_release方法取消本次http请求
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_requester_release(mk_http_requester ctx);
|
||||
|
||||
/**
|
||||
* 设置HTTP方法,譬如GET/POST
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_requester_set_method(mk_http_requester ctx,const char *method);
|
||||
|
||||
/**
|
||||
* 批量设置设置HTTP头
|
||||
* @param header 譬如 {"Content-Type","text/html",NULL} 必须以NULL结尾
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_requester_set_header(mk_http_requester ctx, const char *header[]);
|
||||
|
||||
/**
|
||||
* 添加HTTP头
|
||||
* @param key 譬如Content-Type
|
||||
* @param value 譬如 text/html
|
||||
* @param force 如果已经存在该key,是否强制替换
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_requester_add_header(mk_http_requester ctx,const char *key,const char *value,int force);
|
||||
|
||||
/**
|
||||
* 设置消息体,
|
||||
* @param body mk_http_body对象,通过mk_http_body_from_string等函数生成,使用完毕后请调用mk_http_body_release释放之
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_requester_set_body(mk_http_requester ctx, mk_http_body body);
|
||||
|
||||
/**
|
||||
* 在收到HTTP回复后可调用该方法获取状态码
|
||||
* @return 譬如 200 OK
|
||||
*/
|
||||
API_EXPORT const char* API_CALL mk_http_requester_get_response_status(mk_http_requester ctx);
|
||||
|
||||
/**
|
||||
* 在收到HTTP回复后可调用该方法获取响应HTTP头
|
||||
* @param key HTTP头键名
|
||||
* @return HTTP头键值
|
||||
*/
|
||||
API_EXPORT const char* API_CALL mk_http_requester_get_response_header(mk_http_requester ctx,const char *key);
|
||||
|
||||
/**
|
||||
* 在收到HTTP回复后可调用该方法获取响应HTTP body
|
||||
* @param length 返回body长度,可以为null
|
||||
* @return body指针
|
||||
*/
|
||||
API_EXPORT const char* API_CALL mk_http_requester_get_response_body(mk_http_requester ctx, size_t *length);
|
||||
|
||||
/**
|
||||
* 在收到HTTP回复后可调用该方法获取响应
|
||||
* @return 响应对象
|
||||
*/
|
||||
API_EXPORT mk_parser API_CALL mk_http_requester_get_response(mk_http_requester ctx);
|
||||
|
||||
/**
|
||||
* 设置回调函数
|
||||
* @param cb 回调函数,不能为空
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_requester_set_cb(mk_http_requester ctx,on_mk_http_requester_complete cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_http_requester_set_cb2(mk_http_requester ctx,on_mk_http_requester_complete cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 开始url请求
|
||||
* @param url 请求url,支持http/https
|
||||
* @param timeout_second 最大超时时间
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_http_requester_start(mk_http_requester ctx,const char *url, float timeout_second);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* MK_HTTPCLIENT_H_ */
|
||||
297
rknn_usb_rtsp-master/mk_api/include/mk_media.h
Normal file
297
rknn_usb_rtsp-master/mk_api/include/mk_media.h
Normal file
@@ -0,0 +1,297 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_MEDIA_H_
|
||||
#define MK_MEDIA_H_
|
||||
|
||||
#include "mk_common.h"
|
||||
#include "mk_track.h"
|
||||
#include "mk_frame.h"
|
||||
#include "mk_events_objects.h"
|
||||
#include "mk_thread.h"
|
||||
#include "mk_util.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct mk_media_t *mk_media;
|
||||
|
||||
/**
|
||||
* 创建一个媒体源
|
||||
* @param vhost 虚拟主机名,一般为__defaultVhost__
|
||||
* @param app 应用名,推荐为live
|
||||
* @param stream 流id,例如camera
|
||||
* @param duration 时长(单位秒),直播则为0
|
||||
* @param hls_enabled 是否生成hls
|
||||
* @param mp4_enabled 是否生成mp4
|
||||
* @return 对象指针
|
||||
*/
|
||||
API_EXPORT mk_media API_CALL mk_media_create(const char *vhost, const char *app, const char *stream,
|
||||
float duration, int hls_enabled, int mp4_enabled);
|
||||
|
||||
/**
|
||||
* 创建一个媒体源
|
||||
* @param vhost 虚拟主机名,一般为__defaultVhost__
|
||||
* @param app 应用名,推荐为live
|
||||
* @param stream 流id,例如camera
|
||||
* @param duration 时长(单位秒),直播则为0
|
||||
* @param option ProtocolOption相关配置
|
||||
* @return 对象指针
|
||||
*/
|
||||
API_EXPORT mk_media API_CALL mk_media_create2(const char *vhost, const char *app, const char *stream, float duration, mk_ini option);
|
||||
|
||||
/**
|
||||
* 销毁媒体源
|
||||
* @param ctx 对象指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_media_release(mk_media ctx);
|
||||
|
||||
/**
|
||||
* 添加音视频track
|
||||
* @param ctx mk_media对象
|
||||
* @param track mk_track对象,音视频轨道
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_media_init_track(mk_media ctx, mk_track track);
|
||||
|
||||
/**
|
||||
* 添加视频轨道,请改用mk_media_init_track方法
|
||||
* @param ctx 对象指针
|
||||
* @param codec_id 0:CodecH264/1:CodecH265
|
||||
* @param width 视频宽度; 在编码时才有效
|
||||
* @param height 视频高度; 在编码时才有效
|
||||
* @param fps 视频fps; 在编码时才有效
|
||||
* @param bit_rate 视频比特率,单位bps; 在编码时才有效
|
||||
* @param width 视频宽度
|
||||
* @param height 视频高度
|
||||
* @param fps 视频fps
|
||||
* @return 1代表成功,0失败
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_media_init_video(mk_media ctx, int codec_id, int width, int height, float fps, int bit_rate);
|
||||
|
||||
/**
|
||||
* 添加音频轨道,请改用mk_media_init_track方法
|
||||
* @param ctx 对象指针
|
||||
* @param codec_id 2:CodecAAC/3:CodecG711A/4:CodecG711U/5:OPUS
|
||||
* @param channel 通道数
|
||||
* @param sample_bit 采样位数,只支持16
|
||||
* @param sample_rate 采样率
|
||||
* @return 1代表成功,0失败
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_media_init_audio(mk_media ctx, int codec_id, int sample_rate, int channels, int sample_bit);
|
||||
|
||||
/**
|
||||
* 初始化h264/h265/aac完毕后调用此函数,
|
||||
* 在单track(只有音频或视频)时,因为ZLMediaKit不知道后续是否还要添加track,所以会多等待3秒钟
|
||||
* 如果产生的流是单Track类型,请调用此函数以便加快流生成速度,当然不调用该函数,影响也不大(会多等待3秒)
|
||||
* @param ctx 对象指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_media_init_complete(mk_media ctx);
|
||||
|
||||
/**
|
||||
* 输入frame对象
|
||||
* @param ctx mk_media对象
|
||||
* @param frame 帧对象
|
||||
* @return 1代表成功,0失败
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_media_input_frame(mk_media ctx, mk_frame frame);
|
||||
|
||||
/**
|
||||
* 输入单帧H264视频,帧起始字节00 00 01,00 00 00 01均可,请改用mk_media_input_frame方法
|
||||
* @param ctx 对象指针
|
||||
* @param data 单帧H264数据
|
||||
* @param len 单帧H264数据字节数
|
||||
* @param dts 解码时间戳,单位毫秒
|
||||
* @param pts 播放时间戳,单位毫秒
|
||||
* @return 1代表成功,0失败
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_media_input_h264(mk_media ctx, const void *data, int len, uint64_t dts, uint64_t pts);
|
||||
|
||||
/**
|
||||
* 输入单帧H265视频,帧起始字节00 00 01,00 00 00 01均可,请改用mk_media_input_frame方法
|
||||
* @param ctx 对象指针
|
||||
* @param data 单帧H265数据
|
||||
* @param len 单帧H265数据字节数
|
||||
* @param dts 解码时间戳,单位毫秒
|
||||
* @param pts 播放时间戳,单位毫秒
|
||||
* @return 1代表成功,0失败
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_media_input_h265(mk_media ctx, const void *data, int len, uint64_t dts, uint64_t pts);
|
||||
|
||||
/**
|
||||
* 输入YUV视频数据
|
||||
* @param ctx 对象指针
|
||||
* @param yuv yuv420p数据
|
||||
* @param linesize yuv420p linesize
|
||||
* @param cts 视频采集时间戳,单位毫秒
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_media_input_yuv(mk_media ctx, const char *yuv[3], int linesize[3], uint64_t cts);
|
||||
|
||||
/**
|
||||
* 输入单帧AAC音频(单独指定adts头),请改用mk_media_input_frame方法
|
||||
* @param ctx 对象指针
|
||||
* @param data 不包含adts头的单帧AAC数据,adts头7个字节
|
||||
* @param len 单帧AAC数据字节数
|
||||
* @param dts 时间戳,毫秒
|
||||
* @param adts adts头,可以为null
|
||||
* @return 1代表成功,0失败
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_media_input_aac(mk_media ctx, const void *data, int len, uint64_t dts, void *adts);
|
||||
|
||||
/**
|
||||
* 输入单帧PCM音频,启用ENABLE_FAAC编译时,该函数才有效
|
||||
* @param ctx 对象指针
|
||||
* @param data 单帧PCM数据
|
||||
* @param len 单帧PCM数据字节数
|
||||
* @param dts 时间戳,毫秒
|
||||
* @return 1代表成功,0失败
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_media_input_pcm(mk_media ctx, void *data, int len, uint64_t pts);
|
||||
|
||||
/**
|
||||
* 输入单帧OPUS/G711音频帧,请改用mk_media_input_frame方法
|
||||
* @param ctx 对象指针
|
||||
* @param data 单帧音频数据
|
||||
* @param len 单帧音频数据字节数
|
||||
* @param dts 时间戳,毫秒
|
||||
* @return 1代表成功,0失败
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_media_input_audio(mk_media ctx, const void* data, int len, uint64_t dts);
|
||||
|
||||
/**
|
||||
* MediaSource.close()回调事件
|
||||
* 在选择关闭一个关联的MediaSource时,将会最终触发到该回调
|
||||
* 你应该通过该事件调用mk_media_release函数并且释放其他资源
|
||||
* 如果你不调用mk_media_release函数,那么MediaSource.close()操作将无效
|
||||
* @param user_data 用户数据指针,通过mk_media_set_on_close函数设置
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_media_close)(void *user_data);
|
||||
|
||||
/**
|
||||
* 监听MediaSource.close()事件
|
||||
* 在选择关闭一个关联的MediaSource时,将会最终触发到该回调
|
||||
* 你应该通过该事件调用mk_media_release函数并且释放其他资源
|
||||
* @param ctx 对象指针
|
||||
* @param cb 回调指针
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_media_set_on_close(mk_media ctx, on_mk_media_close cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_media_set_on_close2(mk_media ctx, on_mk_media_close cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 收到客户端的seek请求时触发该回调
|
||||
* @param user_data 用户数据指针,通过mk_media_set_on_seek设置
|
||||
* @param stamp_ms seek至的时间轴位置,单位毫秒
|
||||
* @return 1代表将处理seek请求,0代表忽略该请求
|
||||
*/
|
||||
typedef int(API_CALL *on_mk_media_seek)(void *user_data,uint32_t stamp_ms);
|
||||
|
||||
/**
|
||||
* 收到客户端的pause或resume请求时触发该回调
|
||||
* @param user_data 用户数据指针,通过mk_media_set_on_pause设置
|
||||
* @param pause 1:暂停, 0: 恢复
|
||||
*/
|
||||
typedef int(API_CALL* on_mk_media_pause)(void* user_data, int pause);
|
||||
|
||||
/**
|
||||
* 收到客户端的speed请求时触发该回调
|
||||
* @param user_data 用户数据指针,通过mk_media_set_on_pause设置
|
||||
* @param speed 0.5 1.0 2.0
|
||||
*/
|
||||
typedef int(API_CALL* on_mk_media_speed)(void* user_data, float speed);
|
||||
|
||||
/**
|
||||
* 监听播放器seek请求事件
|
||||
* @param ctx 对象指针
|
||||
* @param cb 回调指针
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_media_set_on_seek(mk_media ctx, on_mk_media_seek cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_media_set_on_seek2(mk_media ctx, on_mk_media_seek cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 监听播放器pause请求事件
|
||||
* @param ctx 对象指针
|
||||
* @param cb 回调指针
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_media_set_on_pause(mk_media ctx, on_mk_media_pause cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_media_set_on_pause2(mk_media ctx, on_mk_media_pause cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 监听播放器pause请求事件
|
||||
* @param ctx 对象指针
|
||||
* @param cb 回调指针
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_media_set_on_speed(mk_media ctx, on_mk_media_speed cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_media_set_on_speed2(mk_media ctx, on_mk_media_speed cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 获取总的观看人数
|
||||
* @param ctx 对象指针
|
||||
* @return 观看人数
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_media_total_reader_count(mk_media ctx);
|
||||
|
||||
/**
|
||||
* 生成的MediaSource注册或注销事件
|
||||
* @param user_data 设置回调时的用户数据指针
|
||||
* @param sender 生成的MediaSource对象
|
||||
* @param regist 1为注册事件,0为注销事件
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_media_source_regist)(void *user_data, mk_media_source sender, int regist);
|
||||
|
||||
/**
|
||||
* 设置MediaSource注册或注销事件回调函数
|
||||
* @param ctx 对象指针
|
||||
* @param cb 回调指针
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_media_set_on_regist(mk_media ctx, on_mk_media_source_regist cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_media_set_on_regist2(mk_media ctx, on_mk_media_source_regist cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* rtp推流成功与否的回调(第一次成功后,后面将一直重试)
|
||||
*/
|
||||
typedef on_mk_media_source_send_rtp_result on_mk_media_send_rtp_result;
|
||||
|
||||
/**
|
||||
* 开始发送一路ps-rtp流(通过ssrc区分多路),此api线程安全
|
||||
* @param ctx 对象指针
|
||||
* @param dst_url 目标ip或域名
|
||||
* @param dst_port 目标端口
|
||||
* @param ssrc rtp的ssrc,10进制的字符串打印
|
||||
* @param is_udp 是否为udp
|
||||
* @param cb 启动成功或失败回调
|
||||
* @param user_data 回调用户指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_media_start_send_rtp(mk_media ctx, const char *dst_url, uint16_t dst_port, const char *ssrc, int is_udp, on_mk_media_send_rtp_result cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_media_start_send_rtp2(mk_media ctx, const char *dst_url, uint16_t dst_port, const char *ssrc, int is_udp, on_mk_media_send_rtp_result cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 停止某路或全部ps-rtp发送,此api线程安全
|
||||
* @param ctx 对象指针
|
||||
* @param ssrc rtp的ssrc,10进制的字符串打印,如果为null或空字符串,则停止所有rtp推流
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_media_stop_send_rtp(mk_media ctx, const char *ssrc);
|
||||
|
||||
/**
|
||||
* 获取所属线程
|
||||
* @param ctx 对象指针
|
||||
*/
|
||||
API_EXPORT mk_thread API_CALL mk_media_get_owner_thread(mk_media ctx);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* MK_MEDIA_H_ */
|
||||
31
rknn_usb_rtsp-master/mk_api/include/mk_mediakit.h
Normal file
31
rknn_usb_rtsp-master/mk_api/include/mk_mediakit.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_API_H_
|
||||
#define MK_API_H_
|
||||
|
||||
#include "mk_common.h"
|
||||
#include "mk_httpclient.h"
|
||||
#include "mk_media.h"
|
||||
#include "mk_proxyplayer.h"
|
||||
#include "mk_recorder.h"
|
||||
#include "mk_player.h"
|
||||
#include "mk_pusher.h"
|
||||
#include "mk_events.h"
|
||||
#include "mk_tcp.h"
|
||||
#include "mk_util.h"
|
||||
#include "mk_thread.h"
|
||||
#include "mk_rtp_server.h"
|
||||
#include "mk_h264_splitter.h"
|
||||
#include "mk_frame.h"
|
||||
#include "mk_track.h"
|
||||
#include "mk_transcode.h"
|
||||
|
||||
#endif /* MK_API_H_ */
|
||||
136
rknn_usb_rtsp-master/mk_api/include/mk_player.h
Normal file
136
rknn_usb_rtsp-master/mk_api/include/mk_player.h
Normal file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_PLAYER_H_
|
||||
#define MK_PLAYER_H_
|
||||
|
||||
#include "mk_common.h"
|
||||
#include "mk_frame.h"
|
||||
#include "mk_track.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct mk_player_t *mk_player;
|
||||
|
||||
/**
|
||||
* 播放结果或播放中断事件的回调
|
||||
* @param user_data 用户数据指针
|
||||
* @param err_code 错误代码,0为成功
|
||||
* @param err_msg 错误提示
|
||||
* @param tracks track列表
|
||||
* @param track_count track个数
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_play_event)(void *user_data, int err_code, const char *err_msg, mk_track tracks[],
|
||||
int track_count);
|
||||
|
||||
/**
|
||||
* 创建一个播放器,支持rtmp[s]/rtsp[s]
|
||||
* @return 播放器指针
|
||||
*/
|
||||
API_EXPORT mk_player API_CALL mk_player_create();
|
||||
|
||||
/**
|
||||
* 销毁播放器
|
||||
* @param ctx 播放器指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_player_release(mk_player ctx);
|
||||
|
||||
/**
|
||||
* 设置播放器配置选项
|
||||
* @param ctx 播放器指针
|
||||
* @param key 配置项键,支持 net_adapter/rtp_type/rtsp_user/rtsp_pwd/protocol_timeout_ms/media_timeout_ms/beat_interval_ms/wait_track_ready
|
||||
* @param val 配置项值,如果是整形,需要转换成统一转换成string
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_player_set_option(mk_player ctx, const char *key, const char *val);
|
||||
|
||||
/**
|
||||
* 开始播放url
|
||||
* @param ctx 播放器指针
|
||||
* @param url rtsp[s]/rtmp[s] url
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_player_play(mk_player ctx, const char *url);
|
||||
|
||||
/**
|
||||
* 暂停或恢复播放,仅对点播有用
|
||||
* @param ctx 播放器指针
|
||||
* @param pause 1:暂停播放,0:恢复播放
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_player_pause(mk_player ctx, int pause);
|
||||
|
||||
/**
|
||||
* 倍数播放,仅对点播有用
|
||||
* @param ctx 播放器指针
|
||||
* @param speed 0.5 1.0 2.0
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_player_speed(mk_player ctx, float speed);
|
||||
|
||||
/**
|
||||
* 设置点播进度条
|
||||
* @param ctx 对象指针
|
||||
* @param progress 取值范围未 0.0~1.0
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_player_seekto(mk_player ctx, float progress);
|
||||
|
||||
/**
|
||||
* 设置点播进度条
|
||||
* @param ctx 对象指针
|
||||
* @param seek_pos 取值范围 相对于开始时间增量 单位秒
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_player_seekto_pos(mk_player ctx, int seek_pos);
|
||||
|
||||
/**
|
||||
* 设置播放器开启播放结果回调函数
|
||||
* @param ctx 播放器指针
|
||||
* @param cb 回调函数指针,设置null立即取消回调
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_player_set_on_result(mk_player ctx, on_mk_play_event cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_player_set_on_result2(mk_player ctx, on_mk_play_event cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 设置播放被异常中断的回调
|
||||
* @param ctx 播放器指针
|
||||
* @param cb 回调函数指针,设置null立即取消回调
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_player_set_on_shutdown(mk_player ctx, on_mk_play_event cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_player_set_on_shutdown2(mk_player ctx, on_mk_play_event cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
///////////////////////////获取音视频相关信息接口在播放成功回调触发后才有效///////////////////////////////
|
||||
|
||||
/**
|
||||
* 获取点播节目时长,如果是直播返回0,否则返回秒数
|
||||
*/
|
||||
API_EXPORT float API_CALL mk_player_duration(mk_player ctx);
|
||||
|
||||
/**
|
||||
* 获取点播播放进度,取值范围 0.0~1.0
|
||||
*/
|
||||
API_EXPORT float API_CALL mk_player_progress(mk_player ctx);
|
||||
|
||||
/**
|
||||
* 获取点播播放进度位置,取值范围 相对于开始时间增量 单位秒
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_player_progress_pos(mk_player ctx);
|
||||
|
||||
/**
|
||||
* 获取丢包率,rtsp时有效
|
||||
* @param ctx 对象指针
|
||||
* @param track_type 0:视频,1:音频
|
||||
*/
|
||||
API_EXPORT float API_CALL mk_player_loss_rate(mk_player ctx, int track_type);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* MK_PLAYER_H_ */
|
||||
86
rknn_usb_rtsp-master/mk_api/include/mk_proxyplayer.h
Normal file
86
rknn_usb_rtsp-master/mk_api/include/mk_proxyplayer.h
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_PROXY_PLAYER_H_
|
||||
#define MK_PROXY_PLAYER_H_
|
||||
|
||||
#include "mk_common.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct mk_proxy_player_t *mk_proxy_player;
|
||||
|
||||
/**
|
||||
* 创建一个代理播放器
|
||||
* @param vhost 虚拟主机名,一般为__defaultVhost__
|
||||
* @param app 应用名
|
||||
* @param stream 流名
|
||||
* @param rtp_type rtsp播放方式:RTP_TCP = 0, RTP_UDP = 1, RTP_MULTICAST = 2
|
||||
* @param hls_enabled 是否生成hls
|
||||
* @param mp4_enabled 是否生成mp4
|
||||
* @return 对象指针
|
||||
*/
|
||||
API_EXPORT mk_proxy_player API_CALL mk_proxy_player_create(const char *vhost, const char *app, const char *stream, int hls_enabled, int mp4_enabled);
|
||||
|
||||
/**
|
||||
* 销毁代理播放器
|
||||
* @param ctx 对象指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_proxy_player_release(mk_proxy_player ctx);
|
||||
|
||||
/**
|
||||
* 设置代理播放器配置选项
|
||||
* @param ctx 代理播放器指针
|
||||
* @param key 配置项键,支持 net_adapter/rtp_type/rtsp_user/rtsp_pwd/protocol_timeout_ms/media_timeout_ms/beat_interval_ms
|
||||
* @param val 配置项值,如果是整形,需要转换成统一转换成string
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_proxy_player_set_option(mk_proxy_player ctx, const char *key, const char *val);
|
||||
|
||||
/**
|
||||
* 开始播放
|
||||
* @param ctx 对象指针
|
||||
* @param url 播放url,支持rtsp/rtmp
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_proxy_player_play(mk_proxy_player ctx, const char *url);
|
||||
|
||||
/**
|
||||
* MediaSource.close()回调事件
|
||||
* 在选择关闭一个关联的MediaSource时,将会最终触发到该回调
|
||||
* 你应该通过该事件调用mk_proxy_player_release函数并且释放其他资源
|
||||
* 如果你不调用mk_proxy_player_release函数,那么MediaSource.close()操作将无效
|
||||
* @param user_data 用户数据指针,通过mk_proxy_player_set_on_close函数设置
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_proxy_player_close)(void *user_data, int err, const char *what, int sys_err);
|
||||
|
||||
/**
|
||||
* 监听MediaSource.close()事件
|
||||
* 在选择关闭一个关联的MediaSource时,将会最终触发到该回调
|
||||
* 你应该通过该事件调用mk_proxy_player_release函数并且释放其他资源
|
||||
* @param ctx 对象指针
|
||||
* @param cb 回调指针
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_proxy_player_set_on_close(mk_proxy_player ctx, on_mk_proxy_player_close cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_proxy_player_set_on_close2(mk_proxy_player ctx, on_mk_proxy_player_close cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 获取总的观看人数
|
||||
* @param ctx 对象指针
|
||||
* @return 观看人数
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_proxy_player_total_reader_count(mk_proxy_player ctx);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* MK_PROXY_PLAYER_H_ */
|
||||
96
rknn_usb_rtsp-master/mk_api/include/mk_pusher.h
Normal file
96
rknn_usb_rtsp-master/mk_api/include/mk_pusher.h
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_PUSHER_H
|
||||
#define MK_PUSHER_H
|
||||
|
||||
#include "mk_common.h"
|
||||
#include "mk_events_objects.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct mk_pusher_t *mk_pusher;
|
||||
|
||||
/**
|
||||
* 推流结果或推流中断事件的回调
|
||||
* @param user_data 用户数据指针
|
||||
* @param err_code 错误代码,0为成功
|
||||
* @param err_msg 错误提示
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_push_event)(void *user_data,int err_code,const char *err_msg);
|
||||
|
||||
/**
|
||||
* 绑定的MediaSource对象并创建rtmp[s]/rtsp[s]推流器
|
||||
* MediaSource通过mk_media_create或mk_proxy_player_create或推流生成
|
||||
* 该MediaSource对象必须已注册
|
||||
*
|
||||
* @param schema 绑定的MediaSource对象所属协议,支持rtsp/rtmp
|
||||
* @param vhost 绑定的MediaSource对象的虚拟主机,一般为__defaultVhost__
|
||||
* @param app 绑定的MediaSource对象的应用名,一般为live
|
||||
* @param stream 绑定的MediaSource对象的流id
|
||||
* @return 对象指针
|
||||
*/
|
||||
API_EXPORT mk_pusher API_CALL mk_pusher_create(const char *schema,const char *vhost,const char *app, const char *stream);
|
||||
|
||||
/**
|
||||
* 绑定的MediaSource对象并创建rtmp[s]/rtsp[s]推流器
|
||||
* MediaSource通过mk_media_create或mk_proxy_player_create或推流生成
|
||||
* 该MediaSource对象必须已注册
|
||||
*
|
||||
* @param src MediaSource对象
|
||||
* @return 对象指针
|
||||
*/
|
||||
API_EXPORT mk_pusher API_CALL mk_pusher_create_src(mk_media_source src);
|
||||
|
||||
/**
|
||||
* 释放推流器
|
||||
* @param ctx 推流器指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_pusher_release(mk_pusher ctx);
|
||||
|
||||
/**
|
||||
* 设置推流器配置选项
|
||||
* @param ctx 推流器指针
|
||||
* @param key 配置项键,支持 net_adapter/rtp_type/rtsp_user/rtsp_pwd/protocol_timeout_ms/media_timeout_ms/beat_interval_ms
|
||||
* @param val 配置项值,如果是整形,需要转换成统一转换成string
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_pusher_set_option(mk_pusher ctx, const char *key, const char *val);
|
||||
|
||||
/**
|
||||
* 开始推流
|
||||
* @param ctx 推流器指针
|
||||
* @param url 推流地址,支持rtsp[s]/rtmp[s]
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_pusher_publish(mk_pusher ctx,const char *url);
|
||||
|
||||
/**
|
||||
* 设置推流器推流结果回调函数
|
||||
* @param ctx 推流器指针
|
||||
* @param cb 回调函数指针,不得为null
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_pusher_set_on_result(mk_pusher ctx, on_mk_push_event cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_pusher_set_on_result2(mk_pusher ctx, on_mk_push_event cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 设置推流被异常中断的回调
|
||||
* @param ctx 推流器指针
|
||||
* @param cb 回调函数指针,不得为null
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_pusher_set_on_shutdown(mk_pusher ctx, on_mk_push_event cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_pusher_set_on_shutdown2(mk_pusher ctx, on_mk_push_event cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif //MK_PUSHER_H
|
||||
85
rknn_usb_rtsp-master/mk_api/include/mk_recorder.h
Normal file
85
rknn_usb_rtsp-master/mk_api/include/mk_recorder.h
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_RECORDER_API_H_
|
||||
#define MK_RECORDER_API_H_
|
||||
|
||||
#include "mk_common.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////flv录制/////////////////////////////////////////////
|
||||
|
||||
typedef struct mk_flv_recorder_t *mk_flv_recorder;
|
||||
|
||||
/**
|
||||
* 创建flv录制器
|
||||
* @return
|
||||
*/
|
||||
API_EXPORT mk_flv_recorder API_CALL mk_flv_recorder_create();
|
||||
|
||||
/**
|
||||
* 释放flv录制器
|
||||
* @param ctx
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_flv_recorder_release(mk_flv_recorder ctx);
|
||||
|
||||
/**
|
||||
* 开始录制flv
|
||||
* @param ctx flv录制器
|
||||
* @param vhost 虚拟主机
|
||||
* @param app 绑定的RtmpMediaSource的 app名
|
||||
* @param stream 绑定的RtmpMediaSource的 stream名
|
||||
* @param file_path 文件存放地址
|
||||
* @return 0:开始超过,-1:失败,打开文件失败或该RtmpMediaSource不存在
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_flv_recorder_start(mk_flv_recorder ctx, const char *vhost, const char *app, const char *stream, const char *file_path);
|
||||
|
||||
///////////////////////////////////////////hls/mp4录制/////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* 获取录制状态
|
||||
* @param type 0:hls,1:MP4
|
||||
* @param vhost 虚拟主机
|
||||
* @param app 应用名
|
||||
* @param stream 流id
|
||||
* @return 录制状态,0:未录制, 1:正在录制
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_recorder_is_recording(int type, const char *vhost, const char *app, const char *stream);
|
||||
|
||||
/**
|
||||
* 开始录制
|
||||
* @param type 0:hls-ts,1:MP4,2:hls-fmp4,3:http-fmp4,4:http-ts
|
||||
* @param vhost 虚拟主机
|
||||
* @param app 应用名
|
||||
* @param stream 流id
|
||||
* @param customized_path 录像文件保存自定义目录,默认为空或null则自动生成
|
||||
* @param max_second mp4录制最大切片时间,单位秒,置0则采用配置文件配置
|
||||
* @return 1代表成功,0代表失败
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_recorder_start(int type, const char *vhost, const char *app, const char *stream, const char *customized_path, size_t max_second);
|
||||
|
||||
/**
|
||||
* 停止录制
|
||||
* @param type 0:hls-ts,1:MP4,2:hls-fmp4,3:http-fmp4,4:http-ts
|
||||
* @param vhost 虚拟主机
|
||||
* @param app 应用名
|
||||
* @param stream 流id
|
||||
* @return 1:成功,0:失败
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_recorder_stop(int type, const char *vhost, const char *app, const char *stream);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* MK_RECORDER_API_H_ */
|
||||
75
rknn_usb_rtsp-master/mk_api/include/mk_rtp_server.h
Normal file
75
rknn_usb_rtsp-master/mk_api/include/mk_rtp_server.h
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#include "mk_common.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct mk_rtp_server_t *mk_rtp_server;
|
||||
|
||||
/**
|
||||
* 创建GB28181 RTP 服务器
|
||||
* @param port 监听端口,0则为随机
|
||||
* @param tcp_mode tcp模式(0: 不监听端口 1: 监听端口 2: 主动连接到服务端)
|
||||
* @param stream_id 该端口绑定的流id
|
||||
* @return
|
||||
*/
|
||||
API_EXPORT mk_rtp_server API_CALL mk_rtp_server_create(uint16_t port, int tcp_mode, const char *stream_id);
|
||||
|
||||
/**
|
||||
* TCP 主动模式时连接到服务器是否成功的回调
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_rtp_server_connected)(void *user_data, int err, const char *what, int sys_err);
|
||||
|
||||
/**
|
||||
* TCP 主动模式时连接到服务器
|
||||
* @param @param ctx 服务器对象
|
||||
* @param dst_url 服务端地址
|
||||
* @param dst_port 服务端端口
|
||||
* @param cb 连接到服务器是否成功的回调
|
||||
* @param user_data 用户数据指针
|
||||
* @return
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_rtp_server_connect(mk_rtp_server ctx, const char *dst_url, uint16_t dst_port, on_mk_rtp_server_connected cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_rtp_server_connect2(mk_rtp_server ctx, const char *dst_url, uint16_t dst_port, on_mk_rtp_server_connected cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 销毁GB28181 RTP 服务器
|
||||
* @param ctx 服务器对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_rtp_server_release(mk_rtp_server ctx);
|
||||
|
||||
/**
|
||||
* 获取本地监听的端口号
|
||||
* @param ctx 服务器对象
|
||||
* @return 端口号
|
||||
*/
|
||||
API_EXPORT uint16_t API_CALL mk_rtp_server_port(mk_rtp_server ctx);
|
||||
|
||||
/**
|
||||
* GB28181 RTP 服务器接收流超时时触发
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
typedef void(API_CALL *on_mk_rtp_server_detach)(void *user_data);
|
||||
|
||||
/**
|
||||
* 监听B28181 RTP 服务器接收流超时事件
|
||||
* @param ctx 服务器对象
|
||||
* @param cb 回调函数
|
||||
* @param user_data 回调函数用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_rtp_server_set_on_detach(mk_rtp_server ctx, on_mk_rtp_server_detach cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_rtp_server_set_on_detach2(mk_rtp_server ctx, on_mk_rtp_server_detach cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
268
rknn_usb_rtsp-master/mk_api/include/mk_tcp.h
Normal file
268
rknn_usb_rtsp-master/mk_api/include/mk_tcp.h
Normal file
@@ -0,0 +1,268 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_TCP_H
|
||||
#define MK_TCP_H
|
||||
|
||||
#include "mk_common.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////Buffer::Ptr/////////////////////////////////////////////
|
||||
|
||||
typedef struct mk_buffer_t *mk_buffer;
|
||||
typedef void(API_CALL *on_mk_buffer_free)(void *user_data, void *data);
|
||||
|
||||
/**
|
||||
* 创建buffer对象
|
||||
* @param data 数据指针
|
||||
* @param len 数据长度
|
||||
* @param cb 数据指针free回调函数,该参数置空时,内部会拷贝数据
|
||||
* @param user_data 数据指针free回调函数on_mk_buffer_free第一个参数
|
||||
* @return buffer对象
|
||||
*/
|
||||
API_EXPORT mk_buffer API_CALL mk_buffer_from_char(const char *data, size_t len, on_mk_buffer_free cb, void *user_data);
|
||||
API_EXPORT mk_buffer API_CALL mk_buffer_from_char2(const char *data, size_t len, on_mk_buffer_free cb, void *user_data, on_user_data_free user_data_free);
|
||||
API_EXPORT mk_buffer API_CALL mk_buffer_ref(mk_buffer buffer);
|
||||
API_EXPORT void API_CALL mk_buffer_unref(mk_buffer buffer);
|
||||
API_EXPORT const char* API_CALL mk_buffer_get_data(mk_buffer buffer);
|
||||
API_EXPORT size_t API_CALL mk_buffer_get_size(mk_buffer buffer);
|
||||
|
||||
///////////////////////////////////////////SockInfo/////////////////////////////////////////////
|
||||
//SockInfo对象的C映射
|
||||
typedef struct mk_sock_info_t *mk_sock_info;
|
||||
|
||||
//SockInfo::get_peer_ip()
|
||||
API_EXPORT const char* API_CALL mk_sock_info_peer_ip(const mk_sock_info ctx, char *buf);
|
||||
//SockInfo::get_local_ip()
|
||||
API_EXPORT const char* API_CALL mk_sock_info_local_ip(const mk_sock_info ctx, char *buf);
|
||||
//SockInfo::get_peer_port()
|
||||
API_EXPORT uint16_t API_CALL mk_sock_info_peer_port(const mk_sock_info ctx);
|
||||
//SockInfo::get_local_port()
|
||||
API_EXPORT uint16_t API_CALL mk_sock_info_local_port(const mk_sock_info ctx);
|
||||
|
||||
#ifndef SOCK_INFO_API_RENAME
|
||||
#define SOCK_INFO_API_RENAME
|
||||
//mk_tcp_session对象转换成mk_sock_info对象后再获取网络相关信息
|
||||
#define mk_tcp_session_peer_ip(x,buf) mk_sock_info_peer_ip(mk_tcp_session_get_sock_info(x),buf)
|
||||
#define mk_tcp_session_local_ip(x,buf) mk_sock_info_local_ip(mk_tcp_session_get_sock_info(x),buf)
|
||||
#define mk_tcp_session_peer_port(x) mk_sock_info_peer_port(mk_tcp_session_get_sock_info(x))
|
||||
#define mk_tcp_session_local_port(x) mk_sock_info_local_port(mk_tcp_session_get_sock_info(x))
|
||||
|
||||
//mk_tcp_client对象转换成mk_sock_info对象后再获取网络相关信息
|
||||
#define mk_tcp_client_peer_ip(x,buf) mk_sock_info_peer_ip(mk_tcp_client_get_sock_info(x),buf)
|
||||
#define mk_tcp_client_local_ip(x,buf) mk_sock_info_local_ip(mk_tcp_client_get_sock_info(x),buf)
|
||||
#define mk_tcp_client_peer_port(x) mk_sock_info_peer_port(mk_tcp_client_get_sock_info(x))
|
||||
#define mk_tcp_client_local_port(x) mk_sock_info_local_port(mk_tcp_client_get_sock_info(x))
|
||||
#endif
|
||||
///////////////////////////////////////////TcpSession/////////////////////////////////////////////
|
||||
//TcpSession对象的C映射
|
||||
typedef struct mk_tcp_session_t *mk_tcp_session;
|
||||
typedef struct mk_tcp_session_ref_t *mk_tcp_session_ref;
|
||||
|
||||
//获取基类指针以便获取其网络相关信息
|
||||
API_EXPORT mk_sock_info API_CALL mk_tcp_session_get_sock_info(const mk_tcp_session ctx);
|
||||
|
||||
//TcpSession::safeShutdown()
|
||||
API_EXPORT void API_CALL mk_tcp_session_shutdown(const mk_tcp_session ctx,int err,const char *err_msg);
|
||||
//TcpSession::send()
|
||||
API_EXPORT void API_CALL mk_tcp_session_send(const mk_tcp_session ctx, const char *data, size_t len);
|
||||
API_EXPORT void API_CALL mk_tcp_session_send_buffer(const mk_tcp_session ctx, mk_buffer buffer);
|
||||
|
||||
//切换到该对象所在线程后再TcpSession::send()
|
||||
API_EXPORT void API_CALL mk_tcp_session_send_safe(const mk_tcp_session ctx, const char *data, size_t len);
|
||||
API_EXPORT void API_CALL mk_tcp_session_send_buffer_safe(const mk_tcp_session ctx, mk_buffer buffer);
|
||||
|
||||
//创建mk_tcp_session的强引用
|
||||
API_EXPORT mk_tcp_session_ref API_CALL mk_tcp_session_ref_from(const mk_tcp_session ctx);
|
||||
//删除mk_tcp_session的强引用
|
||||
API_EXPORT void mk_tcp_session_ref_release(const mk_tcp_session_ref ref);
|
||||
//根据强引用获取mk_tcp_session
|
||||
API_EXPORT mk_tcp_session mk_tcp_session_from_ref(const mk_tcp_session_ref ref);
|
||||
|
||||
///////////////////////////////////////////自定义tcp服务/////////////////////////////////////////////
|
||||
|
||||
typedef struct {
|
||||
/**
|
||||
* 收到mk_tcp_session创建对象
|
||||
* @param server_port 服务器端口号
|
||||
* @param session 会话处理对象
|
||||
*/
|
||||
void (API_CALL *on_mk_tcp_session_create)(uint16_t server_port,mk_tcp_session session);
|
||||
|
||||
/**
|
||||
* 收到客户端发过来的数据
|
||||
* @param server_port 服务器端口号
|
||||
* @param session 会话处理对象
|
||||
* @param buffer 数据
|
||||
*/
|
||||
void (API_CALL *on_mk_tcp_session_data)(uint16_t server_port,mk_tcp_session session, mk_buffer buffer);
|
||||
|
||||
/**
|
||||
* 每隔2秒的定时器,用于管理超时等任务
|
||||
* @param server_port 服务器端口号
|
||||
* @param session 会话处理对象
|
||||
*/
|
||||
void (API_CALL *on_mk_tcp_session_manager)(uint16_t server_port,mk_tcp_session session);
|
||||
|
||||
/**
|
||||
* 一般由于客户端断开tcp触发
|
||||
* @param server_port 服务器端口号
|
||||
* @param session 会话处理对象
|
||||
* @param code 错误代码
|
||||
* @param msg 错误提示
|
||||
*/
|
||||
void (API_CALL *on_mk_tcp_session_disconnect)(uint16_t server_port,mk_tcp_session session,int code,const char *msg);
|
||||
} mk_tcp_session_events;
|
||||
|
||||
|
||||
typedef enum {
|
||||
//普通的tcp
|
||||
mk_type_tcp = 0,
|
||||
//ssl类型的tcp
|
||||
mk_type_ssl = 1,
|
||||
//基于websocket的连接
|
||||
mk_type_ws = 2,
|
||||
//基于ssl websocket的连接
|
||||
mk_type_wss = 3
|
||||
}mk_tcp_type;
|
||||
|
||||
/**
|
||||
* tcp会话对象附着用户数据
|
||||
* 该函数只对mk_tcp_server_server_start启动的服务类型有效
|
||||
* @param session 会话对象
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_tcp_session_set_user_data(mk_tcp_session session, void *user_data);
|
||||
API_EXPORT void API_CALL mk_tcp_session_set_user_data2(mk_tcp_session session, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 获取tcp会话对象上附着的用户数据
|
||||
* 该函数只对mk_tcp_server_server_start启动的服务类型有效
|
||||
* @param session tcp会话对象
|
||||
* @return 用户数据指针
|
||||
*/
|
||||
API_EXPORT void* API_CALL mk_tcp_session_get_user_data(mk_tcp_session session);
|
||||
|
||||
/**
|
||||
* 开启tcp服务器
|
||||
* @param port 监听端口号,0则为随机
|
||||
* @param type 服务器类型
|
||||
*/
|
||||
API_EXPORT uint16_t API_CALL mk_tcp_server_start(uint16_t port, mk_tcp_type type);
|
||||
|
||||
/**
|
||||
* 监听tcp服务器事件
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_tcp_server_events_listen(const mk_tcp_session_events *events);
|
||||
|
||||
|
||||
///////////////////////////////////////////自定义tcp客户端/////////////////////////////////////////////
|
||||
|
||||
typedef struct mk_tcp_client_t *mk_tcp_client;
|
||||
//获取基类指针以便获取其网络相关信息
|
||||
API_EXPORT mk_sock_info API_CALL mk_tcp_client_get_sock_info(const mk_tcp_client ctx);
|
||||
|
||||
typedef struct {
|
||||
/**
|
||||
* tcp客户端连接服务器成功或失败回调
|
||||
* @param client tcp客户端
|
||||
* @param code 0为连接成功,否则为失败原因
|
||||
* @param msg 连接失败错误提示
|
||||
*/
|
||||
void (API_CALL *on_mk_tcp_client_connect)(mk_tcp_client client,int code,const char *msg);
|
||||
|
||||
/**
|
||||
* tcp客户端与tcp服务器之间断开回调
|
||||
* 一般是eof事件导致
|
||||
* @param client tcp客户端
|
||||
* @param code 错误代码
|
||||
* @param msg 错误提示
|
||||
*/
|
||||
void (API_CALL *on_mk_tcp_client_disconnect)(mk_tcp_client client,int code,const char *msg);
|
||||
|
||||
/**
|
||||
* 收到tcp服务器发来的数据
|
||||
* @param client tcp客户端
|
||||
* @param buffer 数据
|
||||
*/
|
||||
void (API_CALL *on_mk_tcp_client_data)(mk_tcp_client client, mk_buffer buffer);
|
||||
|
||||
/**
|
||||
* 每隔2秒的定时器,用于管理超时等任务
|
||||
* @param client tcp客户端
|
||||
*/
|
||||
void (API_CALL *on_mk_tcp_client_manager)(mk_tcp_client client);
|
||||
} mk_tcp_client_events;
|
||||
|
||||
/**
|
||||
* 创建tcp客户端
|
||||
* @param events 回调函数结构体
|
||||
* @param user_data 用户数据指针
|
||||
* @param type 客户端类型
|
||||
* @return 客户端对象
|
||||
*/
|
||||
API_EXPORT mk_tcp_client API_CALL mk_tcp_client_create(mk_tcp_client_events *events, mk_tcp_type type);
|
||||
|
||||
/**
|
||||
* 释放tcp客户端
|
||||
* @param ctx 客户端对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_tcp_client_release(mk_tcp_client ctx);
|
||||
|
||||
/**
|
||||
* 发起连接
|
||||
* @param ctx 客户端对象
|
||||
* @param host 服务器ip或域名
|
||||
* @param port 服务器端口号
|
||||
* @param time_out_sec 超时时间
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_tcp_client_connect(mk_tcp_client ctx, const char *host, uint16_t port, float time_out_sec);
|
||||
|
||||
/**
|
||||
* 非线程安全的发送数据
|
||||
* 开发者如果能确保在本对象网络线程内,可以调用此此函数
|
||||
* @param ctx 客户端对象
|
||||
* @param data 数据指针
|
||||
* @param len 数据长度,等于0时,内部通过strlen获取
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_tcp_client_send(mk_tcp_client ctx, const char *data, int len);
|
||||
API_EXPORT void API_CALL mk_tcp_client_send_buffer(mk_tcp_client ctx, mk_buffer buffer);
|
||||
|
||||
/**
|
||||
* 切换到本对象的网络线程后再发送数据
|
||||
* @param ctx 客户端对象
|
||||
* @param data 数据指针
|
||||
* @param len 数据长度,等于0时,内部通过strlen获取
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_tcp_client_send_safe(mk_tcp_client ctx, const char *data, int len);
|
||||
API_EXPORT void API_CALL mk_tcp_client_send_buffer_safe(mk_tcp_client ctx, mk_buffer buffer);
|
||||
|
||||
/**
|
||||
* 客户端附着用户数据
|
||||
* @param ctx 客户端对象
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_tcp_client_set_user_data(mk_tcp_client ctx, void *user_data);
|
||||
API_EXPORT void API_CALL mk_tcp_client_set_user_data2(mk_tcp_client ctx, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 获取客户端对象上附着的用户数据
|
||||
* @param ctx 客户端对象
|
||||
* @return 用户数据指针
|
||||
*/
|
||||
API_EXPORT void* API_CALL mk_tcp_client_get_user_data(mk_tcp_client ctx);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif //MK_TCP_H
|
||||
164
rknn_usb_rtsp-master/mk_api/include/mk_thread.h
Normal file
164
rknn_usb_rtsp-master/mk_api/include/mk_thread.h
Normal file
@@ -0,0 +1,164 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_THREAD_H
|
||||
#define MK_THREAD_H
|
||||
|
||||
#include <assert.h>
|
||||
#include "mk_common.h"
|
||||
#include "mk_tcp.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////事件线程/////////////////////////////////////////////
|
||||
typedef struct mk_thread_t *mk_thread;
|
||||
|
||||
/**
|
||||
* 获取tcp会话对象所在事件线程
|
||||
* @param ctx tcp会话对象
|
||||
* @return 对象所在事件线程
|
||||
*/
|
||||
API_EXPORT mk_thread API_CALL mk_thread_from_tcp_session(mk_tcp_session ctx);
|
||||
|
||||
/**
|
||||
* 获取tcp客户端对象所在事件线程
|
||||
* @param ctx tcp客户端
|
||||
* @return 对象所在事件线程
|
||||
*/
|
||||
API_EXPORT mk_thread API_CALL mk_thread_from_tcp_client(mk_tcp_client ctx);
|
||||
|
||||
/**
|
||||
* 根据负载均衡算法,从事件线程池中随机获取一个事件线程
|
||||
* 如果在事件线程内执行此函数将返回本事件线程
|
||||
* 事件线程指的是定时器、网络io事件线程
|
||||
* @return 事件线程
|
||||
*/
|
||||
API_EXPORT mk_thread API_CALL mk_thread_from_pool();
|
||||
|
||||
/**
|
||||
* 根据负载均衡算法,从后台线程池中随机获取一个线程
|
||||
* 后台线程本质与事件线程相同,只是优先级更低,同时可以执行短时间的阻塞任务
|
||||
* ZLMediaKit中后台线程用于dns解析、mp4点播时的文件解复用
|
||||
* @return 后台线程
|
||||
*/
|
||||
API_EXPORT mk_thread API_CALL mk_thread_from_pool_work();
|
||||
|
||||
typedef struct mk_thread_pool_t *mk_thread_pool;
|
||||
|
||||
/**
|
||||
* 创建线程池
|
||||
* @param name 线程池名称,方便调试
|
||||
* @param n_thread 线程个数,0时为cpu个数
|
||||
* @param priority 线程优先级,分为PRIORITY_LOWEST = 0,PRIORITY_LOW, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_HIGHEST
|
||||
* @return 线程池
|
||||
*/
|
||||
API_EXPORT mk_thread_pool API_CALL mk_thread_pool_create(const char *name, size_t n_thread, int priority);
|
||||
|
||||
/**
|
||||
* 销毁线程池
|
||||
* @param pool 线程池
|
||||
* @return 0:成功
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_thread_pool_release(mk_thread_pool pool);
|
||||
|
||||
/**
|
||||
* 从线程池获取一个线程
|
||||
* @param pool 线程池
|
||||
* @return 线程
|
||||
*/
|
||||
API_EXPORT mk_thread API_CALL mk_thread_from_thread_pool(mk_thread_pool pool);
|
||||
|
||||
///////////////////////////////////////////线程切换/////////////////////////////////////////////
|
||||
typedef void (API_CALL *on_mk_async)(void *user_data);
|
||||
|
||||
/**
|
||||
* 切换到事件线程并异步执行
|
||||
* @param ctx 事件线程
|
||||
* @param cb 回调函数
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_async_do(mk_thread ctx, on_mk_async cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_async_do2(mk_thread ctx, on_mk_async cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 切换到事件线程并延时执行
|
||||
* @param ctx 事件线程
|
||||
* @param ms 延时时间,单位毫秒
|
||||
* @param cb 回调函数
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_async_do_delay(mk_thread ctx, size_t ms, on_mk_async cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_async_do_delay2(mk_thread ctx, size_t ms, on_mk_async cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 切换到事件线程并同步执行
|
||||
* @param ctx 事件线程
|
||||
* @param cb 回调函数
|
||||
* @param user_data 用户数据指针
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_sync_do(mk_thread ctx, on_mk_async cb, void *user_data);
|
||||
|
||||
///////////////////////////////////////////定时器/////////////////////////////////////////////
|
||||
typedef struct mk_timer_t *mk_timer;
|
||||
|
||||
/**
|
||||
* 定时器触发事件
|
||||
* @return 下一次触发延时(单位毫秒),返回0则不再重复
|
||||
*/
|
||||
typedef uint64_t (API_CALL *on_mk_timer)(void *user_data);
|
||||
|
||||
/**
|
||||
* 创建定时器
|
||||
* @param ctx 线程对象
|
||||
* @param delay_ms 执行延时,单位毫秒
|
||||
* @param cb 回调函数
|
||||
* @param user_data 用户数据指针
|
||||
* @return 定时器对象
|
||||
*/
|
||||
API_EXPORT mk_timer API_CALL mk_timer_create(mk_thread ctx, uint64_t delay_ms, on_mk_timer cb, void *user_data);
|
||||
API_EXPORT mk_timer API_CALL mk_timer_create2(mk_thread ctx, uint64_t delay_ms, on_mk_timer cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 销毁和取消定时器
|
||||
* @param ctx 定时器对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_timer_release(mk_timer ctx);
|
||||
|
||||
///////////////////////////////////////////信号量/////////////////////////////////////////////
|
||||
|
||||
typedef struct mk_sem_t *mk_sem;
|
||||
|
||||
/**
|
||||
* 创建信号量
|
||||
*/
|
||||
API_EXPORT mk_sem API_CALL mk_sem_create();
|
||||
|
||||
/**
|
||||
* 销毁信号量
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_sem_release(mk_sem sem);
|
||||
|
||||
/**
|
||||
* 信号量加n
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_sem_post(mk_sem sem, size_t n);
|
||||
|
||||
/**
|
||||
* 信号量减1
|
||||
* @param sem
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_sem_wait(mk_sem sem);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif //MK_THREAD_H
|
||||
136
rknn_usb_rtsp-master/mk_api/include/mk_track.h
Normal file
136
rknn_usb_rtsp-master/mk_api/include/mk_track.h
Normal file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef ZLMEDIAKIT_MK_TRACK_H
|
||||
#define ZLMEDIAKIT_MK_TRACK_H
|
||||
|
||||
#include "mk_common.h"
|
||||
#include "mk_frame.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//音视频轨道
|
||||
typedef struct mk_track_t *mk_track;
|
||||
//输出frame回调
|
||||
typedef void(API_CALL *on_mk_frame_out)(void *user_data, mk_frame frame);
|
||||
|
||||
//track创建参数
|
||||
typedef union {
|
||||
struct {
|
||||
int width;
|
||||
int height;
|
||||
int fps;
|
||||
} video;
|
||||
|
||||
struct {
|
||||
int channels;
|
||||
int sample_rate;
|
||||
} audio;
|
||||
} codec_args;
|
||||
|
||||
/**
|
||||
* 创建track对象引用
|
||||
* @param codec_id 请参考MKCodecXXX 常量定义
|
||||
* @param args 视频或音频参数
|
||||
* @return track对象引用
|
||||
*/
|
||||
API_EXPORT mk_track API_CALL mk_track_create(int codec_id, codec_args *args);
|
||||
|
||||
/**
|
||||
* 减引用track对象
|
||||
* @param track track对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_track_unref(mk_track track);
|
||||
|
||||
/**
|
||||
* 引用track对象
|
||||
* @param track track对象
|
||||
* @return 新的track引用对象
|
||||
*/
|
||||
API_EXPORT mk_track API_CALL mk_track_ref(mk_track track);
|
||||
|
||||
/**
|
||||
* 获取track 编码codec类型,请参考MKCodecXXX定义
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_track_codec_id(mk_track track);
|
||||
|
||||
/**
|
||||
* 获取编码codec名称
|
||||
*/
|
||||
API_EXPORT const char* API_CALL mk_track_codec_name(mk_track track);
|
||||
|
||||
/**
|
||||
* 获取比特率信息
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_track_bit_rate(mk_track track);
|
||||
|
||||
/**
|
||||
* 监听frame输出事件
|
||||
* @param track track对象
|
||||
* @param cb frame输出回调
|
||||
* @param user_data frame输出回调用户指针参数
|
||||
*/
|
||||
API_EXPORT void *API_CALL mk_track_add_delegate(mk_track track, on_mk_frame_out cb, void *user_data);
|
||||
API_EXPORT void *API_CALL mk_track_add_delegate2(mk_track track, on_mk_frame_out cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 取消frame输出事件监听
|
||||
* @param track track对象
|
||||
* @param tag mk_track_add_delegate返回值
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_track_del_delegate(mk_track track, void *tag);
|
||||
|
||||
/**
|
||||
* 输入frame到track,通常你不需要调用此api
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_track_input_frame(mk_track track, mk_frame frame);
|
||||
|
||||
/**
|
||||
* track是否为视频
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_track_is_video(mk_track track);
|
||||
|
||||
/**
|
||||
* 获取视频宽度
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_track_video_width(mk_track track);
|
||||
|
||||
/**
|
||||
* 获取视频高度
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_track_video_height(mk_track track);
|
||||
|
||||
/**
|
||||
* 获取视频帧率
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_track_video_fps(mk_track track);
|
||||
|
||||
/**
|
||||
* 获取音频采样率
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_track_audio_sample_rate(mk_track track);
|
||||
|
||||
/**
|
||||
* 获取音频通道数
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_track_audio_channel(mk_track track);
|
||||
|
||||
/**
|
||||
* 获取音频位数,一般为16bit
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_track_audio_sample_bit(mk_track track);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //ZLMEDIAKIT_MK_TRACK_H
|
||||
188
rknn_usb_rtsp-master/mk_api/include/mk_transcode.h
Normal file
188
rknn_usb_rtsp-master/mk_api/include/mk_transcode.h
Normal file
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef ZLMEDIAKIT_MK_TRANSCODE_H
|
||||
#define ZLMEDIAKIT_MK_TRANSCODE_H
|
||||
|
||||
#include "mk_common.h"
|
||||
#include "mk_track.h"
|
||||
#include "mk_tcp.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//解码器对象
|
||||
typedef struct mk_decoder_t *mk_decoder;
|
||||
//解码后的frame
|
||||
typedef struct mk_frame_pix_t *mk_frame_pix;
|
||||
//SwsContext的包装
|
||||
typedef struct mk_swscale_t *mk_swscale;
|
||||
//FFmpeg原始解码帧对象
|
||||
typedef struct AVFrame AVFrame;
|
||||
//FFmpeg编解码器对象
|
||||
typedef struct AVCodecContext AVCodecContext;
|
||||
//解码输出回调
|
||||
typedef void(API_CALL *on_mk_decode)(void *user_data, mk_frame_pix frame);
|
||||
|
||||
/**
|
||||
* 创建解码器
|
||||
* @param track track对象
|
||||
* @param thread_num 解码线程数,0时为自动
|
||||
* @return 返回解码器对象,NULL代表失败
|
||||
*/
|
||||
API_EXPORT mk_decoder API_CALL mk_decoder_create(mk_track track, int thread_num);
|
||||
|
||||
/**
|
||||
* 创建解码器
|
||||
* @param track track对象
|
||||
* @param thread_num 解码线程数,0时为自动
|
||||
* @param codec_name_list 偏好的ffmpeg codec name列表,以NULL结尾,譬如:{"libopenh264", "h264_nvdec", NULL};
|
||||
* 在数组中越前,优先级越高;如果指定的codec不存在,或跟mk_track_codec_id类型不匹配时,则使用内部默认codec列表
|
||||
* @return 返回解码器对象,NULL代表失败
|
||||
*/
|
||||
API_EXPORT mk_decoder API_CALL mk_decoder_create2(mk_track track, int thread_num, const char *codec_name_list[]);
|
||||
|
||||
/**
|
||||
* 销毁解码器
|
||||
* @param ctx 解码器对象
|
||||
* @param flush_frame 是否等待所有帧解码成功
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_decoder_release(mk_decoder ctx, int flush_frame);
|
||||
|
||||
/**
|
||||
* 解码音视频帧
|
||||
* @param ctx 解码器
|
||||
* @param frame 帧对象
|
||||
* @param async 是否异步解码
|
||||
* @param enable_merge 是否合并帧解码,有些情况下,需要把时间戳相同的slice合并输入到解码器才能解码
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_decoder_decode(mk_decoder ctx, mk_frame frame, int async, int enable_merge);
|
||||
|
||||
/**
|
||||
* 设置异步解码最大帧缓存积压数限制
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_decoder_set_max_async_frame_size(mk_decoder ctx, size_t size);
|
||||
|
||||
/**
|
||||
* 设置解码输出回调
|
||||
* @param ctx 解码器
|
||||
* @param cb 回调函数
|
||||
* @param user_data 回调函数用户指针参数
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_decoder_set_cb(mk_decoder ctx, on_mk_decode cb, void *user_data);
|
||||
API_EXPORT void API_CALL mk_decoder_set_cb2(mk_decoder ctx, on_mk_decode cb, void *user_data, on_user_data_free user_data_free);
|
||||
|
||||
/**
|
||||
* 获取FFmpeg原始AVCodecContext对象
|
||||
* @param ctx 解码器
|
||||
*/
|
||||
API_EXPORT const AVCodecContext* API_CALL mk_decoder_get_context(mk_decoder ctx);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* 创建解码帧mk_frame_pix新引用
|
||||
* @param frame 原始引用
|
||||
* @return 新引用
|
||||
*/
|
||||
API_EXPORT mk_frame_pix API_CALL mk_frame_pix_ref(mk_frame_pix frame);
|
||||
|
||||
/**
|
||||
* 解码帧mk_frame_pix减引用
|
||||
* @param frame 原始引用
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_frame_pix_unref(mk_frame_pix frame);
|
||||
|
||||
/**
|
||||
* 从FFmpeg AVFrame转换为mk_frame_pix
|
||||
* @param frame FFmpeg AVFrame
|
||||
* @return mk_frame_pix对象
|
||||
*/
|
||||
API_EXPORT mk_frame_pix API_CALL mk_frame_pix_from_av_frame(AVFrame *frame);
|
||||
|
||||
/**
|
||||
* 可无内存拷贝的创建mk_frame_pix对象
|
||||
* @param plane_data 多个平面数据, 通过mk_buffer_get_data获取其数据指针
|
||||
* @param line_size 平面数据line size
|
||||
* @param plane 数据平面个数
|
||||
* @return mk_frame_pix对象
|
||||
*/
|
||||
API_EXPORT mk_frame_pix API_CALL mk_frame_pix_from_buffer(mk_buffer plane_data[], int line_size[], int plane);
|
||||
|
||||
/**
|
||||
* 获取FFmpeg AVFrame对象
|
||||
* @param frame 解码帧mk_frame_pix
|
||||
* @return FFmpeg AVFrame对象
|
||||
*/
|
||||
API_EXPORT AVFrame* API_CALL mk_frame_pix_get_av_frame(mk_frame_pix frame);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* 创建ffmpeg SwsContext wrapper实例
|
||||
* @param output AVPixelFormat类型,AV_PIX_FMT_BGR24==3
|
||||
* @param width 目标宽度,置0时,则与输入时一致
|
||||
* @param height 目标高度,置0时,则与输入时一致
|
||||
* @return SwsContext wrapper 实例
|
||||
*/
|
||||
API_EXPORT mk_swscale mk_swscale_create(int output, int width, int height);
|
||||
|
||||
/**
|
||||
* 释放ffmpeg SwsContext wrapper实例
|
||||
* @param ctx SwsContext wrapper实例
|
||||
*/
|
||||
API_EXPORT void mk_swscale_release(mk_swscale ctx);
|
||||
|
||||
/**
|
||||
* 使用SwsContext转换pix format
|
||||
* @param ctx SwsContext wrapper实例
|
||||
* @param frame pix frame
|
||||
* @param out 转换后存放的数据指针,用户需要确保提前申请并大小足够
|
||||
* @return sws_scale()返回值:the height of the output slice
|
||||
*/
|
||||
API_EXPORT int mk_swscale_input_frame(mk_swscale ctx, mk_frame_pix frame, uint8_t *out);
|
||||
|
||||
/**
|
||||
* 使用SwsContext转换pix format
|
||||
* @param ctx SwsContext wrapper实例
|
||||
* @param frame pix frame
|
||||
* @return 新的pix frame对象,需要使用mk_frame_pix_unref销毁
|
||||
*/
|
||||
API_EXPORT mk_frame_pix mk_swscale_input_frame2(mk_swscale ctx, mk_frame_pix frame);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
API_EXPORT uint8_t **API_CALL mk_get_av_frame_data(AVFrame *frame);
|
||||
API_EXPORT void API_CALL mk_set_av_frame_data(AVFrame *frame, uint8_t *data, int plane);
|
||||
|
||||
API_EXPORT int *API_CALL mk_get_av_frame_line_size(AVFrame *frame);
|
||||
API_EXPORT void API_CALL mk_set_av_frame_line_size(AVFrame *frame, int line_size, int plane);
|
||||
|
||||
API_EXPORT int64_t API_CALL mk_get_av_frame_dts(AVFrame *frame);
|
||||
API_EXPORT void API_CALL mk_set_av_frame_dts(AVFrame *frame, int64_t dts);
|
||||
|
||||
API_EXPORT int64_t API_CALL mk_get_av_frame_pts(AVFrame *frame);
|
||||
API_EXPORT void API_CALL mk_set_av_frame_pts(AVFrame *frame, int64_t pts);
|
||||
|
||||
API_EXPORT int API_CALL mk_get_av_frame_width(AVFrame *frame);
|
||||
API_EXPORT void API_CALL mk_set_av_frame_width(AVFrame *frame, int width);
|
||||
|
||||
API_EXPORT int API_CALL mk_get_av_frame_height(AVFrame *frame);
|
||||
API_EXPORT void API_CALL mk_set_av_frame_height(AVFrame *frame, int height);
|
||||
|
||||
API_EXPORT int API_CALL mk_get_av_frame_format(AVFrame *frame);
|
||||
API_EXPORT void API_CALL mk_set_av_frame_format(AVFrame *frame, int format);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //ZLMEDIAKIT_MK_TRANSCODE_H
|
||||
156
rknn_usb_rtsp-master/mk_api/include/mk_util.h
Normal file
156
rknn_usb_rtsp-master/mk_api/include/mk_util.h
Normal file
@@ -0,0 +1,156 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef MK_UTIL_H
|
||||
#define MK_UTIL_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "mk_common.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* 释放mk api内部malloc的资源
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_free(void *ptr);
|
||||
|
||||
/**
|
||||
* 获取本程序可执行文件路径
|
||||
* @return 文件路径,使用完后需要自己mk_free
|
||||
*/
|
||||
API_EXPORT char* API_CALL mk_util_get_exe_path();
|
||||
|
||||
/**
|
||||
* 获取本程序可执行文件相同目录下文件的绝对路径
|
||||
* @param relative_path 同目录下文件的路径相对,可以为null
|
||||
* @return 文件路径,使用完后需要自己mk_free
|
||||
*/
|
||||
API_EXPORT char* API_CALL mk_util_get_exe_dir(const char *relative_path);
|
||||
|
||||
/**
|
||||
* 获取unix标准的系统时间戳
|
||||
* @return 当前系统时间戳
|
||||
*/
|
||||
API_EXPORT uint64_t API_CALL mk_util_get_current_millisecond();
|
||||
|
||||
/**
|
||||
* 获取时间字符串
|
||||
* @param fmt 时间格式,譬如%Y-%m-%d %H:%M:%S
|
||||
* @return 时间字符串,使用完后需要自己mk_free
|
||||
*/
|
||||
API_EXPORT char* API_CALL mk_util_get_current_time_string(const char *fmt);
|
||||
|
||||
/**
|
||||
* 打印二进制为字符串
|
||||
* @param buf 二进制数据
|
||||
* @param len 数据长度
|
||||
* @return 可打印的调试信息,使用完后需要自己mk_free
|
||||
*/
|
||||
API_EXPORT char* API_CALL mk_util_hex_dump(const void *buf, int len);
|
||||
|
||||
///////////////////////////////////////////mk ini/////////////////////////////////////////////
|
||||
typedef struct mk_ini_t *mk_ini;
|
||||
|
||||
/**
|
||||
* 创建ini配置对象
|
||||
*/
|
||||
API_EXPORT mk_ini API_CALL mk_ini_create();
|
||||
|
||||
/**
|
||||
* 返回全局默认ini配置
|
||||
* @return 全局默认ini配置,请勿用mk_ini_release释放它
|
||||
*/
|
||||
API_EXPORT mk_ini API_CALL mk_ini_default();
|
||||
|
||||
/**
|
||||
* 加载ini配置文件内容
|
||||
* @param ini ini对象
|
||||
* @param str 配置文件内容
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_ini_load_string(mk_ini ini, const char *str);
|
||||
|
||||
/**
|
||||
* 加载ini配置文件
|
||||
* @param ini ini对象
|
||||
* @param file 配置文件路径
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_ini_load_file(mk_ini ini, const char *file);
|
||||
|
||||
/**
|
||||
* 销毁ini配置对象
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_ini_release(mk_ini ini);
|
||||
|
||||
/**
|
||||
* 添加或覆盖配置项
|
||||
* @param ini 配置对象
|
||||
* @param key 配置名,两段式,如:field.key
|
||||
* @param value 配置值
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_ini_set_option(mk_ini ini, const char *key, const char *value);
|
||||
API_EXPORT void API_CALL mk_ini_set_option_int(mk_ini ini, const char *key, int value);
|
||||
|
||||
/**
|
||||
* 获取配置项
|
||||
* @param ini 配置对象
|
||||
* @param key 配置名,两段式,如:field.key
|
||||
* @return 配置不存在返回NULL,否则返回配置值
|
||||
*/
|
||||
API_EXPORT const char *API_CALL mk_ini_get_option(mk_ini ini, const char *key);
|
||||
|
||||
/**
|
||||
* 删除配置项
|
||||
* @param ini 配置对象
|
||||
* @param key 配置名,两段式,如:field.key
|
||||
* @return 1: 成功,0: 该配置不存在
|
||||
*/
|
||||
API_EXPORT int API_CALL mk_ini_del_option(mk_ini ini, const char *key);
|
||||
|
||||
/**
|
||||
* 导出为配置文件内容
|
||||
* @param ini 配置对象
|
||||
* @return 配置文件内容字符串,用完后需要自行mk_free
|
||||
*/
|
||||
API_EXPORT char *API_CALL mk_ini_dump_string(mk_ini ini);
|
||||
|
||||
/**
|
||||
* 导出配置文件到文件
|
||||
* @param ini 配置对象
|
||||
* @param file 配置文件路径
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_ini_dump_file(mk_ini ini, const char *file);
|
||||
|
||||
///////////////////////////////////////////日志/////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* 打印日志
|
||||
* @param level 日志级别,支持0~4
|
||||
* @param file __FILE__
|
||||
* @param function __FUNCTION__
|
||||
* @param line __LINE__
|
||||
* @param fmt printf类型的格式控制字符串
|
||||
* @param ... 不定长参数
|
||||
*/
|
||||
API_EXPORT void API_CALL mk_log_printf(int level, const char *file, const char *function, int line, const char *fmt, ...);
|
||||
|
||||
// 以下宏可以替换printf使用
|
||||
#define log_printf(lev, ...) mk_log_printf(lev, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||
#define log_trace(...) log_printf(0, ##__VA_ARGS__)
|
||||
#define log_debug(...) log_printf(1, ##__VA_ARGS__)
|
||||
#define log_info(...) log_printf(2, ##__VA_ARGS__)
|
||||
#define log_warn(...) log_printf(3, ##__VA_ARGS__)
|
||||
#define log_error(...) log_printf(4, ##__VA_ARGS__)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif //MK_UTIL_H
|
||||
Reference in New Issue
Block a user