在 Kotlin/Android Studio 中无法将 mp3 转换为 pcm - UnsupportedAudioFileException
Posted
技术标签:
【中文标题】在 Kotlin/Android Studio 中无法将 mp3 转换为 pcm - UnsupportedAudioFileException【英文标题】:Trouble converting mp3 to pcm in Kotlin/Android Studio - UnsupportedAudioFileException 【发布时间】:2021-01-08 06:28:33 【问题描述】:我尝试了以下方法:
mp3-to-wav-conversion-in-java
convert-mp3-to-pcm-in-java
当前实施:
...
var mp3URI = Uri.fromFile(file)
var mp3InputStream = this.contentResolver.openInputStream(mp3URI)
var byteArray = mp3InputStream!!.readBytes()
var pcmBytes = getAudioDataBytes(byteArray, AudioFormat(SAMPLE_RATE_HZ.toFloat(),16,1,true,false))
...
@Throws(UnsupportedAudioFileException::class, IllegalArgumentException::class, Exception::class)
fun getAudioDataBytes(sourceBytes: ByteArray?, audioFormat: AudioFormat?): ByteArray?
require(!(sourceBytes == null || sourceBytes.size == 0 || audioFormat == null)) "Illegal Argument passed to this method"
var bais: ByteArrayInputStream? = null
var baos: ByteArrayOutputStream? = null
var sourceAIS: AudioInputStream? = null
var convert1AIS: AudioInputStream? = null
var convert2AIS: AudioInputStream? = null
return try
bais = ByteArrayInputStream(sourceBytes)
sourceAIS = Audiosystem.getAudioInputStream(bais)
val sourceFormat: AudioFormat = sourceAIS.getFormat()
val convertFormat = AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
sourceFormat.sampleRate,
16,
sourceFormat.channels,
sourceFormat.channels * 2,
sourceFormat.sampleRate,
false
)
convert1AIS = AudioSystem.getAudioInputStream(convertFormat, sourceAIS)
convert2AIS = AudioSystem.getAudioInputStream(audioFormat, convert1AIS)
baos = ByteArrayOutputStream()
val buffer = ByteArray(8192)
while (true)
val readCount: Int = convert2AIS.read(buffer, 0, buffer.size)
if (readCount == -1)
break
baos.write(buffer, 0, readCount)
baos.toByteArray()
catch (uafe: UnsupportedAudioFileException)
//uafe.printStackTrace();
throw uafe
catch (ioe: IOException)
//ioe.printStackTrace();
throw ioe
catch (iae: IllegalArgumentException)
//iae.printStackTrace();
throw iae
catch (e: Exception)
//e.printStackTrace();
throw e
finally
if (baos != null)
try
baos.close()
catch (e: Exception)
if (convert2AIS != null)
try
convert2AIS.close()
catch (e: Exception)
if (convert1AIS != null)
try
convert1AIS.close()
catch (e: Exception)
if (sourceAIS != null)
try
sourceAIS.close()
catch (e: Exception)
if (bais != null)
try
bais.close()
catch (e: Exception)
我尝试过的方法是在该行给我 javax.sound.sampled.UnsupportedAudioFileException
sourceAIS = AudioSystem.getAudioInputStream(bais)
我认为需要将一些 .jar 文件添加到运行时类路径中。我认为将 jar 文件放在 libs 文件夹中并执行 gradle 实现是所需要的,但显然不需要。 .jar 文件应该放在哪里,以便它们位于运行时类路径中?或者,如果您有更简单的方法将 mp3 转换为 pcm 字节,我很乐意听到。
Gradle 依赖项:
dependencies
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation files('libs\\mp3plugin.jar')
implementation files('libs\\net.sourceforge.lame-3.98.4.jar')
implementation files('libs\\tritonus-share-0.3.7-2.jar')
implementation files('libs\\jl-1.0.1.jar')
implementation files('libs\\tritonus_mp3-0.3.6.jar')
implementation files('libs\\mp3spi-1.9.5-2.jar')
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
【问题讨论】:
【参考方案1】:原来 jLayer libraby 有一个转换器,有些人觉得它太慢但对我的目的来说工作正常
var converter = Converter()
converter.convert(mp3File, wavFile)
从那里只需要加载 wav 文件,删除 wav 头并修复 edieness
【讨论】:
以上是关于在 Kotlin/Android Studio 中无法将 mp3 转换为 pcm - UnsupportedAudioFileException的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin Android Studio - setContenView - 绑定(片段)
在 Kotlin/Android Studio 中无法将 mp3 转换为 pcm - UnsupportedAudioFileException
Kotlin / Android Studio - 当电子邮件地址格式错误时,应用程序在注册时崩溃[重复]
Kotlin,Android Studio:我无法让我的程序使用第二个适配器。列表视图