首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Kotlin/Android Studio - UnsupportedAudioFileException中将mp3转换为pcm时出现问题

在Kotlin/Android Studio中,当尝试将MP3文件转换为PCM文件时,可能会遇到UnsupportedAudioFileException异常。这个异常表示不支持的音频文件格式。MP3是一种有损压缩的音频格式,而PCM是一种无损音频格式,因此需要进行转换。

要解决这个问题,可以使用Android内置的MediaCodec类来进行音频解码和编码。下面是一种可能的解决方案:

  1. 首先,确保在Android Studio中引入了正确的依赖项,以便使用MediaCodec类。可以在项目的build.gradle文件中添加以下依赖项:
代码语言:txt
复制
dependencies {
    implementation 'com.android.support:appcompat-v7:版本号'
    implementation 'com.android.support:mediarouter-v7:版本号'
}
  1. 创建一个音频转换的函数,接受MP3文件路径作为输入参数,并返回PCM文件路径。函数的实现如下:
代码语言:txt
复制
import android.media.MediaCodec
import android.media.MediaExtractor
import android.media.MediaFormat
import java.io.File
import java.io.FileOutputStream
import java.nio.ByteBuffer

fun convertMp3ToPcm(mp3FilePath: String): String {
    val pcmFilePath = mp3FilePath.replace(".mp3", ".pcm")
    val mediaExtractor = MediaExtractor()
    mediaExtractor.setDataSource(mp3FilePath)
    val trackIndex = selectTrack(mediaExtractor)
    mediaExtractor.selectTrack(trackIndex)
    val mediaFormat = mediaExtractor.getTrackFormat(trackIndex)
    val mediaCodec = MediaCodec.createDecoderByType(mediaFormat.getString(MediaFormat.KEY_MIME))
    mediaCodec.configure(mediaFormat, null, null, 0)
    mediaCodec.start()

    val outputFile = File(pcmFilePath)
    val outputStream = FileOutputStream(outputFile)
    val bufferInfo = MediaCodec.BufferInfo()
    val timeoutUs: Long = 10000
    var isEOS = false

    while (!isEOS) {
        val inputBufferIndex = mediaCodec.dequeueInputBuffer(timeoutUs)
        if (inputBufferIndex >= 0) {
            val inputBuffer = mediaCodec.getInputBuffer(inputBufferIndex)
            val sampleSize = mediaExtractor.readSampleData(inputBuffer!!, 0)
            if (sampleSize < 0) {
                mediaCodec.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM)
                isEOS = true
            } else {
                mediaCodec.queueInputBuffer(inputBufferIndex, 0, sampleSize, mediaExtractor.sampleTime, 0)
                mediaExtractor.advance()
            }
        }

        val outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, timeoutUs)
        if (outputBufferIndex >= 0) {
            val outputBuffer = mediaCodec.getOutputBuffer(outputBufferIndex)
            val chunk = ByteArray(bufferInfo.size)
            outputBuffer!!.get(chunk)
            outputBuffer.clear()
            outputStream.write(chunk)
            mediaCodec.releaseOutputBuffer(outputBufferIndex, false)
        }

        if (bufferInfo.flags and MediaCodec.BUFFER_FLAG_END_OF_STREAM != 0) {
            isEOS = true
        }
    }

    mediaCodec.stop()
    mediaCodec.release()
    mediaExtractor.release()
    outputStream.close()

    return pcmFilePath
}

private fun selectTrack(extractor: MediaExtractor): Int {
    val numTracks = extractor.trackCount
    for (i in 0 until numTracks) {
        val format = extractor.getTrackFormat(i)
        val mime = format.getString(MediaFormat.KEY_MIME)
        if (mime?.startsWith("audio/") == true) {
            return i
        }
    }
    return -1
}
  1. 调用上述函数来进行MP3到PCM的转换。示例代码如下:
代码语言:txt
复制
val mp3FilePath = "path/to/input.mp3"
val pcmFilePath = convertMp3ToPcm(mp3FilePath)

这样,你就可以将MP3文件转换为PCM文件了。请注意,这只是一种解决方案,具体的实现可能因项目需求而有所不同。另外,如果需要使用腾讯云相关产品来处理音频文件,可以参考腾讯云音视频处理服务(MPS):https://cloud.tencent.com/product/mps

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

多媒体-iOS与Android的音频文件互通

