本节内容主要描述如何将一个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

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






