您的位置:首页 > 移动开发 > Android开发

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

2016-10-31 10:16 831 查看




遵循: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的用法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