试验目标:
1.在树莓派上,安装麦克风
2.提供一个java springboot的项目,打包好以后,放到树莓派中,运行,项目提供出restful风格的接口,对麦克风的录制与暂停进行控制。
3.实时播放麦克风的声音。
这样做,是为了后面对声音进行识别控制做好基础。
定义与范围划分:
1.载体:小车底盘,轮子等非电子类物品统称为载体。
2.控制中心:树莓派称为控制中心
3.电子部件: 麦克风
4.软件部分:java语言与其操作系统划分为软件部分
=================================================
一.准备
思路:通过java web程序,通过接口的方式,控制麦克风录制与播放功能。并将录制文件放到磁盘存储起来。
1.控制中心
树莓派4b(对树莓派的使用不熟悉或者对java不熟悉的同学请关注专栏,可以提供一些指导)
代码编写与管理平台(方便网页控制)
2.电子设备
麦克风
3.软件与程序
centos7 32位
java的运行编译环境jdk8
录制麦克风声音程序
4.载体
无
二.电路连接示意图
无
三.程序部分
注:由于直接读取音频,不要读取gpio针脚,所以无需通过pi4j,简单通过java的音频api就可以控制麦克风的录制等功能,
项目地址:
项目框架: spring boot
中 间 件: maven,git,jdk8
测试工具: jmeter
为了详细讲解代码部分,将项目进行拆分为以下几部分:pom文件,接口,核心类文件,测试文件
package top.fairy.global.globalfairytoppi4j.action;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import top.fairy.global.globalfairytoppi4j.sound.RecordAndPlay;
/**
* @author jiao_zg22
* @version 1.0
* @description 接口
* @date 2021/4/23 20:15
*/
@RestController
@SpringBootApplication
@RequestMapping(value = “/sound”)
public class SoundController {
private static final Logger logger = LogManager.getLogger();
@RequestMapping(value = “/record/start”, method = RequestMethod.POST)
public String record() {
logger.info(“音频录制开始”);
new Thread() {
@Override
public void run() {
try {
RecordAndPlay.play();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
return “音频录制结束”;
}
@RequestMapping(value = “/record/stop”, method = RequestMethod.POST)
public String recordStop() {
logger.info(“音频录制停止”);
new Thread() {
@Override
public void run() {
try {
RecordAndPlay.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
return “音频录制停止”;
}
}
package top.fairy.global.globalfairytoppi4j.sound;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.TargetDataLine;
/**
* @author jiao_zg22
* @version 1.0
* @description 接口
* @date 2021/4/23 19:22
*/
public class RecordAndPlay {
static volatile boolean stop = false;
public static void main(String[] args) {
play();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
stop();
}
//播放音频文件
public static void play() {
try {
AudioFormat audioFormat =
// new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100F,
// 8, 1, 1, 44100F, false);
new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100F, 16, 2, 4,
44100F, true);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);
TargetDataLine targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
targetDataLine.open(audioFormat);
final SourceDataLine sourceDataLine;
info = new DataLine.Info(SourceDataLine.class, audioFormat);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(info);
sourceDataLine.open(audioFormat);
targetDataLine.start();
sourceDataLine.start();
FloatControl fc=(FloatControl)sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
double value=2;
float dB = (float)
(Math.log(value==0.0?0.0001:value)/Math.log(10.0)*20.0);
fc.setValue(dB);
int nByte = 0;
final int bufSize=4100;
byte[] buffer = new byte[bufSize];
while (nByte != -1 && !stop ) {
//System.in.read();
nByte = targetDataLine.read(buffer, 0, bufSize);
sourceDataLine.write(buffer, 0, nByte);
System.out.println(stop);
}
sourceDataLine.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
//播放音频文件
public static void stop() {
stop = true;
}
}
4.测试文件
链接: 提取码: 9h2f
或者可以自己写测试接口。就是简单的post,get方式的接口
五.效果
当放开 /sound/record/start 接口的时候开始录制音频,并实时回放。
当放开 /sound/record/stop 接口的时候,停止录制音频。
————————————————
版权声明:本文为CSDN博主「水上冰石」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接: