遵循:BY-SA
作者:谭东
时间: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的用法的文章看下面链接即可。