Java 8在JBoss EAP 6.4遭遇UnsupportedAudioFileException问题求助
音频转换在JBoss EAP 6.4环境下的UnsupportedAudioFileException问题
问题背景
使用Java 8开发应用,接收Base64格式的.wav音频文件并转换为PCM_SIGNED格式,本地运行正常,但部署到JBoss EAP 6.4时抛出UnsupportedAudioFileException。
错误堆栈信息
java.lang.RuntimeException: Audio processing failed at com.assistt.voicecloneservice.service.AudioConverter.convertBase64ToPcmSigned(AudioConverter.java:42) at com.assistt.voicecloneservice.service.AudioProcessingService.processAndUploadAndInsert(AudioProcessingService.java:35) at com.assistt.voicecloneservice.api.TtsTextCheckService.doPost(TtsTextCheckService.java:57) at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:559) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:854) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:926) at java.lang.Thread.run(Thread.java:750) Caused by: javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1121) at com.assistt.voicecloneservice.service.AudioConverter.convertBase64ToPcmSigned(AudioConverter.java:20) ... 18 more
报错核心代码
public void convertBase64ToPcmSigned(String base64Audio) throws Exception { byte[] audioByte = Base64.getDecoder().decode(base64Audio); try (InputStream inputStream = new ByteArrayInputStream(audioByte); ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { // Get AudioInputStream from the input stream AudioInputStream inputAudioStream = AudioSystem.getAudioInputStream(inputStream); // Define the target audio format AudioFormat sourceFormat = inputAudioStream.getFormat(); AudioFormat targetFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, // PCM_SIGNED format 8000.0f, // Sample rate 16, // Sample size in bits 1, // Channels (Mono) 2, // Frame size 8000.0f, // Frame rate false // Big-endian ); AudioInputStream convertedAudioStream = AudioSystem.getAudioInputStream(targetFormat, inputAudioStream); File outputFile = new File("output.wav"); AudioSystem.write(convertedAudioStream, AudioFileFormat.Type.WAVE, outputFile); } catch (UnsupportedAudioFileException | IOException e) { throw new RuntimeException("Audio processing failed", e); } }
项目依赖(pom.xml)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.assistt</groupId> <artifactId>VoiceCloneService</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.3.1</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20210307</version> </dependency> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency> </dependencies> </project>
源音频文件属性
手动将Base64转换为.wav文件后,文件属性如下:
Encoding : PCM_SIGNED Sample Rate : 40000.0 Hz Sample Size : 16 bits Channels : 1 Frame Size : 2 bytes Frame Rate : 40000.0 frames/second Big Endian : false
尝试的替代方案及问题
尝试先将Base64转换为物理.wav文件再处理,代码如下:
File file = new File(sourceFilePath); InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); if (!inputStream.markSupported()) { return; } AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputStream); AudioFormat sourceFormat = audioInputStream.getFormat(); AudioFormat targetFormat = new AudioFormat( AudioFormat.Encoding.ALAW, 8000, 8, sourceFormat.getChannels(), 1, 8000, false ); AudioInputStream convertedAudioInputStream = AudioSystem.getAudioInputStream(targetFormat, audioInputStream); AudioSystem.write(convertedAudioInputStream, AudioFileFormat.Type.WAVE, new File(destinationFilePath)); inputStream.close(); audioInputStream.close(); convertedAudioInputStream.close();
但在AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputStream);一行仍报错:
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1189) at com.assistt.voicecloneservice.service.AudioConverter.convertBase64ToPcmSigned(AudioConverter.java:34) ...
提问
需要检查哪些要点,或尝试哪些替代方案来解决该问题?在JBoss环境中处理音频文件是否需要特殊配置?
内容的提问来源于stack exchange,提问作者Mustafa
相关产品推荐
相关产品推荐

