11-流媒体-LibRtmp推H264流

本节介绍如何将h264文件通过RTMP推送到流媒体服务器。给出工程目录及包含的第三方文件,如test.cpp等。编写完代码后编译并执行推流进程即可推流,服务器启动可参考相关链接,拉流客户端用vlc软件验证,未详述vlc拉RTMP方法。

本节内容主要描述如何将一个h264文件通过RTMP推到流媒体服务器上
工程目录如下

$ tree 
.
|-- Makefile
|-- inc
|   |-- librtmp_send264.h
|   `-- sps_decode.h
|-- input.h264
|-- obj
|   |-- librtmp_send264.o
|   `-- test.o
|-- src
|   |-- librtmp_send264.cpp
|   `-- test.cpp
|-- third_lib
|   |-- openssl
|   |   |-- include
|   |   |   `-- openssl
|   |   |       |-- aes.h
|   |   |       |-- asn1.h
|   |   |       |-- asn1_mac.h
|   |   |       |-- asn1t.h
|   |   |       |-- bio.h
|   |   |       |-- blowfish.h
|   |   |       |-- bn.h
|   |   |       |-- buffer.h
|   |   |       |-- camellia.h
|   |   |       |-- cast.h
|   |   |       |-- cmac.h
|   |   |       |-- cms.h
|   |   |       |-- comp.h
|   |   |       |-- conf.h
|   |   |       |-- conf_api.h
|   |   |       |-- crypto.h
|   |   |       |-- des.h
|   |   |       |-- des_old.h
|   |   |       |-- dh.h
|   |   |       |-- dsa.h
|   |   |       |-- dso.h
|   |   |       |-- dtls1.h
|   |   |       |-- e_os2.h
|   |   |       |-- ebcdic.h
|   |   |       |-- ec.h
|   |   |       |-- ecdh.h
|   |   |       |-- ecdsa.h
|   |   |       |-- engine.h
|   |   |       |-- err.h
|   |   |       |-- evp.h
|   |   |       |-- hmac.h
|   |   |       |-- idea.h
|   |   |       |-- krb5_asn.h
|   |   |       |-- kssl.h
|   |   |       |-- lhash.h
|   |   |       |-- md4.h
|   |   |       |-- md5.h
|   |   |       |-- mdc2.h
|   |   |       |-- modes.h
|   |   |       |-- obj_mac.h
|   |   |       |-- objects.h
|   |   |       |-- ocsp.h
|   |   |       |-- opensslconf.h
|   |   |       |-- opensslv.h
|   |   |       |-- ossl_typ.h
|   |   |       |-- pem.h
|   |   |       |-- pem2.h
|   |   |       |-- pkcs12.h
|   |   |       |-- pkcs7.h
|   |   |       |-- pqueue.h
|   |   |       |-- rand.h
|   |   |       |-- rc2.h
|   |   |       |-- rc4.h
|   |   |       |-- ripemd.h
|   |   |       |-- rsa.h
|   |   |       |-- safestack.h
|   |   |       |-- seed.h
|   |   |       |-- sha.h
|   |   |       |-- srp.h
|   |   |       |-- srtp.h
|   |   |       |-- ssl.h
|   |   |       |-- ssl2.h
|   |   |       |-- ssl23.h
|   |   |       |-- ssl3.h
|   |   |       |-- stack.h
|   |   |       |-- symhacks.h
|   |   |       |-- tls1.h
|   |   |       |-- ts.h
|   |   |       |-- txt_db.h
|   |   |       |-- ui.h
|   |   |       |-- ui_compat.h
|   |   |       |-- whrlpool.h
|   |   |       |-- x509.h
|   |   |       |-- x509_vfy.h
|   |   |       `-- x509v3.h
|   |   `-- lib
|   |       |-- libcrypto.so -> libcrypto.so.1.0.0
|   |       |-- libcrypto.so.1.0.0
|   |       |-- libssl.so -> libssl.so.1.0.0
|   |       `-- libssl.so.1.0.0
|   |-- rtmpdump
|   |   |-- include
|   |   |   `-- librtmp
|   |   |       |-- amf.h
|   |   |       |-- http.h
|   |   |       |-- log.h
|   |   |       `-- rtmp.h
|   |   `-- lib
|   |       |-- librtmp.so -> librtmp.so.0
|   |       `-- librtmp.so.0
|   `-- zlib
|       |-- include
|       |   |-- zconf.h
|       |   `-- zlib.h
|       `-- lib
|           |-- libz.so -> libz.so.1.2.8
|           |-- libz.so.1 -> libz.so.1.2.8
|           `-- libz.so.1.2.8
`-- video_prj

