From 4036d5db2ad44f9a35434a2c0c79dde40b8399ad Mon Sep 17 00:00:00 2001 From: Leo Ma Date: Mon, 7 Nov 2016 21:13:27 +0800 Subject: [PATCH] Add ADTS header for AAC ES Signed-off-by: Leo Ma --- .../java/net/ossrs/yasea/SrsFlvMuxer.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/ossrs/yasea/SrsFlvMuxer.java b/app/src/main/java/net/ossrs/yasea/SrsFlvMuxer.java index e2072a0..ea80c7c 100644 --- a/app/src/main/java/net/ossrs/yasea/SrsFlvMuxer.java +++ b/app/src/main/java/net/ossrs/yasea/SrsFlvMuxer.java @@ -829,7 +829,7 @@ public class SrsFlvMuxer { byte[] frame = new byte[bi.size + 2]; byte aac_packet_type = 1; // 1 = AAC raw if (aac_specific_config == null) { - frame = new byte[4]; + frame = new byte[4 + 7]; // @see aac-mp4a-format-ISO_IEC_14496-3+2001.pdf // AudioSpecificConfig (), page 33 @@ -868,6 +868,8 @@ public class SrsFlvMuxer { aac_specific_config = frame; aac_packet_type = 0; // 0 = AAC sequence header + + write_adts_header(frame, 4); } else { bb.get(frame, 2, frame.length - 2); } @@ -903,6 +905,42 @@ public class SrsFlvMuxer { rtmp_write_packet(SrsCodecFlvTag.Audio, dts, 0, aac_packet_type, tag); } + private void write_adts_header(byte[] frame, int offset) { + // adts sync word 0xfff (12-bit) + frame[offset] = (byte) 0xff; + frame[offset + 1] = (byte) 0xf0; + // versioin 0 for MPEG-4, 1 for MPEG-2 (1-bit) + frame[offset + 1] |= 0 << 3; + // layer 0 (2-bit) + frame[offset + 1] |= 0 << 1; + // protection absent: 1 (1-bit) + frame[offset + 1] |= 1; + // profile: audio_object_type - 1 (2-bit) + frame[offset + 2] = (SrsAacObjectType.AacLC - 1) << 6; + // sampling frequency index: 4 (4-bit) + frame[offset + 2] |= (4 & 0xf) << 2; + // channel configuration (3-bit) + frame[offset + 2] |= (2 & (byte) 0x4) >> 2; + frame[offset + 3] = (byte) ((2 & (byte) 0x03) << 6); + // original: 0 (1-bit) + frame[offset + 3] |= 0 << 5; + // home: 0 (1-bit) + frame[offset + 3] |= 0 << 4; + // copyright id bit: 0 (1-bit) + frame[offset + 3] |= 0 << 3; + // copyright id start: 0 (1-bit) + frame[offset + 3] |= 0 << 2; + // frame size (13-bit) + frame[offset + 3] |= ((frame.length - 2) & 0x1800) >> 11; + frame[offset + 4] = (byte) (((frame.length - 2) & 0x7f8) >> 3); + frame[offset + 5] = (byte) (((frame.length - 2) & 0x7) << 5); + // buffer fullness (0x7ff for variable bitrate) + frame[offset + 5] |= (byte) 0x1f; + frame[offset + 6] = (byte) 0xfc; + // number of data block (nb - 1) + frame[offset + 6] |= 0x0; + } + public void writeVideoSample(final ByteBuffer bb, MediaCodec.BufferInfo bi) throws IllegalArgumentException { int pts = (int)(bi.presentationTimeUs / 1000); int dts = (int)pts;