在 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:我无法让我的程序使用第二个适配器。列表视图

Kotlin Android Studio - 从newsapi加载缩略图

Java 11 , Kotlin , Android Studio, TypeScript 重要更新来了