简单的rtmp推流代码
手写推流代码,该代码可以完成服务端推流rtmp功能
//
// rtmp_client.cpp
// myFirstDemoC++
//
#include "rtmp_client.hpp"
using namespace std;
rtmp_client::rtmp_client(char * server_url):server_url_(server_url)
{
rtmp_ctx_ = nullptr;
cout << "rtmp client init url " << server_url_ << endl;
}
rtmp_client::~rtmp_client()
{
rtmp_process_.join();
if (list_data_.size() > 0)
{
rtmp_data * data = nullptr;
for(list<rtmp_data *>::iterator it = list_data_.begin(); it != list_data_.end(); it++)
{
data = *it;
delete [] data->data;
delete data;
list_data_.pop_front();
}
}
if (rtmp_ctx_)
{
RTMP_Close(rtmp_ctx_);
RTMP_Free(rtmp_ctx_);
rtmp_ctx_ = nullptr;
}
}
void rtmp_client::rtmp_send_data_(rtmp_data *data)
{
RTMPPacket * packet = nullptr;
if (!data)
return ;
cout << "send rtmp data private start" << endl;
packet = new RTMPPacket;
RTMPPacket_Alloc(packet, 64*1024);
RTMPPacket_Reset(packet);
packet->m_nChannel = 0x4;
packet->m_hasAbsTimestamp = 0;
if (RTMP_IsConnected(rtmp_ctx_))
{
packet->m_headerType = RTMP_PACKET_SIZE_LARGE;
packet->m_nTimeStamp = data->m_nTimeStamp;//时间戳
packet->m_packetType = data->m_packetType;//包类型
packet->m_nBodySize = data->len;//包大小
memcpy(packet->m_body, data->data, data->len);
RTMP_SendPacket(rtmp_ctx_, packet, 0);
}
RTMPPacket_Free(packet);
delete packet;
return ;
}
void rtmp_client::rtmp_process()
{
rtmp_data * data = nullptr;
while(1)
{
mtx_.lock();
data = list_data_.front();
if (data)
{
list_data_.pop_front();
mtx_.unlock();
cout << "list size before" << list_data_.size()<<endl;
cout << "rtmp process send data len " << data->len <<endl;
rtmp_send_data_(data);
delete [] data->data;
delete data;
cout << "list size after" << list_data_.size()<<endl;
}
else
{
mtx_.unlock();
this_thread::sleep_for(chrono::microseconds(10));
//cout << "rtmp process no data" << endl;
}
}
}
int rtmp_client::rtmp_send_packet(rtmp_data * data)
{
if (!data)
return -1;
mtx_.lock();
list_data_.push_back(data);
mtx_.unlock();
return 0;
}
int rtmp_client::rtmp_connect_server()
{
int ret = -1;
rtmp_ctx_ = RTMP_Alloc();
if (!rtmp_ctx_)
{
return ret;
}
RTMP_Init(rtmp_ctx_);
RTMP_SetupURL(rtmp_ctx_, const_cast<char *>(server_url_.c_str()));
RTMP_EnableWrite(rtmp_ctx_);
rtmp_ctx_->Link.timeout = 5;
RTMP_Connect(rtmp_ctx_, NULL);
RTMP_ConnectStream(rtmp_ctx_, 0);
rtmp_process_= thread(&rtmp_client::rtmp_process, this);
ret = 0;
return ret;
}
//
// rtmp_client.hpp
// myFirstDemoC++
#ifndef rtmp_client_hpp
#define rtmp_client_hpp
#include <stdio.h>
#include <iostream>
#include <string>
#include <thread>
#include <list>
#include "librtmp/rtmp.h"
typedef struct {
uint8_t *data;
uint32_t len;
uint32_t m_nBodySize;
uint8_t m_packetType;
uint32_t m_nTimeStamp; /* timestamp */
}rtmp_data;
class rtmp_client{
public:
rtmp_client(char * server_url);
~rtmp_client();
int rtmp_connect_server();
int rtmp_send_packet(rtmp_data *data);
int rtmp_disconnect_server();
private:
void rtmp_process();
void rtmp_send_data_(rtmp_data * data);
std::list<rtmp_data *> list_data_;
std::thread rtmp_process_;
std::string server_url_;
std::mutex mtx_;
RTMP *rtmp_ctx_;
};
#endif /* rtmp_client_hpp */