| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- #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 */
|