音视频入门之音频采集、编码、播放(1)

本文详细介绍了如何使用Java代码将PCM文件转换为WAV格式,以及如何进一步将PCM数据编码为AAC格式。通过分析AudioTrack和MediaCodec的使用,展示了音频数据处理的核心步骤和技术细节。
摘要由CSDN通过智能技术生成

* PCM文件转WAV文件
*
* @param inPcmFilePath  输入PCM文件路径
* @param outWavFilePath 输出WAV文件路径
* @param sampleRate     采样率,例如44100
* @param channels       声道数 单声道:1或双声道:2
* @param bitNum         采样位数,8或16
/    
public static void convertPcm2Wav(String inPcmFilePath, String outWavFilePath, int sampleRate,int channels, int bitNum) {
FileInputStream in = null;
FileOutputStream out = null;
byte[] data = new byte[1024];
try {
//采样字节byte率
long byteRate = sampleRate * channels * bitNum / 8;
in = new FileInputStream(inPcmFilePath);
out = new FileOutputStream(outWavFilePath);
//PCM文件大小
long totalAudioLen = in.getChannel().size();
//总大小,由于不包括RIFF和WAV,所以是44 - 8 = 36,在加上PCM文件大小
long totalDataLen = totalAudioLen + 36;
writeWaveFileHeader(out, totalAudioLen, totalDataLen, sampleRate, channels, byteRate);
int length = 0;
while ((length = in.read(data)) > 0) {
out.write(data, 0, length);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtil.close(in,out);
}
}
/
*
* 输出WAV文件
*
* @param out           WAV输出文件流
* @param totalAudioLen 整个音频PCM数据大小
* @param totalDataLen  整个数据大小
* @param sampleRate    采样率
* @param channels      声道数
* @param byteRate      采样字节byte率
* @throws IOException
/
private static void writeWaveFileHeader(FileOutputStream out, long totalAudioLen,long totalDataLen, int sampleRate, int channels, long byteRate) throws IOException {
byte[] header = new byte[44];
header[0] = ‘R’; // RIFF
header[1] = ‘I’;
header[2] = ‘F’;
header[3] = ‘F’;
header[4] = (byte) (totalDataLen & 0xff);//数据大小
header[5] = (byte) ((totalDataLen >> 8) & 0xff);
header[6] = (byte) ((totalDataLen >> 16) & 0xff);
header[7] = (byte) ((totalDataLen >> 24) & 0xff);
header[8] = ‘W’;//WAVE
header[9] = ‘A’;
header[10] = ‘V’;
header[11] = ‘E’;
//FMT Chunk
header[12] = ‘f’; // 'fmt ’
header[13] = ‘m’;
header[14] = ‘t’;
header[15] = ’ ';//过渡字节
//数据大小
header[16] = 16;
// 4 bytes: size of 'fmt ’ chunk
header[17] = 0;
header[18] = 0;
header[19] = 0;
//编码方式 10H为PCM编码格式
header[20] = 1; // format = 1
header[21] = 0;
//通道数
header[22] = (byte) channels;
header[23] = 0;
//采样率,每个通道的播放速度
header[24] = (byte) (sampleRate & 0xff);
header[25] = (byte) ((sampleRate >> 8) &am

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值