1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

DVR: support mp3 audio codec. (#2593) v5.0.17

This commit is contained in:
Haibo Chen 2021-09-10 11:53:31 +08:00 committed by winlin
parent e03ada39a1
commit 7fd5e8607c
8 changed files with 167 additions and 14 deletions

View file

@ -1388,6 +1388,7 @@ srs_error_t SrsFormat::audio_mp3_demux(SrsBuffer* stream, int64_t timestamp)
audio->cts = 0;
audio->dts = timestamp;
audio->aac_packet_type = SrsAudioMp3FrameTrait;
// @see: E.4.2 Audio Tags, video_file_format_spec_v10_1.pdf, page 76
int8_t sound_format = stream->read_1bytes();

View file

@ -167,6 +167,11 @@ enum SrsAudioAacFrameTrait
SrsAudioOpusFrameTraitRaw = 2,
SrsAudioOpusFrameTraitSamplingRate = 4,
SrsAudioOpusFrameTraitAudioLevel = 8,
// 16/32 reserved for g711a/g711u
// For MP3
SrsAudioMp3FrameTrait = 64,
};
/**

View file

@ -1812,11 +1812,16 @@ SrsAudioCodecId SrsMp4TrackBox::soun_codec()
if (box->entry_count() == 0) {
return SrsAudioCodecIdForbidden;
}
SrsMp4SampleEntry* entry = box->entrie_at(0);
switch(entry->type) {
case SrsMp4BoxTypeMP4A: return SrsAudioCodecIdAAC;
default: return SrsAudioCodecIdForbidden;
SrsMp4EsdsBox* esds_box = mp4a()->esds();
switch (esds_box->es->decConfigDescr.objectTypeIndication) {
case SrsMp4ObjectTypeAac:
return SrsAudioCodecIdAAC;
case SrsMp4ObjectTypeMp3:
case SrsMp4ObjectTypeMp1a:
return SrsAudioCodecIdMP3;
default:
return SrsAudioCodecIdForbidden;
}
}
@ -3429,7 +3434,7 @@ srs_error_t SrsMp4DecoderConfigDescriptor::encode_payload(SrsBuffer* buf)
buf->write_3bytes(bufferSizeDB);
buf->write_4bytes(maxBitrate);
buf->write_4bytes(avgBitrate);
if (decSpecificInfo && (err = decSpecificInfo->encode(buf)) != srs_success) {
return srs_error_wrap(err, "encode des specific info");
}
@ -3440,7 +3445,7 @@ srs_error_t SrsMp4DecoderConfigDescriptor::encode_payload(SrsBuffer* buf)
srs_error_t SrsMp4DecoderConfigDescriptor::decode_payload(SrsBuffer* buf)
{
srs_error_t err = srs_success;
objectTypeIndication = (SrsMp4ObjectType)buf->read_1bytes();
uint8_t v = buf->read_1bytes();
@ -5488,7 +5493,7 @@ srs_error_t SrsMp4Decoder::parse_moov(SrsMp4MovieBox* moov)
if (vide && !avcc) {
return srs_error_new(ERROR_MP4_ILLEGAL_MOOV, "missing video sequence header");
}
if (soun && !asc) {
if (soun && !asc && soun->soun_codec() == SrsAudioCodecIdAAC) {
return srs_error_new(ERROR_MP4_ILLEGAL_MOOV, "missing audio sequence header");
}
@ -5910,13 +5915,15 @@ srs_error_t SrsMp4Encoder::flush()
es->ES_ID = 0x02;
SrsMp4DecoderConfigDescriptor& desc = es->decConfigDescr;
desc.objectTypeIndication = SrsMp4ObjectTypeAac;
desc.objectTypeIndication = get_audio_object_type();
desc.streamType = SrsMp4StreamTypeAudioStream;
srs_freep(desc.decSpecificInfo);
SrsMp4DecoderSpecificInfo* asc = new SrsMp4DecoderSpecificInfo();
desc.decSpecificInfo = asc;
asc->asc = pasc;;
if (SrsMp4ObjectTypeAac == desc.objectTypeIndication) {
SrsMp4DecoderSpecificInfo* asc = new SrsMp4DecoderSpecificInfo();
desc.decSpecificInfo = asc;
asc->asc = pasc;
}
}
if ((err = samples->write(moov)) != srs_success) {
@ -6045,6 +6052,18 @@ srs_error_t SrsMp4Encoder::do_write_sample(SrsMp4Sample* ps, uint8_t* sample, ui
return err;
}
SrsMp4ObjectType SrsMp4Encoder::get_audio_object_type()
{
switch (acodec) {
case SrsAudioCodecIdAAC:
return SrsMp4ObjectTypeAac;
case SrsAudioCodecIdMP3:
return (srs_flv_srates[sample_rate] > 24000) ? SrsMp4ObjectTypeMp1a : SrsMp4ObjectTypeMp3; // 11172 - 3
default:
return SrsMp4ObjectTypeForbidden;
}
}
SrsMp4M2tsInitEncoder::SrsMp4M2tsInitEncoder()
{
writer = NULL;

View file

@ -1369,6 +1369,10 @@ enum SrsMp4ObjectType
SrsMp4ObjectTypeForbidden = 0x00,
// Audio ISO/IEC 14496-3
SrsMp4ObjectTypeAac = 0x40,
// Audio ISO/IEC 13818-3
SrsMp4ObjectTypeMp3 = 0x69,
// Audio ISO/IEC 11172-3
SrsMp4ObjectTypeMp1a = 0x6B,
};
// Table 6 — streamType Values
@ -2072,6 +2076,7 @@ public:
private:
virtual srs_error_t copy_sequence_header(SrsFormat* format, bool vsh, uint8_t* sample, uint32_t nb_sample);
virtual srs_error_t do_write_sample(SrsMp4Sample* ps, uint8_t* sample, uint32_t nb_sample);
virtual SrsMp4ObjectType get_audio_object_type();
};
// A fMP4 encoder, to write the init.mp4 with sequence header.