ZLMediaKit/api/include/mk_media.h

503 lines
19 KiB
C++
Raw Permalink Normal View History

2019-12-18 11:47:49 +08:00
/*
2023-12-09 16:23:51 +08:00
* Copyright (c) 2016-present The ZLMediaKit project authors. All Rights Reserved.
2019-12-17 18:45:31 +08:00
*
2023-12-09 16:23:51 +08:00
* This file is part of ZLMediaKit(https://github.com/ZLMediaKit/ZLMediaKit).
2019-12-17 18:45:31 +08:00
*
2023-12-09 16:23:51 +08:00
* Use of this source code is governed by MIT-like license that can be found in the
2020-04-04 20:30:09 +08:00
* 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.
2019-12-17 18:45:31 +08:00
*/
#ifndef MK_MEDIA_H_
#define MK_MEDIA_H_
#include "mk_common.h"
2022-05-25 15:38:32 +08:00
#include "mk_track.h"
#include "mk_frame.h"
2020-07-02 18:14:39 +08:00
#include "mk_events_objects.h"
2022-08-27 10:17:06 +08:00
#include "mk_thread.h"
#include "mk_util.h"
2019-12-17 18:45:31 +08:00
#ifdef __cplusplus
extern "C" {
#endif
typedef struct mk_media_t *mk_media;
2019-12-17 18:45:31 +08:00
/**
*
2019-12-18 14:43:32 +08:00
* @param vhost __defaultVhost__
2019-12-17 18:45:31 +08:00
* @param app live
* @param stream idcamera
* @param duration ()0
* @param hls_enabled hls
* @param mp4_enabled mp4
* @return
* Create a media source
* @param vhost Virtual host name, generally __defaultVhost__
* @param app Application name, recommended as live
* @param stream Stream id, such as camera
* @param duration Duration (in seconds), 0 for live broadcast
* @param hls_enabled Whether to generate hls
* @param mp4_enabled Whether to generate mp4
* @return Object pointer
* [AUTO-TRANSLATED:b5124a1e]
2019-12-17 18:45:31 +08:00
*/
2020-09-20 09:26:00 +08:00
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);
2019-12-17 18:45:31 +08:00
/**
*
* @param vhost __defaultVhost__
* @param app live
* @param stream idcamera
* @param duration ()0
* @param option ProtocolOption相关配置
* @return
* Create a media source
* @param vhost Virtual host name, generally __defaultVhost__
* @param app Application name, recommended as live
* @param stream Stream id, such as camera
* @param duration Duration (in seconds), 0 for live broadcast
* @param option ProtocolOption related configuration
* @return Object pointer
* [AUTO-TRANSLATED:870d86b0]
*/
API_EXPORT mk_media API_CALL mk_media_create2(const char *vhost, const char *app, const char *stream, float duration, mk_ini option);
2019-12-17 18:45:31 +08:00
/**
*
* @param ctx
* Destroy the media source
* @param ctx Object pointer
* [AUTO-TRANSLATED:a63ad166]
2019-12-17 18:45:31 +08:00
*/
API_EXPORT void API_CALL mk_media_release(mk_media ctx);
/**
2022-05-25 15:38:32 +08:00
* track
* @param ctx mk_media对象
* @param track mk_track对象
* Add audio and video tracks
* @param ctx mk_media object
* @param track mk_track object, audio and video track
* [AUTO-TRANSLATED:0e4ebe8d]
2022-05-25 15:38:32 +08:00
*/
API_EXPORT void API_CALL mk_media_init_track(mk_media ctx, mk_track track);
/**
* mk_media_init_track方法
2019-12-17 18:45:31 +08:00
* @param ctx
2021-02-02 15:11:16 +08:00
* @param codec_id 0:CodecH264/1:CodecH265
2022-05-25 15:38:32 +08:00
* @param width ;
* @param height ;
* @param fps fps;
* @param bit_rate ,bps;
2019-12-17 18:45:31 +08:00
* @param width
* @param height
* @param fps fps
2021-09-27 14:34:26 +08:00
* @return 10
* Add video track, please use mk_media_init_track method
* @param ctx Object pointer
* @param codec_id 0:CodecH264/1:CodecH265
* @param width Video width; Valid only during encoding
* @param height Video height; Valid only during encoding
* @param fps Video fps; Valid only during encoding
* @param bit_rate Video bitrate, unit bps; Valid only during encoding
* @param width Video width
* @param height Video height
* @param fps Video fps
* @return 1 for success, 0 for failure
* [AUTO-TRANSLATED:c6944851]
2019-12-17 18:45:31 +08:00
*/
2022-05-25 15:38:32 +08:00
API_EXPORT int API_CALL mk_media_init_video(mk_media ctx, int codec_id, int width, int height, float fps, int bit_rate);
2019-12-17 18:45:31 +08:00
/**
2022-05-25 15:38:32 +08:00
* mk_media_init_track方法
2019-12-17 18:45:31 +08:00
* @param ctx
2021-02-02 15:11:16 +08:00
* @param codec_id 2:CodecAAC/3:CodecG711A/4:CodecG711U/5:OPUS
* @param channel
* @param sample_bit 16
* @param sample_rate
2021-09-27 14:34:26 +08:00
* @return 10
* Add audio track, please use mk_media_init_track method
* @param ctx Object pointer
* @param codec_id 2:CodecAAC/3:CodecG711A/4:CodecG711U/5:OPUS
* @param channel Number of channels
* @param sample_bit Sampling bit, only supports 16
* @param sample_rate Sampling rate
* @return 1 for success, 0 for failure
* [AUTO-TRANSLATED:5c5c7c7a]
*/
2021-09-27 14:34:26 +08:00
API_EXPORT int API_CALL mk_media_init_audio(mk_media ctx, int codec_id, int sample_rate, int channels, int sample_bit);
2020-02-27 11:40:38 +08:00
/**
* h264/h265/aac完毕后调用此函数
* track()ZLMediaKit不知道后续是否还要添加track3
* Track类型便(3)
* @param ctx
* Call this function after h264/h265/aac initialization,
* In single track (only audio or video), because ZLMediaKit does not know whether to add more tracks later, it will wait for 3 seconds.
* If the generated stream is a single Track type, please call this function to speed up the stream generation speed. Of course, if you do not call this function, the impact is not big (it will wait for 3 seconds).
* @param ctx Object pointer
* [AUTO-TRANSLATED:cd2bee12]
2020-02-27 11:40:38 +08:00
*/
API_EXPORT void API_CALL mk_media_init_complete(mk_media ctx);
2019-12-17 18:45:31 +08:00
/**
2022-05-25 15:38:32 +08:00
* frame对象
* @param ctx mk_media对象
* @param frame
* @return 10
* Input frame object
* @param ctx mk_media object
* @param frame Frame object
* @return 1 for success, 0 for failure
* [AUTO-TRANSLATED:9f6ca231]
2022-05-25 15:38:32 +08:00
*/
API_EXPORT int API_CALL mk_media_input_frame(mk_media ctx, mk_frame frame);
/**
* H264视频00 00 01,00 00 00 01mk_media_input_frame方法
2019-12-17 18:45:31 +08:00
* @param ctx
* @param data H264数据
* @param len H264数据字节数
* @param dts
2020-01-09 17:17:48 +08:00
* @param pts
2021-09-27 14:34:26 +08:00
* @return 10
* Input single frame H264 video, the starting byte of the frame can be 00 00 01, 00 00 00 01, please use mk_media_input_frame method
* @param ctx Object pointer
* @param data Single frame H264 data
* @param len Number of bytes of single frame H264 data
* @param dts Decode timestamp, unit milliseconds
* @param pts Play timestamp, unit milliseconds
* @return 1 for success, 0 for failure
* [AUTO-TRANSLATED:3b96ace8]
2019-12-17 18:45:31 +08:00
*/
2022-08-08 17:13:39 +08:00
API_EXPORT int API_CALL mk_media_input_h264(mk_media ctx, const void *data, int len, uint64_t dts, uint64_t pts);
2019-12-17 18:45:31 +08:00
/**
2022-05-25 15:38:32 +08:00
* H265视频00 00 01,00 00 00 01mk_media_input_frame方法
2019-12-17 18:45:31 +08:00
* @param ctx
* @param data H265数据
* @param len H265数据字节数
* @param dts
2020-01-09 17:17:48 +08:00
* @param pts
2021-09-27 14:34:26 +08:00
* @return 10
* Input single frame H265 video, the starting byte of the frame can be 00 00 01, 00 00 00 01, please use mk_media_input_frame method
* @param ctx Object pointer
* @param data Single frame H265 data
* @param len Number of bytes of single frame H265 data
* @param dts Decode timestamp, unit milliseconds
* @param pts Play timestamp, unit milliseconds
* @return 1 for success, 0 for failure
* [AUTO-TRANSLATED:884739ba]
2019-12-17 18:45:31 +08:00
*/
2022-08-08 17:13:39 +08:00
API_EXPORT int API_CALL mk_media_input_h265(mk_media ctx, const void *data, int len, uint64_t dts, uint64_t pts);
2019-12-17 18:45:31 +08:00
/**
2022-05-25 15:38:32 +08:00
* YUV视频数据
* @param ctx
* @param yuv yuv420p数据
* @param linesize yuv420p linesize
* @param cts
* Input YUV video data
* @param ctx Object pointer
* @param yuv yuv420p data
* @param linesize yuv420p linesize
* @param cts Video capture timestamp, unit milliseconds
* [AUTO-TRANSLATED:9c97805c]
2022-05-25 15:38:32 +08:00
*/
2022-08-08 17:13:39 +08:00
API_EXPORT void API_CALL mk_media_input_yuv(mk_media ctx, const char *yuv[3], int linesize[3], uint64_t cts);
2022-05-25 15:38:32 +08:00
/**
* AAC音频(adts头)mk_media_input_frame方法
2019-12-17 18:45:31 +08:00
* @param ctx
* @param data adts头的单帧AAC数据adts头7个字节
2019-12-17 18:45:31 +08:00
* @param len AAC数据字节数
* @param dts
2020-08-01 10:22:12 +08:00
* @param adts adts头null
2021-09-27 14:34:26 +08:00
* @return 10
* Input single frame AAC audio (specify adts header separately), please use mk_media_input_frame method
* @param ctx Object pointer
* @param data Single frame AAC data without adts header, adts header 7 bytes
* @param len Number of bytes of single frame AAC data
* @param dts Timestamp, milliseconds
* @param adts adts header, can be null
* @return 1 for success, 0 for failure
* [AUTO-TRANSLATED:11e0503d]
2019-12-17 18:45:31 +08:00
*/
2022-08-08 17:13:39 +08:00
API_EXPORT int API_CALL mk_media_input_aac(mk_media ctx, const void *data, int len, uint64_t dts, void *adts);
2019-12-17 18:45:31 +08:00
/**
2020-06-24 11:18:04 +08:00
* PCM音频,ENABLE_FAAC编译时
* @param ctx
* @param data PCM数据
* @param len PCM数据字节数
* @param dts
2021-09-27 14:34:26 +08:00
* @return 10
* Input single frame PCM audio, this function is valid only when ENABLE_FAAC is compiled
* @param ctx Object pointer
* @param data Single frame PCM data
* @param len Number of bytes of single frame PCM data
* @param dts Timestamp, milliseconds
* @return 1 for success, 0 for failure
* [AUTO-TRANSLATED:70f7488b]
*/
2022-08-08 17:13:39 +08:00
API_EXPORT int API_CALL mk_media_input_pcm(mk_media ctx, void *data, int len, uint64_t pts);
2020-06-24 11:18:04 +08:00
/**
2022-05-25 15:38:32 +08:00
* OPUS/G711音频帧mk_media_input_frame方法
* @param ctx
2020-08-01 10:22:12 +08:00
* @param data
* @param len
* @param dts
2021-09-27 14:34:26 +08:00
* @return 10
* Input single frame OPUS/G711 audio frame, please use mk_media_input_frame method
* @param ctx Object pointer
* @param data Single frame audio data
* @param len Number of bytes of single frame audio data
* @param dts Timestamp, milliseconds
* @return 1 for success, 0 for failure
* [AUTO-TRANSLATED:4ffeabd6]
*/
2022-08-08 17:13:39 +08:00
API_EXPORT int API_CALL mk_media_input_audio(mk_media ctx, const void* data, int len, uint64_t dts);
2020-02-28 17:53:21 +08:00
/**
2020-03-10 22:55:19 +08:00
* MediaSource.close()
* MediaSource时
* mk_media_release函数并且释放其他资源
* mk_media_release函数MediaSource.close()
2020-02-28 17:53:21 +08:00
* @param user_data mk_media_set_on_close函数设置
* MediaSource.close() callback event
* When you choose to close an associated MediaSource, it will eventually trigger this callback
* You should call mk_media_release function and release other resources through this event
* If you do not call mk_media_release function, then the MediaSource.close() operation will be invalid
* @param user_data User data pointer, set by mk_media_set_on_close function
* [AUTO-TRANSLATED:20191b2d]
2020-02-28 17:53:21 +08:00
*/
2020-03-10 22:55:19 +08:00
typedef void(API_CALL *on_mk_media_close)(void *user_data);
2020-02-28 17:53:21 +08:00
/**
* MediaSource.close()
2020-03-10 22:55:19 +08:00
* MediaSource时
* mk_media_release函数并且释放其他资源
2020-02-28 17:53:21 +08:00
* @param ctx
* @param cb
* @param user_data
* Listen to MediaSource.close() event
* When you choose to close an associated MediaSource, it will eventually trigger this callback
* You should call mk_media_release function and release other resources through this event
* @param ctx Object pointer
* @param cb Callback pointer
* @param user_data User data pointer
* [AUTO-TRANSLATED:35d9db20]
2020-02-28 17:53:21 +08:00
*/
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);
2020-02-28 17:53:21 +08:00
2020-04-02 10:31:33 +08:00
/**
* seek请求时触发该回调
* @param user_data ,mk_media_set_on_seek设置
* @param stamp_ms seek至的时间轴位置
* @return 1seek请求0
* Triggered when the client receives a seek request
* @param user_data User data pointer, set by mk_media_set_on_seek
* @param stamp_ms Seek to the timeline position, unit milliseconds
* @return 1 means the seek request will be processed, 0 means the request will be ignored
* [AUTO-TRANSLATED:c3301852]
2020-04-02 10:31:33 +08:00
*/
typedef int(API_CALL *on_mk_media_seek)(void *user_data,uint32_t stamp_ms);
/**
2021-08-12 16:07:31 +08:00
* pause或resume请求时触发该回调
* @param user_data ,mk_media_set_on_pause设置
2021-08-12 16:07:31 +08:00
* @param pause 1:, 0:
* Triggered when the client receives a pause or resume request
* @param user_data User data pointer, set by mk_media_set_on_pause
* @param pause 1: pause, 0: resume
* [AUTO-TRANSLATED:4f8aa828]
*/
2021-08-12 16:07:31 +08:00
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
* Triggered when the client receives a speed request
* @param user_data User data pointer, set by mk_media_set_on_pause
* @param speed 0.5 1.0 2.0
* [AUTO-TRANSLATED:51bd090d]
*/
typedef int(API_CALL* on_mk_media_speed)(void* user_data, float speed);
2020-04-02 10:31:33 +08:00
/**
* seek请求事件
* @param ctx
* @param cb
* @param user_data
* Listen to player seek request event
* @param ctx Object pointer
* @param cb Callback pointer
* @param user_data User data pointer
* [AUTO-TRANSLATED:50c723d0]
2020-04-02 10:31:33 +08:00
*/
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);
2020-04-02 10:31:33 +08:00
/**
* pause请求事件
* @param ctx
* @param cb
* @param user_data
* Listen to player pause request event
* @param ctx Object pointer
* @param cb Callback pointer
* @param user_data User data pointer
* [AUTO-TRANSLATED:bd6e9068]
*/
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
* Listen to player pause request event
* @param ctx Object pointer
* @param cb Callback pointer
* @param user_data User data pointer
* [AUTO-TRANSLATED:bd6e9068]
*/
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);
2020-02-28 17:53:21 +08:00
/**
*
* @param ctx
* @return
* Get the total number of viewers
* @param ctx Object pointer
* @return Number of viewers
* [AUTO-TRANSLATED:56635caf]
2020-02-28 17:53:21 +08:00
*/
API_EXPORT int API_CALL mk_media_total_reader_count(mk_media ctx);
2020-07-02 18:14:39 +08:00
/**
* MediaSource注册或注销事件
* @param user_data
* @param sender MediaSource对象
* @param regist 10
* MediaSource registration or deregistration event
* @param user_data User data pointer set when setting the callback
* @param sender Generated MediaSource object
* @param regist 1 for registration event, 0 for deregistration event
* [AUTO-TRANSLATED:4585bbef]
2020-07-02 18:14:39 +08:00
*/
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
* Set MediaSource registration or deregistration event callback function
* @param ctx Object pointer
* @param cb Callback pointer
* @param user_data User data pointer
* [AUTO-TRANSLATED:1c3b45be]
2020-07-02 18:14:39 +08:00
*/
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);
2020-07-02 18:14:39 +08:00
2020-11-21 22:13:08 +08:00
/**
* rtp推流成功与否的回调()
* Callback for whether rtp streaming is successful or not (after the first success, it will retry continuously)
* [AUTO-TRANSLATED:7e00f7fb]
2020-11-21 22:13:08 +08:00
*/
typedef on_mk_media_source_send_rtp_result on_mk_media_send_rtp_result;
/**
2022-08-27 10:17:06 +08:00
* ps-rtp流(ssrc区分多路)api线程安全
2020-11-21 22:13:08 +08:00
* @param ctx
* @param dst_url ip或域名
* @param dst_port
* @param ssrc rtp的ssrc10
* @param con_type 0: tcp主动1udp主动2tcp被动3udp被动
* @param options
2020-11-21 22:13:08 +08:00
* @param cb
* @param user_data
* Start sending a ps-rtp stream (distinguished by ssrc), this api is thread-safe
* @param ctx Object pointer
* @param dst_url Target ip or domain name
* @param dst_port Target port
* @param ssrc rtp's ssrc, 10-base string print
* @param con_type 0: tcp active, 1: udp active, 2: tcp passive, 3: udp passive
* @param options Options
* @param cb Start success or failure callback
* @param user_data Callback user pointer
* [AUTO-TRANSLATED:dbf694a0]
2020-11-21 22:13:08 +08:00
*/
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 con_type, 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 con_type, on_mk_media_send_rtp_result cb, void *user_data, on_user_data_free user_data_free);
API_EXPORT void API_CALL mk_media_start_send_rtp3(mk_media ctx, const char *dst_url, uint16_t dst_port, const char *ssrc, int con_type, mk_ini options, on_mk_media_send_rtp_result cb, void *user_data);
API_EXPORT void API_CALL mk_media_start_send_rtp4(mk_media ctx, const char *dst_url, uint16_t dst_port, const char *ssrc, int con_type, mk_ini options, on_mk_media_send_rtp_result cb, void *user_data,on_user_data_free user_data_free);
2020-11-21 22:13:08 +08:00
/**
2022-08-27 10:17:06 +08:00
* ps-rtp发送api线程安全
2020-11-21 22:13:08 +08:00
* @param ctx
* @param ssrc rtp的ssrc10null或空字符串rtp推流
* Stop a certain route or all ps-rtp sending, this api is thread-safe
* @param ctx Object pointer
* @param ssrc rtp's ssrc, 10-base string print, if it is null or empty string, stop all rtp streaming
* [AUTO-TRANSLATED:6fb2b1df]
2020-11-21 22:13:08 +08:00
*/
2022-08-27 10:17:06 +08:00
API_EXPORT void API_CALL mk_media_stop_send_rtp(mk_media ctx, const char *ssrc);
/**
* 线
* @param ctx
* Get the belonging thread
* @param ctx Object pointer
* [AUTO-TRANSLATED:85a157e8]
2022-08-27 10:17:06 +08:00
*/
API_EXPORT mk_thread API_CALL mk_media_get_owner_thread(mk_media ctx);
2020-11-21 22:13:08 +08:00
2019-12-17 18:45:31 +08:00
#ifdef __cplusplus
}
#endif
#endif /* MK_MEDIA_H_ */