工程中的内容包括第三方如下文件
test.cpp
librtmp_send264.cpp
librtmp_send264.h
sps_decode.h
Makefile

下面分别介绍
test.cpp

#include <stdio.h>
#include "librtmp_send264.h"
 
 
 
FILE *fp_send1;
 
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("input.h264", "rb");
 
	//初始化并连接到服务器
	RTMP264_Connect("rtmp://127.0.0.1:1935/live/xx");
	
	//发送
	RTMP264_Send(read_buffer1);
 
	//断开连接并释放相关资源
	RTMP264_Close();
 
	return 0;
}

librtmp_send264.cpp

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>  
#include "librtmp_send264.h"
#include "librtmp/rtmp.h"   
//#include "librtmp\rtmp_sys.h"   
#include "librtmp/amf.h"  
#include "sps_decode.h"

 

//定义包头长度,RTMP_MAX_HEADER_SIZE=18
#define RTMP_HEAD_SIZE   (sizeof(RTMPPacket)+RTMP_MAX_HEADER_SIZE)
//存储Nal单元数据的buffer大小
#define BUFFER_SIZE 32768
//搜寻Nal单元时的一些标志
#define GOT_A_NAL_CROSS_BUFFER BUFFER_SIZE+1
#define GOT_A_NAL_INCLUDE_A_BUFFER BUFFER_SIZE+2
#define NO_MORE_BUFFER_TO_READ BUFFER_SIZE+3

/**
 * _NaluUnit
 * 内部结构体。该结构体主要用于存储和传递Nal单元的类型、大小和数据
 */ 
typedef struct _NaluUnit  
{
   
     
	int type;  
    int size;  
	unsigned char *data;  
}NaluUnit;

/**
 * _RTMPMetadata
 * 内部结构体。该结构体主要用于存储和传递元数据信息
 */ 
typedef struct _RTMPMetadata  
{
   
     
	// video, must be h264 type   
	unsigned int    nWidth;  
	unsigned int    nHeight;  
	unsigned int    nFrameRate;      
	unsigned int    nSpsLen;  
	unsigned char   *Sps;  
	unsigned int    nPpsLen;  
	unsigned char   *Pps;   
} RTMPMetadata,*LPRTMPMetadata;  

enum  
{
   
     
	 VIDEO_CODECID_H264 = 7,  
};  

/**
 * 初始化winsock
 *					
 * @成功则返回1 , 失败则返回相应错误代码
 */ 
int InitSockets()    
{
   
       
	#ifdef WIN32     
		WORD version;    
		WSADATA wsaData;    
		version = MAKEWORD(1, 1);    
		return (WSAStartup(version, &wsaData) == 0);    
	#else     
		return TRUE;    
	#endif     
}

/**
 * 释放winsock
 *					
 * @成功则返回0 , 失败则返回相应错误代码
 */ 
inline void CleanupSockets()    
{
   
       
	#ifdef WIN32     
		WSACleanup();    
	#endif     
}    

//网络字节序转换
char * put_byte( char *output, uint8_t nVal )    
{
   
       
	output[0] = nVal;    
	return output+1;    
}   

char * put_be16(char *output, uint16_t nVal )    
{
   
       
	output[1] = nVal & 0xff;    
	output[0] = nVal >> 8;    
	return output+2;    
}  

char * put_be24(char *output,uint32_t nVal )    
{
   
       
	output[2] = nVal & 0xff;    
	output[1] = nVal >> 8;    
	output[0] = nVal >> 16;    
	return output+3;    
}    
char * put_be32(char *output, uint32_t nVal 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值