#ifndef STREAM_H #define STREAM_H /** * @file stream.h * @brief 视频流管理头文件 * * 本文件定义视频流的接收、发送、PS封装、 * RTMP推流(zlmediakit)等功能接口。 */ #include "common.h" #include "config.h" /* 流状态 */ typedef enum { STREAM_STATE_IDLE = 0, STREAM_STATE_STARTING, STREAM_STATE_STREAMING, STREAM_STATE_STOPPING, STREAM_STATE_ERROR } StreamState; /* 流类型 */ typedef enum { STREAM_TYPE_MAIN = 0, /* 主码流 */ STREAM_TYPE_SUB, /* 子码流 */ STREAM_TYPE_THIRD, /* 第三码流 */ STREAM_TYPE_SIM, /* 模拟流(测试用) */ } StreamType; /* 编码类型 */ typedef enum { CODEC_TYPE_H264 = 0, CODEC_TYPE_H265, CODEC_TYPE_MJPEG, CODEC_TYPE_MPEG4, CODEC_TYPE_UNKNOWN } CodecType; /* 帧信息结构 */ typedef struct { void* data; /* 帧数据指针 */ int data_size; /* 帧数据大小 */ int timestamp; /* 时间戳(ms) */ int frame_type; /* 帧类型(0:I帧, 1:P帧, 2:B帧) */ int codec_type; /* 编码类型 */ int width; /* 宽度 */ int height; /* 高度 */ int is_keyframe; /* 是否关键帧 */ int is_sps_pps; /* 是否SPS/PPS */ } StreamFrame; /* 流会话结构 */ typedef struct { int stream_id; /* 流ID */ char device_id[MAX_DEVICE_ID]; /* 设备ID */ int channel; /* 通道号 */ StreamType type; /* 流类型 */ StreamState state; /* 流状态 */ CodecType codec; /* 编码类型 */ int width; /* 分辨率宽 */ int height; /* 分辨率高 */ int fps; /* 帧率 */ int bitrate; /* 码率 */ pthread_mutex_t lock; /* 线程锁 */ int is_running; /* 是否运行中 */ void* internal_handle; /* 内部句柄 */ } StreamSession; /* 流数据回调 */ typedef void (*StreamDataCB)(StreamSession* session, StreamFrame* frame, void* user_data); /* RTMP推流回调 */ typedef void (*RTMPPushCB)(const char* stream_key, int state, void* user_data); /** * @brief 初始化流媒体库 * @return 成功返回SUCCESS, 失败返回FAILURE * * 说明: 初始化SMS(Stream Management Server)库, * 分配流媒体相关的全局资源。 */ int stream_init(void); /** * @brief 反初始化流媒体库 * * 说明: 释放流媒体相关的所有资源。 */ void stream_cleanup(void); /** * @brief 开始监听播放回放请求 * @param listen_ip 监听IP * @param listen_port 监听端口 * @param callback 异常回调函数 * @param user_data 用户数据 * @return 成功返回SUCCESS, 失败返回FAILURE * * 说明: 开启SMS监听服务,接收来自设备的回放连接请求。 * 对应NET_ESTREAM_StartListenPlayBack功能。 */ int stream_start_playback_listen(const char* listen_ip, short listen_port, void* callback, void* user_data); /** * @brief 停止监听播放回放 * * 说明: 停止SMS回放监听服务。 * 对应NET_ESTREAM_StopListenPlayBack功能。 */ void stream_stop_playback_listen(void); /** * @brief 设置回放数据回调 * @param stream_handle 流句柄 * @param callback 数据回调函数 * @param user_data 用户数据 * @return 成功返回SUCCESS, 失败返回FAILURE * * 说明: 注册回放数据回调函数,用于接收来自设备的回放码流数据。 * 对应NET_ESTREAM_SetPlayBackDataCB功能。 */ int stream_set_playback_data_cb(int stream_handle, StreamDataCB callback, void* user_data); /** * @brief 创建视频流会话 * @param device_id 设备ID * @param channel 通道号 * @param stream_type 流类型 * @param codec 编码类型 * @param width 宽度 * @param height 高度 * @param fps 帧率 * @param bitrate 码率 * @return 成功返回流会话指针, 失败返回NULL */ StreamSession* stream_create_session(const char* device_id, int channel, StreamType stream_type, CodecType codec, int width, int height, int fps, int bitrate); /** * @brief 销毁视频流会话 * @param session 流会话指针 */ void stream_destroy_session(StreamSession* session); /** * @brief 开始推流 * @param session 流会话指针 * @param rtmp_url RTMP推流地址 * @param callback 推流状态回调 * @param user_data 用户数据 * @return 成功返回SUCCESS, 失败返回FAILURE * * 说明: 开始向RTMP服务器推流。内部会将视频帧封装为PS流 * 并通过RTMP协议推送到zlmediakit服务器。 */ int stream_start_push(StreamSession* session, const char* rtmp_url, RTMPPushCB callback, void* user_data); /** * @brief 停止推流 * @param session 流会话指针 * @return 成功返回SUCCESS, 失败返回FAILURE */ int stream_stop_push(StreamSession* session); /** * @brief 发送视频帧到流 * @param session 流会话指针 * @param frame 视频帧数据 * @return 成功返回SUCCESS, 失败返回FAILURE * * 说明: 将视频帧数据发送到RTMP服务器。 * 帧数据会被封装为PS(Program Stream)格式后传输。 */ int stream_send_frame(StreamSession* session, StreamFrame* frame); /** * @brief 按设备ID+通道查找流会话(不加锁拷贝, 返回内部指针) */ StreamSession* stream_find_by_channel(const char* device_id, int channel); /** * @brief 按流ID查找会话 */ StreamSession* stream_get_session(int stream_id); /** * @brief 停止指定通道的流 * @param device_id 设备ID * @param channel 通道号 * @return 成功返回SUCCESS, 失败返回FAILURE */ int stream_stop_channel(const char* device_id, int channel); /** * @brief 停止所有流 */ void stream_stop_all(void); /** * @brief 获取流会话状态 * @param session 流会话指针 * @return 流状态枚举值 */ StreamState stream_get_state(StreamSession* session); /** * @brief 将原始H.264/H.265数据封装为PS流 * @param input_data 原始视频数据 * @param input_size 原始数据大小 * @param output_buf 输出缓冲区 * @param output_size 输出缓冲区大小 * @return 封装后的PS数据大小, 失败返回-1 * * 说明: 将H.264/H.264原始码流封装为MPEG-2 Program Stream格式。 * PS流包含系统头、节目复用器头等PS标准结构。 */ int encode_to_ps(const uint8_t* input_data, int input_size, uint8_t* output_buf, int output_size); /** * @brief 从PS流中解封装获取H.264/H.265帧 * @param ps_data PS流数据 * @param ps_size PS流数据大小 * @param output_buf 输出缓冲区 * @param output_size 输出缓冲区大小 * @return 解封装后的帧数据大小, 失败返回-1 */ int decode_ps_to_frame(const uint8_t* ps_data, int ps_size, uint8_t* output_buf, int output_size); #endif /* STREAM_H */