package com.dji.sample.speak.service.serviceImpl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.dji.sample.common.model.Pagination; import com.dji.sample.common.model.PaginationData; import com.dji.sample.component.mqtt.service.IMessageSenderService; import com.dji.sample.media.model.MinioPojo; import com.dji.sample.media.service.impl.FileServiceImpl; import com.dji.sample.speak.dao.SpeakVoiceMapper; import com.dji.sample.speak.model.dto.*; import com.dji.sample.speak.model.entity.SpeakVoiceEntity; import com.dji.sample.speak.model.enums.FormatEnum; import com.dji.sample.speak.model.enums.VoiceEnums; import com.dji.sample.speak.service.SpeakVoiceService; import com.dji.sample.speak.util.MD5Util; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; import java.io.File; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.stream.Collectors; @Service public class SpeakVoiceServiceImpl implements SpeakVoiceService { @Autowired private IMessageSenderService messageSenderService; @Autowired private MinioPojo pojo; @Autowired private SpeakVoiceMapper voiceMapper; @Override public SpeakVoiceEntity takeVoice(String name, File file) throws UnsupportedAudioFileException, IOException { SpeakVoiceEntity voiceEntity = new SpeakVoiceEntity(); String url = upMinio(file, name); String md5 = MD5Util.getMD5Checksum(file); double time = getAudioDuration(file); voiceEntity.setMd5(md5); voiceEntity.setSecond(time); voiceEntity.setUrl(url); voiceEntity.setName(name); voiceMapper.insert(voiceEntity); return voiceEntity; } @Override public int takeVoicee(String sn, Integer psdk_index, String name, File file,Integer volumn,SpeakVoiceEntity entity) { SpeakVoiceStartDto dto = new SpeakVoiceStartDto(); SpeakVoiceFileDto fileDto = new SpeakVoiceFileDto(); SpeakVolumeDto volumeDto=new SpeakVolumeDto(); volumeDto.setPsdk_index(psdk_index); volumeDto.setPlay_volume(volumn); fileDto.setUrl(entity.getUrl()); fileDto.setMd5(entity.getMd5()); fileDto.setFormat(FormatEnum.PCM); fileDto.setName(entity.getName()); dto.setPsdk_index(psdk_index); dto.setFile(fileDto); messageSenderService.publishServicesTopic(sn, VoiceEnums.SPEAKER_PLAY_VOLUME_SET.getMethod(), volumeDto); return messageSenderService.publishServicesTopic(sn, VoiceEnums.SPEAKER_AUDIO_PLAY_START.getMethod(), dto).getResult(); } @Override public int restartVoice(String sn, Integer psdk_index) { SpeakRestartDto dto=new SpeakRestartDto(); dto.setPsdk_index(psdk_index); return messageSenderService.publishServicesTopic(sn, VoiceEnums.SPEAKER_REPLAY.getMethod(), dto).getResult(); } @Override public int stopVoice(String sn, Integer psdk_index) { SpeakStopDto dto=new SpeakStopDto(); dto.setPsdk_index(psdk_index); return messageSenderService.publishServicesTopic(sn, VoiceEnums.SPEAKER_PLAY_STOP.getMethod(), dto).getResult(); } @Override public int setVoiceMode(String sn, PsdkModelDto dto) { return messageSenderService.publishServicesTopic(sn, VoiceEnums.SPEAKER_PLAY_MODE_SET.getMethod(), dto).getResult(); } @Override public int setVoiceVolume(SpeakVolumeDto dto, String sn) { return messageSenderService.publishServicesTopic(sn, VoiceEnums.SPEAKER_PLAY_VOLUME_SET.getMethod(), dto).getResult(); } @Override public int awayRiver(String sn) { SpeakVoiceStartDto dto = new SpeakVoiceStartDto(); SpeakVoiceFileDto fileDto = new SpeakVoiceFileDto(); fileDto.setUrl("http://dev.jxpskj.com:9000/cloud-bucket/请远离河道07151604"); fileDto.setMd5("d2b448dcba09071834d02f082dc5386f"); fileDto.setFormat(FormatEnum.PCM); fileDto.setName("河道危险"); dto.setPsdk_index(2); dto.setFile(fileDto); return messageSenderService.publishServicesTopic(sn, VoiceEnums.SPEAKER_AUDIO_PLAY_START.getMethod(), dto).getResult(); } public int awayCar(String sn) { SpeakVoiceStartDto dto = new SpeakVoiceStartDto(); SpeakVoiceFileDto fileDto = new SpeakVoiceFileDto(); fileDto.setUrl("http://dev.jxpskj.com:9000/cloud-bucket/录音20240730112507301125"); fileDto.setMd5("b4e738b1c5c97d4fa52f3918bab3f42d"); fileDto.setFormat(FormatEnum.PCM); fileDto.setName("违章停车"); dto.setPsdk_index(2); dto.setFile(fileDto); return messageSenderService.publishServicesTopic(sn, VoiceEnums.SPEAKER_AUDIO_PLAY_START.getMethod(), dto).getResult(); } @Override public PaginationData getVoices(Integer pages,Integer page_size) { // Paging Query Page page = voiceMapper.selectPage( new Page<>(pages,page_size), new LambdaQueryWrapper() ); // Wrap the results of a paging query into a custom paging object. List records = page.getRecords() .stream() .collect(Collectors.toList()); return new PaginationData<>(records, new Pagination(page)); } public String upMinio(File file, String fileName) { String endpoint = pojo.getEndpoint(); String accessKey = pojo.getAccessKey(); String secretKey = pojo.getSecretKey(); String bucketName = pojo.getBucket(); String objectName = "/" + fileName + getNowTimeName(); FileServiceImpl.uploadFile(endpoint, accessKey, secretKey, bucketName, objectName, file, "audio/mpeg"); return endpoint + "/" + bucketName + objectName; } public static String getNowTimeName() { LocalDateTime currentTime = LocalDateTime.now(); // 格式化时间,生成当前时间 return currentTime.format(DateTimeFormatter.ofPattern("MMddHHmm")); } public static double getAudioDuration(File file) throws UnsupportedAudioFileException, IOException { AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file); AudioFormat format = audioInputStream.getFormat(); long audioFileLength = file.length(); int frameSize = format.getFrameSize(); float frameRate = format.getFrameRate(); return Math.round(audioFileLength / (frameSize * frameRate)); } }