Android如何写一段空音频数据,静音数据


遵循:BY-SA

署名-相同方式共享 4.0协议

作者:谭东

时间:2016年10月31日

环境:Windows 7


有的时候会遇到这样的需求,例如直播时候,某段时间点了静音,你的音频录制数据就要是静音的。但是AudioRecorder还是有数据的,这时你就要自己处理这段时间的数据为静音的,没有音频流的音频。

其实就是你在静音这段时间不使用系统返回的音频data数据,而是写入空data数据即可,有时需要包含头文件。


这里以AAC音频流为例。下面这段就是在AAC裸流里写入了ADTS头文件后,写入了空数据数组,这样出来的AAC音频文件就是静音后的音频文件了。

    @Override
    public void onFrameAvailable(Object o) {
        AudioBufFrame audioBufFrame = (AudioBufFrame) o;
        int outBufferSize = audioBufFrame.buf.limit() + 7;
        byte[] aacBytes = new byte[outBufferSize];
        try {
            if (!write) {
                fout = new FileOutputStream(MyConfiguration.VIDEO_PATH + "/audio.aac");
                write = true;
            }
            addADTStoPacket(aacBytes, outBufferSize);

            fout.write(aacBytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 添加ADTS头
     *
     * @param packet
     * @param packetLen
     */
    private void addADTStoPacket(byte[] packet, int packetLen) {
        int profile = 2; // AAC LC
        int freqIdx = 4; // 44.1KHz
        int chanCfg = 2; // CPE

        // 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;
    }

关于AAC头文件ADTS的文章和ByteBuffer的用法的文章看下面链接即可。

AAC的ADTS头文件信息介绍

ByteBuffer的用法



你可能感兴趣的:(android,音频)