CopyrightIdentificationBit, CopyrightIdentificationStart, AACFrameLength, 一个ADTS帧的长度包括ADTS头和raw data block. ADTSBufferFullness, 0x7FF 说明是码率可变的码流. NumberOfRawDataBlockInFrame, 表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧 所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有一个AAC数据块并不是说没有。(一
(asc *AudioSpecificConfig, rawDataLength int, adtsByte []byte)
| 179 | // 所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有一个AAC数据块并不是说没有。(一个AAC原始帧包含一段时间内1024个采样及相关数据) |
| 180 | |
| 181 | func AudioSpecificConfigToADTS(asc *AudioSpecificConfig, rawDataLength int, adtsByte []byte) (adts ADTS, err error) { |
| 182 | if asc.ChannelConfiguration > 8 || asc.FrameLengthFlag > 13 { |
| 183 | err = errors.New("Reserved field.") |
| 184 | return |
| 185 | } |
| 186 | |
| 187 | // ADTSFixedHeader |
| 188 | adts.SyncWord = 0xfff |
| 189 | adts.ID = 0 |
| 190 | adts.Layer = 0 |
| 191 | adts.ProtectionAbsent = 1 |
| 192 | |
| 193 | // SyncWord(12) + ID(1) + Layer(2) + ProtectionAbsent(1) |
| 194 | adtsByte[0] = 0xFF |
| 195 | adtsByte[1] = 0xF1 |
| 196 | if asc.AudioObjectType >= 3 || asc.AudioObjectType == 0 { |
| 197 | adts.Profile = 1 |
| 198 | } else { |
| 199 | adts.Profile = asc.AudioObjectType - 1 |
| 200 | } |
| 201 | |
| 202 | adts.SamplingFrequencyIndex = asc.SamplingFrequencyIndex |
| 203 | adts.PrivateBit = 0 |
| 204 | adts.ChannelConfiguration = asc.ChannelConfiguration |
| 205 | adts.OriginalCopy = 0 |
| 206 | adts.Home = 0 |
| 207 | |
| 208 | // Profile(2) + SamplingFrequencyIndex(4) + PrivateBit(1) + ChannelConfiguration(3)(取高1位) |
| 209 | adtsByte[2] = uint8(adts.Profile<<6) + uint8(adts.SamplingFrequencyIndex<<2) + uint8(adts.PrivateBit<<1) + uint8((adts.ChannelConfiguration&0x7)>>2) |
| 210 | // ADTSVariableHeader |
| 211 | adts.CopyrightIdentificationBit = 0 |
| 212 | adts.CopyrightIdentificationStart = 0 |
| 213 | adts.AACFrameLength = 7 + uint16(rawDataLength) |
| 214 | adts.ADTSBufferFullness = 0x7ff |
| 215 | adts.NumberOfRawDataBlockInFrame = 0 |
| 216 | |
| 217 | // ChannelConfiguration(3)(取低2位) + OriginalCopy(1) + Home(1) + CopyrightIdentificationBit(1) + CopyrightIdentificationStart(1) + AACFrameLength(13)(取高2位) |
| 218 | adtsByte[3] = uint8((adts.ChannelConfiguration&0x3)<<6) + uint8((adts.AACFrameLength&0x1fff)>>11) |
| 219 | |
| 220 | // AACFrameLength(13) |
| 221 | // xx xxxxxxxx xxx |
| 222 | // 取中间的部分 |
| 223 | adtsByte[4] = uint8(((adts.AACFrameLength & 0x1fff) >> 3) & 0x0ff) |
| 224 | |
| 225 | // AACFrameLength(13)(取低3位) + ADTSBufferFullness(11)(取高5位) |
| 226 | adtsByte[5] = uint8((adts.AACFrameLength&0x0007)<<5) + 0x1f |
| 227 | |
| 228 | // ADTSBufferFullness(11)(取低6位) + NumberOfRawDataBlockInFrame(2) |
| 229 | adtsByte[6] = 0xfc |
| 230 | return |
| 231 | } |