最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)

来源:互联网 发布:背诵单词软件 编辑:程序博客网 时间:2024/04/30 15:43

本篇文章需要H.264的知识:





=====================================================

最简单的基于libRTMP的示例系列文章列表:

最简单的基于librtmp的示例:接收(RTMP保存为FLV)

最简单的基于librtmp的示例:发布(FLV通过RTMP发布)

最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)

=====================================================


本文记录一个基于libRTMP的发布H.264码流的程序。该程序可以将H.264数据发布到RTMP流媒体服务器。目前这个例子还不是很稳定,下一步还有待修改。

本程序使用回调函数作为输入,通过自定义的回调函数,可以发送本地的文件或者内存中的数据。


函数调用结构图

本程序的函数调用结构图如下所示。

 
整个程序包含3个接口函数:
RTMP264_Connect():建立RTMP连接。
RTMP264_Send():发送数据。
RTMP264_Close():关闭RTMP连接。
按照顺序调用上述3个接口函数就可以完成H.264码流的发送。

结构图中关键函数的作用如下所列。

RTMP264_Connect()中包含以下函数:
InitSockets():初始化Socket
RTMP_Alloc():为结构体“RTMP”分配内存。
RTMP_Init():初始化结构体“RTMP”中的成员变量。
RTMP_SetupURL():设置输入的RTMP连接的URL。
RTMP_EnableWrite():发布流的时候必须要使用。如果不使用则代表接收流。
RTMP_Connect():建立RTMP连接,创建一个RTMP协议规范中的NetConnection。
RTMP_ConnectStream():创建一个RTMP协议规范中的NetStream。

RTMP264_Send()中包含以下函数:
ReadFirstNaluFromBuf():从内存中读取出第一个NAL单元。
ReadOneNaluFromBuf():从内存中读取出一个NAL单元,何谓NAL?
h264_decode_sps():解码SPS,获取视频的宽,高,帧率信息,何谓SPS?PPS?
SendH264Packet():发送一个NAL单元。

SendH264Packet()中包含以下函数:
SendVideoSpsPps():如果是关键帧,(何谓关键帧?),则在发送该帧之前先发送SPS和PPS。
SendPacket():组装一个RTMPPacket,调用RTMP_SendPacket()发送出去。
RTMP_SendPacket():发送一个RTMP数据RTMPPacket。

RTMP264_Close()中包含以下函数:
RTMP_Close():关闭RTMP连接。
RTMP_Free():释放结构体“RTMP”。
CleanupSockets():关闭Socket。

源代码

程序提供的3个接口函数的使用方法如下。可以看出接口比较简单。

[cpp] view plain copy
  1. /** 
  2.  * Simplest Librtmp Send 264 
  3.  * 
  4.  * 本程序用于将内存中的H.264数据推送至RTMP流媒体服务器。 
  5.  * This program can send local h264 stream to net server as rtmp live stream. 
  6.  */  
  7.   
  8. #include <stdio.h>  
  9. #include "librtmp_send264.h"  
  10.   
  11.   
  12.   
  13. FILE *fp_send1;  
  14.   
  15. //读文件的回调函数  
  16. //we use this callback function to read data from buffer  
  17. int read_buffer1(unsigned char *buf, int buf_size ){  
  18.     if(!feof(fp_send1)){  
  19.         int true_size=fread(buf,1,buf_size,fp_send1);  
  20.         return true_size;  
  21.     }else{  
  22.         return -1;  
  23.     }  
  24. }  
  25.   
  26. int main(int argc, char* argv[])  
  27. {  
  28.     fp_send1 = fopen("cuc_ieschool.h264""rb");  
  29.   
  30.     //初始化并连接到服务器  
  31.     RTMP264_Connect("rtmp://localhost/live/livestream");  
  32.       
  33.     //发送  
  34.     RTMP264_Send(read_buffer1);  
  35.   
  36.     //断开连接并释放相关资源  
  37.     RTMP264_Close();  
  38.   
  39.     return 0;  
  40. }  

接口函数内部的代码比较多,不再详细记录。
阅读全文
0 0