mirror of
https://github.com/ossrs/srs.git
synced 2025-02-13 03:41:55 +00:00
For #307, support publish RTC with passing opus. 4.0.24
This commit is contained in:
parent
99f9f566ba
commit
5ee5ef6ab2
7 changed files with 43 additions and 7 deletions
|
@ -159,6 +159,7 @@ For previous versions, please read:
|
||||||
|
|
||||||
## V4 changes
|
## V4 changes
|
||||||
|
|
||||||
|
* v4.0, 2020-04-30, For [#307][bug #307], support publish RTC with passing opus. 4.0.24
|
||||||
* v4.0, 2020-04-14, For [#307][bug #307], support sendmmsg, GSO and reuseport. 4.0.23
|
* v4.0, 2020-04-14, For [#307][bug #307], support sendmmsg, GSO and reuseport. 4.0.23
|
||||||
* v4.0, 2020-04-05, For [#307][bug #307], SRTP ASM only works with openssl-1.0, auto detect it. 4.0.22
|
* v4.0, 2020-04-05, For [#307][bug #307], SRTP ASM only works with openssl-1.0, auto detect it. 4.0.22
|
||||||
* v4.0, 2020-04-04, Merge RTC and GB28181, with bugs fixed. 4.0.21
|
* v4.0, 2020-04-04, Merge RTC and GB28181, with bugs fixed. 4.0.21
|
||||||
|
|
|
@ -769,6 +769,7 @@ srs_error_t SrsRtcSenderThread::cycle()
|
||||||
|
|
||||||
SrsConsumer* consumer = NULL;
|
SrsConsumer* consumer = NULL;
|
||||||
SrsAutoFree(SrsConsumer, consumer);
|
SrsAutoFree(SrsConsumer, consumer);
|
||||||
|
// TODO: FIXME: Dumps the SPS/PPS from gop cache, without other frames.
|
||||||
if ((err = source->create_consumer(NULL, consumer)) != srs_success) {
|
if ((err = source->create_consumer(NULL, consumer)) != srs_success) {
|
||||||
return srs_error_wrap(err, "rtc create consumer, source url=%s", req->get_stream_url().c_str());
|
return srs_error_wrap(err, "rtc create consumer, source url=%s", req->get_stream_url().c_str());
|
||||||
}
|
}
|
||||||
|
@ -1967,8 +1968,26 @@ srs_error_t SrsRtcPublisher::collect_audio_frame()
|
||||||
|
|
||||||
for (size_t j = 0; j < frames.size(); ++j) {
|
for (size_t j = 0; j < frames.size(); ++j) {
|
||||||
SrsRtpSharedPacket* pkt = frames[j];
|
SrsRtpSharedPacket* pkt = frames[j];
|
||||||
|
|
||||||
// TODO: FIXME: Write audio frame to source.
|
if (pkt->rtp_payload_size() > 0) {
|
||||||
|
SrsMessageHeader header;
|
||||||
|
header.message_type = RTMP_MSG_AudioMessage;
|
||||||
|
// TODO: FIXME: Maybe the tbn is not 90k.
|
||||||
|
header.timestamp = pkt->rtp_header.get_timestamp() / 90;
|
||||||
|
|
||||||
|
SrsSharedPtrMessage msg;
|
||||||
|
// TODO: FIXME: Check error.
|
||||||
|
msg.create(&header, NULL, 0);
|
||||||
|
|
||||||
|
SrsSample sample;
|
||||||
|
sample.size = pkt->rtp_payload_size();
|
||||||
|
sample.bytes = new char[sample.size];
|
||||||
|
memcpy((void*)sample.bytes, pkt->rtp_payload(), sample.size);
|
||||||
|
msg.set_extra_payloads(&sample, 1);
|
||||||
|
|
||||||
|
// TODO: FIXME: Check error.
|
||||||
|
source->on_rtc_audio(&msg);
|
||||||
|
}
|
||||||
|
|
||||||
srs_freep(pkt);
|
srs_freep(pkt);
|
||||||
}
|
}
|
||||||
|
@ -2103,11 +2122,12 @@ srs_error_t SrsRtcPublisher::collect_video_frame()
|
||||||
stream->write_string(pps);
|
stream->write_string(pps);
|
||||||
|
|
||||||
SrsMessageHeader header;
|
SrsMessageHeader header;
|
||||||
header.message_type = 9;
|
header.message_type = RTMP_MSG_VideoMessage;
|
||||||
// TODO: FIXME: Maybe the tbn is not 90k.
|
// TODO: FIXME: Maybe the tbn is not 90k.
|
||||||
header.timestamp = timestamp / 90;
|
header.timestamp = timestamp / 90;
|
||||||
SrsCommonMessage* shared_video = new SrsCommonMessage();
|
SrsCommonMessage* shared_video = new SrsCommonMessage();
|
||||||
SrsAutoFree(SrsCommonMessage, shared_video);
|
SrsAutoFree(SrsCommonMessage, shared_video);
|
||||||
|
// TODO: FIXME: Check error.
|
||||||
shared_video->create(&header, reinterpret_cast<char*>(video_header), stream->pos());
|
shared_video->create(&header, reinterpret_cast<char*>(video_header), stream->pos());
|
||||||
srs_error_t e = source->on_video(shared_video);
|
srs_error_t e = source->on_video(shared_video);
|
||||||
if (e != srs_success) {
|
if (e != srs_success) {
|
||||||
|
@ -2130,11 +2150,12 @@ srs_error_t SrsRtcPublisher::collect_video_frame()
|
||||||
frame_buffer[4] = 0x00;
|
frame_buffer[4] = 0x00;
|
||||||
|
|
||||||
SrsMessageHeader header;
|
SrsMessageHeader header;
|
||||||
header.message_type = 9;
|
header.message_type = RTMP_MSG_VideoMessage;
|
||||||
// TODO: FIXME: Maybe the tbn is not 90k.
|
// TODO: FIXME: Maybe the tbn is not 90k.
|
||||||
header.timestamp = timestamp / 90;
|
header.timestamp = timestamp / 90;
|
||||||
SrsCommonMessage* shared_video = new SrsCommonMessage();
|
SrsCommonMessage* shared_video = new SrsCommonMessage();
|
||||||
SrsAutoFree(SrsCommonMessage, shared_video);
|
SrsAutoFree(SrsCommonMessage, shared_video);
|
||||||
|
// TODO: FIXME: Check error.
|
||||||
shared_video->create(&header, reinterpret_cast<char*>(frame_buffer), frame_buffer_index);
|
shared_video->create(&header, reinterpret_cast<char*>(frame_buffer), frame_buffer_index);
|
||||||
srs_error_t e = source->on_video(shared_video);
|
srs_error_t e = source->on_video(shared_video);
|
||||||
if (e != srs_success) {
|
if (e != srs_success) {
|
||||||
|
|
|
@ -1030,7 +1030,8 @@ srs_error_t SrsOriginHub::on_audio(SrsSharedPtrMessage* shared_audio)
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
SrsSharedPtrMessage* msg = shared_audio;
|
SrsSharedPtrMessage* msg = shared_audio;
|
||||||
|
|
||||||
|
// TODO: FIXME: Support parsing OPUS for RTC.
|
||||||
if ((err = format->on_audio(msg)) != srs_success) {
|
if ((err = format->on_audio(msg)) != srs_success) {
|
||||||
return srs_error_wrap(err, "format consume audio");
|
return srs_error_wrap(err, "format consume audio");
|
||||||
}
|
}
|
||||||
|
@ -1058,6 +1059,7 @@ srs_error_t SrsOriginHub::on_audio(SrsSharedPtrMessage* shared_audio)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SRS_RTC
|
#ifdef SRS_RTC
|
||||||
|
// TODO: FIXME: Support parsing OPUS for RTC.
|
||||||
if ((err = rtc->on_audio(msg, format)) != srs_success) {
|
if ((err = rtc->on_audio(msg, format)) != srs_success) {
|
||||||
srs_warn("rtc: ignore audio error %s", srs_error_desc(err).c_str());
|
srs_warn("rtc: ignore audio error %s", srs_error_desc(err).c_str());
|
||||||
srs_error_reset(err);
|
srs_error_reset(err);
|
||||||
|
@ -2761,4 +2763,11 @@ void SrsSource::request_keyframe()
|
||||||
rtc_publisher->request_keyframe();
|
rtc_publisher->request_keyframe();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srs_error_t SrsSource::on_rtc_audio(SrsSharedPtrMessage* audio)
|
||||||
|
{
|
||||||
|
// TODO: FIXME: Merge with on_audio.
|
||||||
|
// TODO: FIXME: Print key information.
|
||||||
|
return on_audio_imp(audio);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -613,10 +613,12 @@ public:
|
||||||
virtual bool can_publish(bool is_edge);
|
virtual bool can_publish(bool is_edge);
|
||||||
virtual srs_error_t on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata);
|
virtual srs_error_t on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata);
|
||||||
public:
|
public:
|
||||||
|
// TODO: FIXME: Use SrsSharedPtrMessage instead.
|
||||||
virtual srs_error_t on_audio(SrsCommonMessage* audio);
|
virtual srs_error_t on_audio(SrsCommonMessage* audio);
|
||||||
private:
|
private:
|
||||||
virtual srs_error_t on_audio_imp(SrsSharedPtrMessage* audio);
|
virtual srs_error_t on_audio_imp(SrsSharedPtrMessage* audio);
|
||||||
public:
|
public:
|
||||||
|
// TODO: FIXME: Use SrsSharedPtrMessage instead.
|
||||||
virtual srs_error_t on_video(SrsCommonMessage* video);
|
virtual srs_error_t on_video(SrsCommonMessage* video);
|
||||||
private:
|
private:
|
||||||
virtual srs_error_t on_video_imp(SrsSharedPtrMessage* video);
|
virtual srs_error_t on_video_imp(SrsSharedPtrMessage* video);
|
||||||
|
@ -658,6 +660,7 @@ public:
|
||||||
void request_keyframe();
|
void request_keyframe();
|
||||||
void set_rtc_publisher(SrsRtcPublisher* v) { rtc_publisher = v; }
|
void set_rtc_publisher(SrsRtcPublisher* v) { rtc_publisher = v; }
|
||||||
// When got RTC audio message, which is encoded in opus.
|
// When got RTC audio message, which is encoded in opus.
|
||||||
|
// TODO: FIXME: Merge with on_audio.
|
||||||
srs_error_t on_rtc_audio(SrsSharedPtrMessage* audio);
|
srs_error_t on_rtc_audio(SrsSharedPtrMessage* audio);
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,6 +24,6 @@
|
||||||
#ifndef SRS_CORE_VERSION4_HPP
|
#ifndef SRS_CORE_VERSION4_HPP
|
||||||
#define SRS_CORE_VERSION4_HPP
|
#define SRS_CORE_VERSION4_HPP
|
||||||
|
|
||||||
#define SRS_VERSION4_REVISION 23
|
#define SRS_VERSION4_REVISION 24
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -603,7 +603,7 @@ srs_error_t SrsFormat::on_audio(int64_t timestamp, char* data, int size)
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
if (!data || size <= 0) {
|
if (!data || size <= 0) {
|
||||||
srs_trace("no audio present, ignore it.");
|
srs_info("no audio present, ignore it.");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -158,6 +158,7 @@ public:
|
||||||
// 1byte.
|
// 1byte.
|
||||||
// One byte field to represent the message type. A range of type IDs
|
// One byte field to represent the message type. A range of type IDs
|
||||||
// (1-7) are reserved for protocol control messages.
|
// (1-7) are reserved for protocol control messages.
|
||||||
|
// For example, RTMP_MSG_AudioMessage or RTMP_MSG_VideoMessage.
|
||||||
int8_t message_type;
|
int8_t message_type;
|
||||||
// 4bytes.
|
// 4bytes.
|
||||||
// Four-byte field that identifies the stream of the message. These
|
// Four-byte field that identifies the stream of the message. These
|
||||||
|
@ -245,6 +246,7 @@ public:
|
||||||
// 1byte.
|
// 1byte.
|
||||||
// One byte field to represent the message type. A range of type IDs
|
// One byte field to represent the message type. A range of type IDs
|
||||||
// (1-7) are reserved for protocol control messages.
|
// (1-7) are reserved for protocol control messages.
|
||||||
|
// For example, RTMP_MSG_AudioMessage or RTMP_MSG_VideoMessage.
|
||||||
int8_t message_type;
|
int8_t message_type;
|
||||||
// Get the perfered cid(chunk stream id) which sendout over.
|
// Get the perfered cid(chunk stream id) which sendout over.
|
||||||
// set at decoding, and canbe used for directly send message,
|
// set at decoding, and canbe used for directly send message,
|
||||||
|
|
Loading…
Reference in a new issue