zoukankan      html  css  js  c++  java
  • AAC包增加ADTS头Without MediaCodec

    AAC原始码流无法直接播放,一般需要封装为ADTS格式才能再次使用,本博主在android中用MediaCodec编码得到的AAC就是raw格式,为了保存为.aac格式,需要增加adts头,这样就可以通过vlc或者windows Media player直接播放了。现在把网上搜集的资料和代码总结一下,以备自己以后参考,也分享给有需要的同仁。

    源码来自:

    http://stackoverflow.com/questions/18862715/how-to-generate-the-aac-adts-elementary-stream-with-android-mediacodec

    实现函数:

     /**
         *  Add ADTS header at the beginning of each and every AAC packet.
         *  This is needed as MediaCodec encoder generates a packet of raw
         *  AAC data.
         *
         *  Note the packetLen must count in the ADTS header itself !!! .
         *注意,这里的packetLen参数为raw aac Packet Len + 7; 7 bytes adts header
         **/

        private void addADTStoPacket(byte[] packet, int packetLen) {
            int profile = 2;  //AAC LC,MediaCodecInfo.CodecProfileLevel.AACObjectLC;
            int freqIdx = 5;  //32K, 见后面注释avpriv_mpeg4audio_sample_rates中32000对应的数组下标,来自ffmpeg源码
            int chanCfg = 2;  //见后面注释channel_configuration,Stero双声道立体声

            /*int avpriv_mpeg4audio_sample_rates[] = {
                96000, 88200, 64000, 48000, 44100, 32000,
                        24000, 22050, 16000, 12000, 11025, 8000, 7350
            };
            channel_configuration: 表示声道数chanCfg
            0: Defined in AOT Specifc Config
            1: 1 channel: front-center
            2: 2 channels: front-left, front-right
            3: 3 channels: front-center, front-left, front-right
            4: 4 channels: front-center, front-left, front-right, back-center
            5: 5 channels: front-center, front-left, front-right, back-left, back-right
            6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel
            7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel
            8-15: Reserved
            */


            // fill in ADTS data
            packet[0] = (byte)0xFF;
            packet[1] = (byte)0xF9;
            packet[2] = (byte)(((profile-1)<<6) + (freqIdx<<2) +(chanCfg>>2));
            packet[3] = (byte)(((chanCfg&3)<<6) + (packetLen>>11));
            packet[4] = (byte)((packetLen&0x7FF) >> 3);
            packet[5] = (byte)(((packetLen&7)<<5) + 0x1F);
            packet[6] = (byte)0xFC;
        }

    以下理论转载自博客:http://wiki.multimedia.cx/index.php?title=ADTS
    Audio Data Transport Stream (ADTS) is a format, used by MPEG TS or Shoutcast to stream audio, usually AAC.

    Structure
    AAAAAAAA AAAABCCD EEFFFFGH HHIJKLMM MMMMMMMM MMMOOOOO OOOOOOPP (QQQQQQQQ QQQQQQQQ)
    Header consists of 7 or 9 bytes (without or with CRC).

    Letter Length (bits) Description
    A 12 syncword 0xFFF, all bits must be 1
    B 1 MPEG Version: 0 for MPEG-4, 1 for MPEG-2
    C 2 Layer: always 0
    D 1 protection absent, Warning, set to 1 if there is no CRC and 0 if there is CRC
    E 2 profile, the MPEG-4 Audio Object Type minus 1
    F 4 MPEG-4 Sampling Frequency Index (15 is forbidden)
    G 1 private stream, set to 0 when encoding, ignore when decoding
    H 3 MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband

    PCE)
    I 1 originality, set to 0 when encoding, ignore when decoding
    J 1 home, set to 0 when encoding, ignore when decoding
    K 1 copyrighted stream, set to 0 when encoding, ignore when decoding
    L 1 copyright start, set to 0 when encoding, ignore when decoding
    M 13 frame length, this value must include 7 or 9 bytes of header length: FrameLength =

    (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame)
    O 11 Buffer fullness
    P 2 Number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame

    per ADTS frame
    Q 16 CRC if protection absent is 0

    Usage in MPEG-TS
    ADTS packet must be a content of PES packet. Pack AAC data inside ADTS frame, than pack inside PES packet, then mux

    by TS packetizer.

    Usage in Shoutcast
    ADTS frames goes one by one in TCP stream. Look for syncword, parse header and look for next syncword after.

  • 相关阅读:
    orale 命令行创建&删除数据库
    Oracle 之表分析
    电子商务分销历程
    乐宝分销,人人都是老板
    随手将TPaxScripter 3.0改成了支持Delphi 2009,Delphi 2010,Delphi Xe
    百丽强势布局B2C,20亿铺路改变其销售格局
    顺丰开通B2C商城,快递业欲抢多一寸电商蛋糕
    Exchange环境搭建心得
    c# 添加外部程序集相对引用问题
    Entity Framework Code First 学习
  • 原文地址:https://www.cnblogs.com/babosa/p/9217895.html
Copyright © 2011-2022 走看看