stream.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. #ifndef STREAM_H
  2. #define STREAM_H
  3. /**
  4. * @file stream.h
  5. * @brief 视频流管理头文件
  6. *
  7. * 本文件定义视频流的接收、发送、PS封装、
  8. * RTMP推流(zlmediakit)等功能接口。
  9. */
  10. #include "common.h"
  11. #include "config.h"
  12. /* 流状态 */
  13. typedef enum {
  14. STREAM_STATE_IDLE = 0,
  15. STREAM_STATE_STARTING,
  16. STREAM_STATE_STREAMING,
  17. STREAM_STATE_STOPPING,
  18. STREAM_STATE_ERROR
  19. } StreamState;
  20. /* 流类型 */
  21. typedef enum {
  22. STREAM_TYPE_MAIN = 0, /* 主码流 */
  23. STREAM_TYPE_SUB, /* 子码流 */
  24. STREAM_TYPE_THIRD, /* 第三码流 */
  25. STREAM_TYPE_SIM, /* 模拟流(测试用) */
  26. } StreamType;
  27. /* 编码类型 */
  28. typedef enum {
  29. CODEC_TYPE_H264 = 0,
  30. CODEC_TYPE_H265,
  31. CODEC_TYPE_MJPEG,
  32. CODEC_TYPE_MPEG4,
  33. CODEC_TYPE_UNKNOWN
  34. } CodecType;
  35. /* 帧信息结构 */
  36. typedef struct {
  37. void* data; /* 帧数据指针 */
  38. int data_size; /* 帧数据大小 */
  39. int timestamp; /* 时间戳(ms) */
  40. int frame_type; /* 帧类型(0:I帧, 1:P帧, 2:B帧) */
  41. int codec_type; /* 编码类型 */
  42. int width; /* 宽度 */
  43. int height; /* 高度 */
  44. int is_keyframe; /* 是否关键帧 */
  45. int is_sps_pps; /* 是否SPS/PPS */
  46. } StreamFrame;
  47. /* 流会话结构 */
  48. typedef struct {
  49. int stream_id; /* 流ID */
  50. char device_id[MAX_DEVICE_ID]; /* 设备ID */
  51. int channel; /* 通道号 */
  52. StreamType type; /* 流类型 */
  53. StreamState state; /* 流状态 */
  54. CodecType codec; /* 编码类型 */
  55. int width; /* 分辨率宽 */
  56. int height; /* 分辨率高 */
  57. int fps; /* 帧率 */
  58. int bitrate; /* 码率 */
  59. pthread_mutex_t lock; /* 线程锁 */
  60. int is_running; /* 是否运行中 */
  61. void* internal_handle; /* 内部句柄 */
  62. } StreamSession;
  63. /* 流数据回调 */
  64. typedef void (*StreamDataCB)(StreamSession* session, StreamFrame* frame, void* user_data);
  65. /* RTMP推流回调 */
  66. typedef void (*RTMPPushCB)(const char* stream_key, int state, void* user_data);
  67. /**
  68. * @brief 初始化流媒体库
  69. * @return 成功返回SUCCESS, 失败返回FAILURE
  70. *
  71. * 说明: 初始化SMS(Stream Management Server)库,
  72. * 分配流媒体相关的全局资源。
  73. */
  74. int stream_init(void);
  75. /**
  76. * @brief 反初始化流媒体库
  77. *
  78. * 说明: 释放流媒体相关的所有资源。
  79. */
  80. void stream_cleanup(void);
  81. /**
  82. * @brief 开始监听播放回放请求
  83. * @param listen_ip 监听IP
  84. * @param listen_port 监听端口
  85. * @param callback 异常回调函数
  86. * @param user_data 用户数据
  87. * @return 成功返回SUCCESS, 失败返回FAILURE
  88. *
  89. * 说明: 开启SMS监听服务,接收来自设备的回放连接请求。
  90. * 对应NET_ESTREAM_StartListenPlayBack功能。
  91. */
  92. int stream_start_playback_listen(const char* listen_ip, short listen_port,
  93. void* callback, void* user_data);
  94. /**
  95. * @brief 停止监听播放回放
  96. *
  97. * 说明: 停止SMS回放监听服务。
  98. * 对应NET_ESTREAM_StopListenPlayBack功能。
  99. */
  100. void stream_stop_playback_listen(void);
  101. /**
  102. * @brief 设置回放数据回调
  103. * @param stream_handle 流句柄
  104. * @param callback 数据回调函数
  105. * @param user_data 用户数据
  106. * @return 成功返回SUCCESS, 失败返回FAILURE
  107. *
  108. * 说明: 注册回放数据回调函数,用于接收来自设备的回放码流数据。
  109. * 对应NET_ESTREAM_SetPlayBackDataCB功能。
  110. */
  111. int stream_set_playback_data_cb(int stream_handle, StreamDataCB callback, void* user_data);
  112. /**
  113. * @brief 创建视频流会话
  114. * @param device_id 设备ID
  115. * @param channel 通道号
  116. * @param stream_type 流类型
  117. * @param codec 编码类型
  118. * @param width 宽度
  119. * @param height 高度
  120. * @param fps 帧率
  121. * @param bitrate 码率
  122. * @return 成功返回流会话指针, 失败返回NULL
  123. */
  124. StreamSession* stream_create_session(const char* device_id, int channel,
  125. StreamType stream_type, CodecType codec,
  126. int width, int height, int fps, int bitrate);
  127. /**
  128. * @brief 销毁视频流会话
  129. * @param session 流会话指针
  130. */
  131. void stream_destroy_session(StreamSession* session);
  132. /**
  133. * @brief 开始推流
  134. * @param session 流会话指针
  135. * @param rtmp_url RTMP推流地址
  136. * @param callback 推流状态回调
  137. * @param user_data 用户数据
  138. * @return 成功返回SUCCESS, 失败返回FAILURE
  139. *
  140. * 说明: 开始向RTMP服务器推流。内部会将视频帧封装为PS流
  141. * 并通过RTMP协议推送到zlmediakit服务器。
  142. */
  143. int stream_start_push(StreamSession* session, const char* rtmp_url,
  144. RTMPPushCB callback, void* user_data);
  145. /**
  146. * @brief 停止推流
  147. * @param session 流会话指针
  148. * @return 成功返回SUCCESS, 失败返回FAILURE
  149. */
  150. int stream_stop_push(StreamSession* session);
  151. /**
  152. * @brief 发送视频帧到流
  153. * @param session 流会话指针
  154. * @param frame 视频帧数据
  155. * @return 成功返回SUCCESS, 失败返回FAILURE
  156. *
  157. * 说明: 将视频帧数据发送到RTMP服务器。
  158. * 帧数据会被封装为PS(Program Stream)格式后传输。
  159. */
  160. int stream_send_frame(StreamSession* session, StreamFrame* frame);
  161. /**
  162. * @brief 按设备ID+通道查找流会话(不加锁拷贝, 返回内部指针)
  163. */
  164. StreamSession* stream_find_by_channel(const char* device_id, int channel);
  165. /**
  166. * @brief 按流ID查找会话
  167. */
  168. StreamSession* stream_get_session(int stream_id);
  169. /**
  170. * @brief 停止指定通道的流
  171. * @param device_id 设备ID
  172. * @param channel 通道号
  173. * @return 成功返回SUCCESS, 失败返回FAILURE
  174. */
  175. int stream_stop_channel(const char* device_id, int channel);
  176. /**
  177. * @brief 停止所有流
  178. */
  179. void stream_stop_all(void);
  180. /**
  181. * @brief 获取流会话状态
  182. * @param session 流会话指针
  183. * @return 流状态枚举值
  184. */
  185. StreamState stream_get_state(StreamSession* session);
  186. /**
  187. * @brief 将原始H.264/H.265数据封装为PS流
  188. * @param input_data 原始视频数据
  189. * @param input_size 原始数据大小
  190. * @param output_buf 输出缓冲区
  191. * @param output_size 输出缓冲区大小
  192. * @return 封装后的PS数据大小, 失败返回-1
  193. *
  194. * 说明: 将H.264/H.264原始码流封装为MPEG-2 Program Stream格式。
  195. * PS流包含系统头、节目复用器头等PS标准结构。
  196. */
  197. int encode_to_ps(const uint8_t* input_data, int input_size,
  198. uint8_t* output_buf, int output_size);
  199. /**
  200. * @brief 从PS流中解封装获取H.264/H.265帧
  201. * @param ps_data PS流数据
  202. * @param ps_size PS流数据大小
  203. * @param output_buf 输出缓冲区
  204. * @param output_size 输出缓冲区大小
  205. * @return 解封装后的帧数据大小, 失败返回-1
  206. */
  207. int decode_ps_to_frame(const uint8_t* ps_data, int ps_size,
  208. uint8_t* output_buf, int output_size);
  209. #endif /* STREAM_H */