mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Fix #939, response right A/V flag in FLV header. 3.0.113
This commit is contained in:
parent
68efca4fa9
commit
4f39303f37
4 changed files with 68 additions and 7 deletions
|
@ -146,6 +146,7 @@ For previous versions, please read:
|
||||||
|
|
||||||
## V3 changes
|
## V3 changes
|
||||||
|
|
||||||
|
* v3.0, 2020-02-04, Fix [#939][bug #939], response right A/V flag in FLV header. 3.0.113
|
||||||
* v3.0, 2020-02-04, For [#939][bug #939], always enable fast FLV streaming.
|
* v3.0, 2020-02-04, For [#939][bug #939], always enable fast FLV streaming.
|
||||||
* <strong>v3.0, 2020-02-02, [3.0 beta0(3.0.112)][r3.0b0] released. 121709 lines.</strong>
|
* <strong>v3.0, 2020-02-02, [3.0 beta0(3.0.112)][r3.0b0] released. 121709 lines.</strong>
|
||||||
* v3.0, 2020-01-29, Support isolate version file. 3.0.112
|
* v3.0, 2020-01-29, Support isolate version file. 3.0.112
|
||||||
|
|
|
@ -249,6 +249,7 @@ srs_error_t SrsTsStreamEncoder::dump_cache(SrsConsumer* /*consumer*/, SrsRtmpJit
|
||||||
|
|
||||||
SrsFlvStreamEncoder::SrsFlvStreamEncoder()
|
SrsFlvStreamEncoder::SrsFlvStreamEncoder()
|
||||||
{
|
{
|
||||||
|
header_written = false;
|
||||||
enc = new SrsFlvTransmuxer();
|
enc = new SrsFlvTransmuxer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,26 +266,39 @@ srs_error_t SrsFlvStreamEncoder::initialize(SrsFileWriter* w, SrsBufferCache* /*
|
||||||
return srs_error_wrap(err, "init encoder");
|
return srs_error_wrap(err, "init encoder");
|
||||||
}
|
}
|
||||||
|
|
||||||
// write flv header.
|
|
||||||
if ((err = enc->write_header()) != srs_success) {
|
|
||||||
return srs_error_wrap(err, "write header");
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsFlvStreamEncoder::write_audio(int64_t timestamp, char* data, int size)
|
srs_error_t SrsFlvStreamEncoder::write_audio(int64_t timestamp, char* data, int size)
|
||||||
{
|
{
|
||||||
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
if ((err = write_header()) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "write header");
|
||||||
|
}
|
||||||
|
|
||||||
return enc->write_audio(timestamp, data, size);
|
return enc->write_audio(timestamp, data, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsFlvStreamEncoder::write_video(int64_t timestamp, char* data, int size)
|
srs_error_t SrsFlvStreamEncoder::write_video(int64_t timestamp, char* data, int size)
|
||||||
{
|
{
|
||||||
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
if ((err = write_header()) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "write header");
|
||||||
|
}
|
||||||
|
|
||||||
return enc->write_video(timestamp, data, size);
|
return enc->write_video(timestamp, data, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsFlvStreamEncoder::write_metadata(int64_t timestamp, char* data, int size)
|
srs_error_t SrsFlvStreamEncoder::write_metadata(int64_t timestamp, char* data, int size)
|
||||||
{
|
{
|
||||||
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
if ((err = write_header()) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "write header");
|
||||||
|
}
|
||||||
|
|
||||||
return enc->write_metadata(SrsFrameTypeScript, data, size);
|
return enc->write_metadata(SrsFrameTypeScript, data, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,9 +316,52 @@ srs_error_t SrsFlvStreamEncoder::dump_cache(SrsConsumer* /*consumer*/, SrsRtmpJi
|
||||||
|
|
||||||
srs_error_t SrsFlvStreamEncoder::write_tags(SrsSharedPtrMessage** msgs, int count)
|
srs_error_t SrsFlvStreamEncoder::write_tags(SrsSharedPtrMessage** msgs, int count)
|
||||||
{
|
{
|
||||||
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
// For https://github.com/ossrs/srs/issues/939
|
||||||
|
if (!header_written) {
|
||||||
|
bool has_video = false;
|
||||||
|
bool has_audio = false;
|
||||||
|
|
||||||
|
for (int i = 0; i < count && (!has_video || !has_audio); i++) {
|
||||||
|
SrsSharedPtrMessage* msg = msgs[i];
|
||||||
|
if (msg->is_video()) {
|
||||||
|
has_video = true;
|
||||||
|
} else if (msg->is_audio()) {
|
||||||
|
has_audio = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Drop data if no A+V.
|
||||||
|
if (!has_video && !has_audio) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((err = write_header(has_video, has_audio)) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "write header");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return enc->write_tags(msgs, count);
|
return enc->write_tags(msgs, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srs_error_t SrsFlvStreamEncoder::write_header(bool has_video, bool has_audio)
|
||||||
|
{
|
||||||
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
if (!header_written) {
|
||||||
|
header_written = true;
|
||||||
|
|
||||||
|
if ((err = enc->write_header(has_video, has_audio)) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "write header");
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_trace("FLV: write header audio=%d, video=%d", has_audio, has_video);
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
SrsAacStreamEncoder::SrsAacStreamEncoder()
|
SrsAacStreamEncoder::SrsAacStreamEncoder()
|
||||||
{
|
{
|
||||||
enc = new SrsAacTransmuxer();
|
enc = new SrsAacTransmuxer();
|
||||||
|
|
|
@ -82,8 +82,9 @@ public:
|
||||||
// Transmux RTMP to HTTP Live Streaming.
|
// Transmux RTMP to HTTP Live Streaming.
|
||||||
class SrsFlvStreamEncoder : public ISrsBufferEncoder
|
class SrsFlvStreamEncoder : public ISrsBufferEncoder
|
||||||
{
|
{
|
||||||
protected:
|
private:
|
||||||
SrsFlvTransmuxer* enc;
|
SrsFlvTransmuxer* enc;
|
||||||
|
bool header_written;
|
||||||
public:
|
public:
|
||||||
SrsFlvStreamEncoder();
|
SrsFlvStreamEncoder();
|
||||||
virtual ~SrsFlvStreamEncoder();
|
virtual ~SrsFlvStreamEncoder();
|
||||||
|
@ -98,6 +99,8 @@ public:
|
||||||
public:
|
public:
|
||||||
// Write the tags in a time.
|
// Write the tags in a time.
|
||||||
virtual srs_error_t write_tags(SrsSharedPtrMessage** msgs, int count);
|
virtual srs_error_t write_tags(SrsSharedPtrMessage** msgs, int count);
|
||||||
|
private:
|
||||||
|
virtual srs_error_t write_header(bool has_video = true, bool has_audio = true);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Transmux RTMP to HTTP TS Streaming.
|
// Transmux RTMP to HTTP TS Streaming.
|
||||||
|
|
|
@ -24,6 +24,6 @@
|
||||||
#ifndef SRS_CORE_VERSION3_HPP
|
#ifndef SRS_CORE_VERSION3_HPP
|
||||||
#define SRS_CORE_VERSION3_HPP
|
#define SRS_CORE_VERSION3_HPP
|
||||||
|
|
||||||
#define SRS_VERSION3_REVISION 112
|
#define SRS_VERSION3_REVISION 113
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue