mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
For #2200, Enable RTC and FLV for GB28181
This commit is contained in:
parent
adb6f723c7
commit
4df6fa540f
12 changed files with 1289 additions and 845 deletions
|
@ -50,7 +50,7 @@ using namespace std;
|
|||
#include <srs_app_rtmp_conn.hpp>
|
||||
#include <srs_protocol_utility.hpp>
|
||||
#include <srs_protocol_format.hpp>
|
||||
#include <srs_sip_stack.hpp>
|
||||
#include <srs_app_sip.hpp>
|
||||
|
||||
//#define W_PS_FILE
|
||||
//#define W_VIDEO_FILE
|
||||
|
@ -405,8 +405,7 @@ srs_error_t SrsGb28181PsRtpProcessor::rtmpmuxer_enqueue_data(SrsGb28181RtmpMuxer
|
|||
srs_error_t SrsGb28181PsRtpProcessor::on_rtp_packet_jitter(const sockaddr* from, const int fromlen, char* buf, int nb_buf)
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
bool completed = false;
|
||||
|
||||
|
||||
pprint->elapse();
|
||||
|
||||
char address_string[64];
|
||||
|
@ -739,13 +738,12 @@ srs_error_t SrsGb28181TcpPsRtpProcessor::rtmpmuxer_enqueue_data(SrsGb28181RtmpMu
|
|||
srs_error_t SrsGb28181TcpPsRtpProcessor::on_rtp_packet_jitter(char* buf, int nb_buf, std::string ip, int port)
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
bool completed = false;
|
||||
|
||||
pprint->elapse();
|
||||
|
||||
char address_string[64] = {0};
|
||||
char port_string[16] = {0};
|
||||
/*if (getnameinfo(from, fromlen,
|
||||
/*char port_string[16] = {0};
|
||||
if (getnameinfo(from, fromlen,
|
||||
(char*)&address_string, sizeof(address_string),
|
||||
(char*)&port_string, sizeof(port_string),
|
||||
NI_NUMERICHOST | NI_NUMERICSERV)) {
|
||||
|
@ -1109,8 +1107,8 @@ srs_error_t SrsPsStreamDemixer::on_ps_stream(char* ps_data, int ps_size, uint32_
|
|||
|
||||
uint8_t p1 = (uint8_t)(next_ps_pack[0]);
|
||||
uint8_t p2 = (uint8_t)(next_ps_pack[1]);
|
||||
uint8_t p3 = (uint8_t)(next_ps_pack[2]);
|
||||
uint8_t p4 = (uint8_t)(next_ps_pack[3]);
|
||||
//uint8_t p3 = (uint8_t)(next_ps_pack[2]);
|
||||
//uint8_t p4 = (uint8_t)(next_ps_pack[3]);
|
||||
|
||||
if (audio_enable && audio_es_type != STREAM_TYPE_AUDIO_AAC &&
|
||||
(p1 & 0xFF) == 0xFF && (p2 & 0xF0) == 0xF0) {
|
||||
|
@ -1260,8 +1258,8 @@ SrsGb28181RtmpMuxer::SrsGb28181RtmpMuxer(SrsGb28181Manger* c, std::string id, bo
|
|||
((SrsSTCoroutine*)trd)->set_stack_size(1 << 18);
|
||||
|
||||
sdk = NULL;
|
||||
vjitter = new SrsRtspJitter();
|
||||
ajitter = new SrsRtspJitter();
|
||||
vjitter = new SrsRtpTimeJitter();
|
||||
ajitter = new SrsRtpTimeJitter();
|
||||
|
||||
avc = new SrsRawH264Stream();
|
||||
aac = new SrsRawAacStream();
|
||||
|
@ -1284,8 +1282,8 @@ SrsGb28181RtmpMuxer::SrsGb28181RtmpMuxer(SrsGb28181Manger* c, std::string id, bo
|
|||
source = NULL;
|
||||
source_publish = true;
|
||||
|
||||
jitter_buffer = new SrsPsJitterBuffer(id);
|
||||
jitter_buffer_audio = new SrsPsJitterBuffer(id);
|
||||
jitter_buffer = new SrsRtpJitterBuffer(id);
|
||||
jitter_buffer_audio = new SrsRtpJitterBuffer(id);
|
||||
|
||||
ps_buflen = 0;
|
||||
ps_buffer = NULL;
|
||||
|
@ -1414,7 +1412,7 @@ srs_error_t SrsGb28181RtmpMuxer::initialize(SrsServer *s, SrsRequest* r)
|
|||
srs_error_t err = srs_success;
|
||||
|
||||
if (!jitter_buffer) {
|
||||
jitter_buffer = new SrsPsJitterBuffer(channel_id);
|
||||
jitter_buffer = new SrsRtpJitterBuffer(channel_id);
|
||||
}
|
||||
|
||||
jitter_buffer->SetDecodeErrorMode(kSelectiveErrors);
|
||||
|
@ -1422,7 +1420,7 @@ srs_error_t SrsGb28181RtmpMuxer::initialize(SrsServer *s, SrsRequest* r)
|
|||
jitter_buffer->SetNackSettings(250, 450, 0);
|
||||
|
||||
if (!jitter_buffer_audio) {
|
||||
jitter_buffer_audio = new SrsPsJitterBuffer(channel_id);
|
||||
jitter_buffer_audio = new SrsRtpJitterBuffer(channel_id);
|
||||
}
|
||||
|
||||
jitter_buffer_audio->SetDecodeErrorMode(kSelectiveErrors);
|
||||
|
@ -1458,6 +1456,7 @@ srs_error_t SrsGb28181RtmpMuxer::do_cycle()
|
|||
send_rtmp_stream_time = srs_get_system_time();
|
||||
uint32_t cur_timestamp = 0;
|
||||
int buffer_size = 0;
|
||||
bool keyframe = false;
|
||||
|
||||
//consume ps stream, and check status
|
||||
while (true) {
|
||||
|
@ -1472,7 +1471,7 @@ srs_error_t SrsGb28181RtmpMuxer::do_cycle()
|
|||
|
||||
if (config.jitterbuffer_enable){
|
||||
if(jitter_buffer->FoundFrame(cur_timestamp)){
|
||||
jitter_buffer->GetPsFrame(&ps_buffer, ps_buflen, buffer_size, cur_timestamp);
|
||||
jitter_buffer->GetFrame(&ps_buffer, ps_buflen, buffer_size, keyframe, cur_timestamp);
|
||||
|
||||
if (buffer_size > 0){
|
||||
if ((err = ps_demixer->on_ps_stream(ps_buffer, buffer_size, cur_timestamp, 0)) != srs_success){
|
||||
|
@ -1483,7 +1482,7 @@ srs_error_t SrsGb28181RtmpMuxer::do_cycle()
|
|||
}
|
||||
|
||||
if(jitter_buffer_audio->FoundFrame(cur_timestamp)){
|
||||
jitter_buffer_audio->GetPsFrame(&ps_buffer_audio, ps_buflen_auido, buffer_size, cur_timestamp);
|
||||
jitter_buffer_audio->GetFrame(&ps_buffer_audio, ps_buflen_auido, buffer_size, keyframe, cur_timestamp);
|
||||
|
||||
if (buffer_size > 0){
|
||||
if ((err = ps_demixer->on_ps_stream(ps_buffer_audio, buffer_size, cur_timestamp, 0)) != srs_success){
|
||||
|
@ -1600,10 +1599,12 @@ void SrsGb28181RtmpMuxer::insert_jitterbuffer(SrsPsRtpPacket *pkt)
|
|||
//otherwise audio uses jitter_buffer_audio, and video uses jitter_buffer
|
||||
if (av_same_ts){
|
||||
pkt->marker = false;
|
||||
jitter_buffer->InsertPacket(*pkt, pkt->payload->bytes(), pkt->payload->length(), NULL);
|
||||
jitter_buffer->InsertPacket(pkt->sequence_number, pkt->timestamp, pkt->marker,
|
||||
pkt->payload->bytes(), pkt->payload->length(), NULL);
|
||||
ps_rtp_video_ts = pkt->timestamp;
|
||||
}else {
|
||||
jitter_buffer_audio->InsertPacket(*pkt, pkt->payload->bytes(), pkt->payload->length(), NULL);
|
||||
jitter_buffer_audio->InsertPacket(pkt->sequence_number, pkt->timestamp, pkt->marker,
|
||||
pkt->payload->bytes(), pkt->payload->length(), NULL);
|
||||
}
|
||||
|
||||
//srs_cond_signal(wait_ps_queue);
|
||||
|
@ -1771,14 +1772,8 @@ srs_error_t SrsGb28181RtmpMuxer::write_h264_ipb_frame2(char *frame, int frame_si
|
|||
|
||||
//0001xxxxxxxxxx
|
||||
//xxxx0001xxxxxxx
|
||||
uint32_t naluLen = size - cur_pos;
|
||||
char *p = (char*)&naluLen;
|
||||
|
||||
video_data[cur_pos] = p[3];
|
||||
video_data[cur_pos+1] = p[2];
|
||||
video_data[cur_pos+2] = p[1];
|
||||
video_data[cur_pos+3] = p[0];
|
||||
|
||||
uint32_t naluLen = size - cur_pos - 4;
|
||||
|
||||
char *frame = video_data + cur_pos + 4;
|
||||
int frame_size = naluLen;
|
||||
|
||||
|
@ -1797,13 +1792,7 @@ srs_error_t SrsGb28181RtmpMuxer::write_h264_ipb_frame2(char *frame, int frame_si
|
|||
//0001xxxxxxxx0001xxxxxxxx0001xxxxxxxxx
|
||||
//xxxxxxxxxxxx0001xxxxxxxx0001xxxxxxxxx
|
||||
uint32_t naluLen = cur_pos - pre_pos - 4;
|
||||
char *p = (char*)&naluLen;
|
||||
|
||||
video_data[pre_pos] = p[3];
|
||||
video_data[pre_pos+1] = p[2];
|
||||
video_data[pre_pos+2] = p[1];
|
||||
video_data[pre_pos+3] = p[0];
|
||||
|
||||
|
||||
char *frame = video_data + pre_pos + 4;
|
||||
int frame_size = naluLen;
|
||||
|
||||
|
@ -1816,13 +1805,7 @@ srs_error_t SrsGb28181RtmpMuxer::write_h264_ipb_frame2(char *frame, int frame_si
|
|||
if (first_pos != pre_pos){
|
||||
|
||||
uint32_t naluLen = size - pre_pos - 4;
|
||||
char *p = (char*)&naluLen;
|
||||
|
||||
video_data[pre_pos] = p[3];
|
||||
video_data[pre_pos+1] = p[2];
|
||||
video_data[pre_pos+2] = p[1];
|
||||
video_data[pre_pos+3] = p[0];
|
||||
|
||||
|
||||
char *frame = video_data + pre_pos + 4;
|
||||
int frame_size = naluLen;
|
||||
|
||||
|
@ -2167,6 +2150,9 @@ SrsGb28181StreamChannel::SrsGb28181StreamChannel(){
|
|||
rtp_peer_port = 0;
|
||||
rtp_peer_ip = "";
|
||||
rtmp_url = "";
|
||||
flv_url = "";
|
||||
hls_url = "";
|
||||
webrtc_url = "";
|
||||
recv_time = 0;
|
||||
recv_time_str = "";
|
||||
}
|
||||
|
@ -2191,6 +2177,9 @@ void SrsGb28181StreamChannel::copy(const SrsGb28181StreamChannel *s){
|
|||
rtp_peer_port = s->get_rtp_peer_port();
|
||||
|
||||
rtmp_url = s->get_rtmp_url();
|
||||
flv_url = s->get_flv_url();
|
||||
hls_url = s->get_hls_url();
|
||||
webrtc_url = s->get_webrtc_url();
|
||||
|
||||
recv_time_str = s->get_recv_time_str();
|
||||
recv_time = s->get_recv_time();
|
||||
|
@ -2205,6 +2194,9 @@ void SrsGb28181StreamChannel::dumps(SrsJsonObject* obj)
|
|||
obj->set("app", SrsJsonAny::str(app.c_str()));
|
||||
obj->set("stream", SrsJsonAny::str(stream.c_str()));
|
||||
obj->set("rtmp_url", SrsJsonAny::str(rtmp_url.c_str()));
|
||||
obj->set("flv_url", SrsJsonAny::str(flv_url.c_str()));
|
||||
obj->set("hls_url", SrsJsonAny::str(hls_url.c_str()));
|
||||
obj->set("webrtc_url", SrsJsonAny::str(webrtc_url.c_str()));
|
||||
|
||||
obj->set("ssrc", SrsJsonAny::integer(ssrc));
|
||||
obj->set("rtp_port", SrsJsonAny::integer(rtp_port));
|
||||
|
@ -2298,7 +2290,7 @@ uint32_t SrsGb28181Manger::generate_ssrc(std::string id)
|
|||
//gb28181 live ssrc max value 0999999999(3B9AC9FF)
|
||||
//gb28181 vod ssrc max value 1999999999(773593FF)
|
||||
uint8_t index = uint8_t(rand() % (0x0F - 0x01 + 1) + 0x01);
|
||||
uint32_t ssrc = 0x2FFFF00 & (hash_code(id) << 8) | index;
|
||||
uint32_t ssrc = ((0x2FFFF00) & (hash_code(id) << 8)) | index;
|
||||
//uint32_t ssrc = 0x00FFFFFF & (hash_code(id));
|
||||
srs_trace("gb28181: generate ssrc id=%s, ssrc=%u", id.c_str(), ssrc);
|
||||
return ssrc;
|
||||
|
@ -2599,7 +2591,21 @@ srs_error_t SrsGb28181Manger::create_stream_channel(SrsGb28181StreamChannel *cha
|
|||
channel->set_rtmp_port(rtmp_port);
|
||||
channel->set_ip(config->host);
|
||||
std::string play_url = srs_generate_rtmp_url(config->host, rtmp_port, "", "", app, stream_name, "");
|
||||
|
||||
std::string flv_url = srs_string_replace(play_url, "rtmp://", "http://");
|
||||
std::stringstream port;
|
||||
port << ":" << rtmp_port;
|
||||
flv_url = srs_string_replace(flv_url, port.str(), ":"+_srs_config->get_http_stream_listen());
|
||||
std::string hls_url = flv_url + ".m3u8";
|
||||
flv_url = flv_url + ".flv";
|
||||
|
||||
std::string webrtc_url = srs_string_replace(play_url, "rtmp://", "webrtc://");
|
||||
webrtc_url = srs_string_replace(webrtc_url, port.str(), ":"+_srs_config->get_http_api_listen());
|
||||
|
||||
channel->set_rtmp_url(play_url);
|
||||
channel->set_flv_url(flv_url);
|
||||
channel->set_hls_url(hls_url);
|
||||
channel->set_webrtc_url(webrtc_url);
|
||||
|
||||
request.app = app;
|
||||
request.stream = stream_name;
|
||||
|
@ -2876,7 +2882,6 @@ srs_error_t SrsGb28181Conn::do_cycle()
|
|||
|
||||
nb_read = nb_read + leftDataLength;
|
||||
|
||||
length;
|
||||
pp = (char*)&length;
|
||||
p = &(mbuffer[0]);
|
||||
pp[1] = *p++;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue