diff --git a/library/container/flv/src/mpeg4_aac.rs b/library/container/flv/src/mpeg4_aac.rs index 7878ba1d..f29e58fb 100644 --- a/library/container/flv/src/mpeg4_aac.rs +++ b/library/container/flv/src/mpeg4_aac.rs @@ -436,7 +436,17 @@ impl Mpeg4AacProcessor { 0xF0 /* 12-syncword */ | (id << 3)/*1-ID*/| 0x01, /*1-protection_absent*/ )?; //1 - let profile = self.mpeg4_aac.object_type; + // workaround: profile - 1 overflow error. If profile == 0:reserved, then force + // profile to 2:AAC_LC. + // If publish pure AAC file to RTMP by ffmpeg, the AAC object type is 0:reserved, + // If publish a opus file to RTMP, ffmpeg will convert opus to aac, then use FLV as container, + // the object type is normal 2:AAC_LC. + let profile = if self.mpeg4_aac.object_type > 0 { + self.mpeg4_aac.object_type + } else { + 2 + }; + let sampling_frequency_index = self.mpeg4_aac.sampling_frequency_index; let channel_configuration = self.mpeg4_aac.channel_configuration; self.bytes_writer.write_u8( diff --git a/library/streamhub/src/lib.rs b/library/streamhub/src/lib.rs index 156c8970..985f3a1d 100644 --- a/library/streamhub/src/lib.rs +++ b/library/streamhub/src/lib.rs @@ -84,6 +84,11 @@ impl StreamDataTransceiver { data: _, } => {} FrameData::Audio { timestamp, data } => { + if data.len() <= 4 { + log::info!("ignore received Audio Frame with len {}", data.len()); + return; + } + let data = FrameData::Audio { timestamp, data: data.clone(), diff --git a/protocol/hls/src/flv2hls.rs b/protocol/hls/src/flv2hls.rs index c9e6f5c5..0e8cd345 100644 --- a/protocol/hls/src/flv2hls.rs +++ b/protocol/hls/src/flv2hls.rs @@ -67,8 +67,13 @@ impl Flv2HlsRemuxer { pub fn process_flv_data(&mut self, data: FlvData) -> Result<(), MediaError> { let flv_demux_data: FlvDemuxerData = match data { FlvData::Audio { timestamp, data } => { - let audio_data = self.audio_demuxer.demux(timestamp, data)?; - FlvDemuxerData::Audio { data: audio_data } + if data.len() > 4 { + // log::error!("process_flv_data len={}", data.len()); + let audio_data = self.audio_demuxer.demux(timestamp, data)?; + FlvDemuxerData::Audio { data: audio_data } + } else { + return Ok(()); + } } FlvData::Video { timestamp, data } => { if let Some(video_data) = self.video_demuxer.demux(timestamp, data)? { diff --git a/protocol/rtmp/src/cache/mod.rs b/protocol/rtmp/src/cache/mod.rs index 05867f9e..6a5d05ae 100644 --- a/protocol/rtmp/src/cache/mod.rs +++ b/protocol/rtmp/src/cache/mod.rs @@ -33,7 +33,6 @@ pub struct Cache { impl Cache { pub fn new(gop_num: usize, statistic_data_sender: Option) -> Self { - Cache { metadata: metadata::MetaData::new(), metadata_timestamp: 0, @@ -78,7 +77,10 @@ impl Cache { let mut reader = BytesReader::new(chunk_body.clone()); let tag_header = AudioTagHeader::unmarshal(&mut reader)?; - if tag_header.sound_format == define::SoundFormat::AAC as u8 + let remain_bytes = reader.extract_remaining_bytes(); + + if remain_bytes.len() >= 2 + && tag_header.sound_format == define::SoundFormat::AAC as u8 && tag_header.aac_packet_type == define::aac_packet_type::AAC_SEQHDR { self.audio_seq = chunk_body.clone(); @@ -88,7 +90,7 @@ impl Cache { let mut aac_processor = Mpeg4AacProcessor::default(); let aac = aac_processor - .extend_data(reader.extract_remaining_bytes()) + .extend_data(remain_bytes) .audio_specific_config_load()?; let statistic_audio_codec = StatisticData::AudioCodec {