最简单的基于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单元。
h264_decode_sps():解码SPS,获取视频的宽,高,帧率信息。
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个接口函数的使用方法如下。可以看出接口比较简单。

/**
 * Simplest Librtmp Send 264
 *
 * 雷霄骅,张晖
 * [email protected]
 * [email protected]
 * 中国传媒大学/数字电视技术
 * Communication University of China / Digital TV Technology
 * http://blog.csdn.net/leixiaohua1020
 *
 * 本程序用于将内存中的H.264数据推送至RTMP流媒体服务器。
 * This program can send local h264 stream to net server as rtmp live stream.
 */

#include <stdio.h>
#include "librtmp_send264.h"

FILE *fp_send1;

//读文件的回调函数
//we use this callback function to read data from buffer
int read_buffer1(unsigned char *buf, int buf_size ){
	if(!feof(fp_send1)){
		int true_size=fread(buf,1,buf_size,fp_send1);
		return true_size;
	}else{
		return -1;
	}
}

int main(int argc, char* argv[])
{
	fp_send1 = fopen("cuc_ieschool.h264", "rb");

	//初始化并连接到服务器
	RTMP264_Connect("rtmp://localhost/publishlive/livestream");

	//发送
	RTMP264_Send(read_buffer1);

	//断开连接并释放相关资源
	RTMP264_Close();

	return 0;
}

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

下载

Simplest LibRTMP Example

SourceForge项目地址:https://sourceforge.net/projects/simplestlibrtmpexample/
CSDN下载:http://download.csdn.net/detail/leixiaohua1020/8291757

本工程包含了LibRTMP的使用示例,包含如下子工程:
simplest_librtmp_receive: 接收RTMP流媒体并在本地保存成FLV格式的文件。
simplest_librtmp_send_flv: 将FLV格式的视音频文件使用RTMP推送至RTMP流媒体服务器。
simplest_librtmp_send264: 将内存中的H.264数据推送至RTMP流媒体服务器。

时间: 2024-10-13 22:48:13

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

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

本文记录一个基于libRTMP的发布流媒体的程序:Simplest libRTMP Send FLV.该程序可以将本地FLV文件发布到RTMP流媒体服务器.是最简单的基于libRTMP的流媒体发布示例. 流程图 使用librtmp发布RTMP流的可以使用两种API:RTMP_SendPacket()和RTMP_Write().使用RTMP_SendPacket()发布流的时候的函数执行流程图如下图所示.使用RTMP_Write()发布流的时候的函数执行流程图相差不大. 流程图中关键函数的作用如下

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

本文记录一个基于libRTMP的接收流媒体的程序:Simplest libRTMP Receive.该程序可以将RTMP流保存成本地FLV文件.实际上本文记录的程序就是一个"精简"过的RTMPDump.RTMPDump功能比较多,因而其代码比较复杂导致很多初学者不知从何下手.而本文记录的这个程序只保留了RTMPDump中最核心的函数,更加方便新手入门学习libRTMP. 流程图 使用librtmp接收RTMP流的函数执行流程图如下图所示. 流程图中关键函数的作用如下所列:InitSoc

最简单的基于DirectShow的示例:获取Filter信息

===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视频播放器 最简单的基于DirectShow的示例:视频播放器图形界面版 最简单的基于DirectShow的示例:视频播放器自定义版 最简单的基于DirectShow的示例:获取Filter信息 =====================================================

最简单的基于DirectShow的示例:视频播放器自定义版

本文记录一个简单的基于DirectShow的自定义的视频播放器.这里所说的"自定义播放器",实际上指的是自己在Filter Graph中手动逐个添加Filter,并且连接这些Filter的后运行的播放器.这么做相对于使用RenderFile()这种"智能"创建Filter Graph的方法来说要复杂不少,但是可以让我们更加了解DirectShow的体系. 流程图 最简单的基于DirectShow的自定义的视频播放器的流程如下图所示. 该流程图中包含如下变量: IGr

最简单的基于DirectShow的示例:视频播放器

本文记录一个最简单的基于DirectShow的视频播放器.DirectShow是一个庞大的框架,可以在Windows下实现多种多样的视频处理需求.但是它的"庞大"也使得新手不太容易学习它的使用.本文的例子正是为解决这一问题而做的,它只包含了使用DirectShow播放一个视频文件所需要的最重要的函数. 流程图 最简单的使用DirectShow播放视频文件的流程如下图所示. 流程图中涉及到几个接口如下所示. IGraphBuilder:继承自IFilterGraph,用于构建Filter

最简单的基于DirectShow的示例:视频播放器图形界面版

本文记录一个最简单的基于DirectShow的图形界面的视频播放器.基于DirectShow的图形界面的播放器的例子还是比较多的,但是大部分都是"层层封装"的例子."层层封装"的例子相对来说更加稳定,但是却不是很容易理解.因为DirectShow本身的接口函数的数量就比较多,如果再加上封装DirectShow的函数,合起来的函数数量是非常大的,很容易让人搞不清哪些才是真正的DirectShow接口函数.本播放器剥去了DirectShow例子中的"层层封装&

最简单的基于Flash的流媒体示例:RTMP推送和接收(ActionScript)

本文记录一些基于Flash的流媒体处理的例子.Flash平台最常见的流媒体协议是RTMP.此前记录的一些基于C/C++的RTMP播放器/推流器,但是没有记录过基于Flash中的ActionScript的RTMP播放器/推流器.其实基于Flash的RTMP播放器/推流器才能算得上是RTMP技术中的"正规军".RTMP本身设计出来就是用于Flash平台之间通信的,而且RTMP最大的优势--"无插件直播",也是得益于广泛安装在客户端的Flash Player.因此本文分别

转:最简单的基于 DirectShow 的视频播放器

50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectShow 播放视频所有必备的函数. 直接贴上代码,具体代码的含义都写在注释中了: /* 雷霄骅 * 中国传媒大学/数字电视技术 * [email protected] * */ // aviplayer.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #incl

最简单的基于FFmpeg的libswscale的示例

本文记录一个基于FFmpeg的libswscale的示例.Libswscale里面实现了各种图像像素格式的转换,以及图像大小缩放功能.而且libswscale还做了相应指令集的优化,因此它的转换效率比自己写的C语言的转换效率高很多. 流程 简单的初始化方法 Libswscale使用起来很方便,最主要的函数只有3个:(1)       sws_getContext():使用参数初始化SwsContext结构体.(2)       sws_scale():转换一帧图像.(3)       sws_f