前言 实际的开发中,关于音频的传输上,iOS与Android的通用性一直是一个不可回避的问题。下面记录下比较好的解决方案。 ---- 现状 苹果的音频格式安卓全不支持。...安卓的音频格式,苹果基本也不支持 解决方案 安卓和iOS方面都把音频格式转化为 .mp3格式 对于这个解决方法一定要提醒一下,不是把文件的格式名称修改为 .mp3 就OK的,一定要是 mp3点编码格式...而文件的格式后缀是 .mp3,结果iOS这边一直无法播放,而且打开把该文件服务器上的路径粘到浏览器中也是无法识别和播放的。 .amr 格式的苹果这边也是无法播放的。...两边都使用 libmp3lame 进行编码不会出现问题,也有些同学反应 安卓那边无法把pcm 格式的音频文件转化为 mp3 格式的,我只想说可以使用 libmp3lame 试试,网上能找到资源 ?...wav格式进行保存,所有只要 iOS端 Wav文件 amr 格式给安卓使用,把安卓的amr 文件转化为 wav格式 给自己使用即可解决iOS与Android的音频文件互通问题。

3.1K20
  • Android开发笔记(一百八十九)利用LAME录制MP3音频

    若想让录音文件放之四海而皆能播放,就得事先将其转为通用的MP3格式,虽然Android官方的开发包不支持MP3换,不过借助第三方的LAME库,能够将原始音频转存为MP3文件。...不过要想让App真正实现MP3码功能,还得代码中调用LameUtil类的初始化、转码、写入、关闭等方法。...MP3的转换过程又有两种形式,一种是把PCM文件转成MP3文件,另一种是录音将原始数据直接转存为MP3文件,也就是边录边。...由于PCM保存着原始音频数据,该格式的文件较大,一次性转成MP3较费时间,因此通常采取边录边以便提高转换效率。...具体而言,则需构建录音线程,在其构造方法中初始化LAME;然后开启录音线程,同时启动MP3码线程,录音线程由AudioRecord获得原始音频数据,马上转交给MP3码线程处理;录音结束,也给MP3

    1.6K10

    Android录音mp3格式实例详解

    Android录音支持的格式有amr、aac,但这两种音频格式跨平台上表现并不好。 MP3显然才是跨平台的最佳选择。...如何最终生成MP3 实现MP3格式最好是借助Lame这个成熟的解决方案。 对于Android来说,需要借助JNI来调用Lame的C语言代码,实现音频格式的转化。 2....如何进行转换 网上有代码是先录制后转为MP3,这种效率比较低。因为如果录音时间过长,转换时间就会相应变长,用户存储录音需要等待的时间就会变长。...我们需要的是边录边的实现方式,这样停止录音进行存储的时候,就不会花费太长时间。...上面提到过,我们想要实现的是边录边。那么问题来了,如果我们读取完数据后接着将数据传给Lame进行MP3编码,Lame的编码时间是不确定的,是不是有可能造成数据的丢失呢?

    2.2K20

    Kotlin Android Extensions 的未来计划

    进行 Android 开发带来了两项新的便利功能: Synthetic 视图 : 您可以将调用 findViewById 替换为使用 kotlinx.android.synthetic 进行 UI 交互...但是,注解包将更改为 kotlinx.parcelize,并且模块级 Gradle 文件中,您需要开始使用独立的 kotlin-parcelize 插件而非 android-kotlin-extensions...您可以 Android 开发者官方网站 上找到有关 Parcelize 的文档。...弃用期随着 Kotlin 1.4.20 的发布正式开始。android-kotlin-extensions 将继续保留至少一年间,但在 2021 年 9 月或之后的 Kotlin 版本中将被移除。...长期来看,我们将继续保留 kotlin-parcelize 插件,您也可以继续 Android Studio 问题追踪器 中提交有关 Parcelize 的问题。

    84930

    Android Studio3.0新特性及安装图文教程

    (2).Kotlin语言 Android Studio 3.0包括对Kotlin语言的支持。...通过将Java文件转换为Kotlin(点击代码 将Java文件转换为Kotlin文件),或者使用新建项目向导创建一个新的启用Kotlin的项目,可以将Kotlin整合到项目中。...(9).Android的新模板 Android Studio 3.0“新建项目”和“新建模块”向导中包含一组新的模板,因此您可以开始使用Android Things开发物联网设备。...,可以更轻松地调试应用程序布局的问题,包括将属性分类为常见类别,并在“查看树”和“属性”面板中将新的搜索功能分组。...下载完一系列的资源后,开启也许回弹出下面这个框: ? 直接点击Cancel就好了,不用设置代理端口。 这样基本上就顺利安装了。 附加:如果安装完成后打开以前的项目,有可能会出现下面这情况: ?

    4.2K00

    Android音频编辑之音频转换PCM与WAV

    前言 本篇开始讲解Android平台上进行的音频编辑开发,首先需要对音频相关概念有基础的认识。所以本篇要讲解以下内容: 1. 常用音频格式简介 2. WAV和PCM的区别和联系 3....常用音频格式简介 Android平台上进行音频开发,首先需要对常用的音频格式有个大致的了解。...Android平台上,常用的音频格式有: WAV WAV格式是微软公司开发的一种声音文件格式,也叫波形声音文件,是最早的数字音频格式,被Windows平台及其应用程序广泛支持。...WAV和PCM的区别和联系 Android平台上要进行音频编辑操作(比如裁剪,插入,合成等),通常都是需要将音频文件解码为WAV格式的音频文件或者PCM文件。...因此,基于PCM编码的WAV被作为了一种中介的格式,常常使用在其他编码的相互转换之中,例如MP3换成WMA。

    6K30

    浅谈Android Studio3.6 更新功能

    现在,XML或设计工具的颜色选择器中,Android Studio会在您的应用程序中填充颜色资源,以便您快速选择和替换颜色资源值。 ?...Native 工具 以下更新支持Android Studio中的Native(C / C ++)开发 扩展的Kotlin支持,包括改进的错误检查和Kotlin JNI声明与其C / C ++实现之间的导航...Memory Profiler泄露检测 现在,Memory Profiler中分析堆,您可以过滤Android Studio认为可能指示应用程序中Activity和Fragment实例的内存泄漏的概要分析数据...要使用此功能,请先捕获堆储或将堆储文件导入Android Studio。...附加仅Kotlin的外部APK源 现在,当您分析和调试预建的APK,可以附加仅Kotlin的外部APK源。

    1.3K30

    Kotlin | 使用Kotlin改造Android Gradle

    Gradle5.0+已经支持了Kotlin,但碍于Android Studio目前适配并不是很好,所以并不建议开发使用,至于为什么,文章末尾也给出了具体原因。 为什么要使用Kotlin改造?...Gradle采用groovy采用开发语言,是一种动态的dsl语言,缺点就是写脚本如果出现问题,我们无法实时的得知,只能通过print进行得知,而且无法跳转,并且不支持自动补全。...改造很简单,在你的gradle后面加上kts即可,然后as会自动识别,接着再修改一堆报错,这个过程很麻烦,目前Android Studio支持并不是很好 app的gradle plugins {...id("com.android.application") id("kotlin-android") id("kotlin-android-extensions") } android...StudioKotlin-Gradle支持的并不是很好,所以如果你新建一个model,就会再次新创建gradle配置文件,这样你就得再次手动配置,很麻烦,所以目前Kotlin-Gradle尝鲜即可。

    92820

    Google 再见 Java

    (此时项目依然使用 Java) 使用 Kotlin 编写新代码 将现有代码更新为 Kotlin 代码 将现有代码更新为 Kotlin 代码,可以直接使用 Android Studio 提供的 Java... Kotlin 工具,只需要在菜单中选择 “Code → Convert Java File to Kotlin File” 即可: ?...Java Kotlin 工具 另外,Kotlin 的迁移工作没必要一蹴而就,开发者可以按照自己的进度来逐步进行迁移。...△ Android Studio 的 Lint 检查中也可以打开 Kotlin 互操作检查 Kotlin 中调用 Java ,有几点需要注意 1、将代码标记为 @Nullable 和 @NotNull...Android Studio 技术负责人 Jeffrey van Gogh 就曾讲过,Java 与 Kotlin 具有极高的互操作性,所以两者完全可以共存于同一个项目中。

    62710

    Android Studio 3.2 都有哪些更新?这些关键点不要错过

    Kotlin 更新 - Android Studio 3.2 捆绑了 Kotlin 1.2.61,支持 Kotlin 友好的 Android 9 Pie SDK。...Desugaring允许您通过构建过程中将新字节码和语言 API 替换为旧版,从而在较旧的设备上使用这些特性。...Profiler Sessions - 现在我们能够自动将监测器数据保存为 “会话” 以便之后打开 Android Studio 再次访问和查看。...我们还新增了导入和导出 CPU 记录和堆储的功能,以便之后用其他工具分析或查看。 自动 CPU 记录 - 现在您可以使用调试 API 自动记录 CPU 活动。...类似地,现在您还可以通过您的运行配置里启用 “启动开始记录方法跟踪” 选项,应用启动自动开始记录 CPU 活动。

    2K20

    Android 音频】“声音”从何而来

    根据奈奎斯特的理论,只有采样频率高于声音信号最高频率的两倍,才能把数字信号表示的声音还原成为原来的声音,所以音频文件的采样率一般 40~50KHZ,比如最常见的 CD 音质采样率 44.1KHZ。...PCM 数据是最原始的音频数据完全无损,所以 PCM 数据虽然音质优秀但体积庞大,为了解决这个问题先后诞生了一系列的音频格式,这些音频格式运用不同的方法对音频数据进行压缩,其中有无损压缩(ALAC、APE...、FLAC)和有损压缩(MP3、AAC、OGG、WMA)两种。...源码中进行编译的工程才可以获取系统签名权限 会截走扬声器和耳机的声音,也就是说录音本地无法播放声音 3、Hook 内录 通过以下 Android 的音频系统架构图可以看出,Android 提供的唯二接口...Studio ,打开工程导入 FMOD for Unity 如果只是测试,可以直接使用 FMOD Studio 自带的样例的 bank 文件,FMOD Unity 里面的配置也比较简单,如下动图所示

    2.2K40

    我的播放器0---音视频基础

    MPEG-4中定义的一种格式 常用编码格式 视频:H264(AVC Part10) , wmv, XviD(Part2), mjpeg(每一帧都是独立的,都是I帧) 音频:aac(有损压缩), MP3...(有损), ape(无损), flac(无损) 音视频解封装和解码原理分析 [image.png] 像素格式 YUV比RGB更省空间 由于GPU擅长浮点运算, 所以YUVRGB可以用openGL的shader...做,性能好 [image.png] 3*3 RGB图像存放方式 [image.png] 如果视频宽度不是4或者8的倍数,程序为了运算效率,会自动补齐,所以拷贝要一行行拷贝,根据图像时间宽度。...PCM音频参数 采样率 sample_rate 44100 (CD) 通道 channels (左右声道) 样本大小(格式) sample_size enum AVSampleFormat {...studio SDK目录 [image.png] windows获取当前毫秒时间戳 [image.png] 设置解码线程数 骁龙835 硬解码 FPS 120帧 骁龙835 软解码 1线程 neon

    1.2K40

    Android录制mp3格式文件

    前言 最近做一个即时通信类的项目,由于要保证pc端,iOS端和Android端的通用性,最终统一为MP3格式,一直担心MP3格式会不会很大,但是实测还是可以接受的。...下面来看看具体步骤: 工具 MP3格式是用一个开源项目的,MP3lame,由于该项目用到了jni,所以需要大家配置好ndk环境,环境配置在此就不多说了,大家可以自行百度,最新的应该很好配置。...创建Android.mk jni中创建文件,Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LAME_LIBMP3_DIR...左进,PCM右进,MP3输出) */ public native static int encode(short[] buffer_l, short[] buffer_r, int samples, byte...总结 之前一直用MediaRecorder录音,发现录出来的只能是amr、acc等格式,用lameMP3感觉是不可行的。

    90140

    Android Studio和Gradle使用不同位置JDK的问题解决

    使用不同的JDK位置可能会导致Gradle产生多个守护进程,首先Android Studio默认下使用的下载自带的jre,这种jre的功能显然达不到jdk的标准,这会使得开发可能产生不兼容的问题,当然也可以选择忽略这个警告...,但是将来也可能出现问题。...和Kotlin语言(PS:Kotlin是一种 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源)),所以应该电脑里提前就下好了...JAVA,自然也就有JDK因此不会让Android Studio自带JAVA的JDK了。...到此这篇关于Android Studio和Gradle使用不同位置JDK的问题解决的文章就介绍到这了,更多相关Android Studio Gradle JDK位置内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持

    3.7K10

    Kotlin开发指南

    Kotlin可以 100%等价替换Java代码,Android Studio 提供了一键把Java代码转义为Kotlin的能力。...kotlin 和 java 有一个重要的不同就是函数式编程。函数式编程的思想中函数是一等公民,使用 kotlin 我们要多利用这种思维来思考问题。...2、配置成本低         Android Studio 3.0及其以版本上已经直接集成kotlin,无需再安装插件。只需工程中配置kotlin依赖包。..."             } 3、学习成本低:快速上手指引 InsertPic_(07-26(07-28-14-43-13).png     Android studio中提供了快速将java转换为...是对属性自带set,get方法的,换为kotlin后会被转换成这样 InsertPic_D27D(0(07-28-14-43-13).png 如果实现接口的类中,之前有个成员变量也是title InsertPic

    2.2K40

    开始迁移到 Kotlin | Kotlin 迁移指南 (中篇)

    所以当我们宣布将 Kotlin 做为 Android 开发的首选语言,我们也会确保开发者尽享 Kotlin 强大功能的同时,也不会遇到兼容性和迁移方面的困扰,这里我们给出一些将您的项目迁移至 Kotlin...Java) 使用 Kotlin 编写新代码 将现有代码更新为 Kotlin 代码 将现有代码更新为 Kotlin 代码Android Studio 提供了 Java Kotlin 的工具,只需要在菜单中选择...△ Android Studio 的 Lint 检查中也可以打开 Kotlin 互操作检查 Kotlin 中调用 Java ,有几点需要注意: 请将代码标记为 @Nullable 和 @NotNull...您可以直接在浏览器里做练习,也可以通过插件 IntelliJ IDEA 或者 Android Studio 里练习。...如果您对 Android 开发中使用 Kotlin 有任何疑问或者想法,欢迎评论区和我们分享。

    26710
    领券