环境

Android Studio Bumblebee, Mac mini 2014

问题描述

需要实现功能为:将 MP3 转成 PCM 并通过 UDP 传出去。

任务可分解为:

  1. 将 MP3 转成 PCM
  2. 将 PCM 通过 AudioTrack 播放以确保转换的 PCM 文件正常
  3. 将 PCM 通过 UDP 传出去。

问题分析

注:写文章引用来源一直力求引用原创,但下面很多引文没找到原创文献

1 将 MP3 转成 PCM

面向搜索引擎编程,Java 直接有转换用的 API: AudioSystem。转换方式参照 CSDN 博文。

这里有点要说明,如果直接使用,会提示找不到 javax.sound.sampled.AudioSystem, 原因是 Android 自带的包覆盖掉了 JRE 里面的文件。

解决方法是将 JRE 中包添加到 Android 醒目的 ‘build.gradle’ 的依赖里面。-- 此处博文忘记引文地址了。

implementation files('/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/rt.jar')

问题是,我使用AudioSystem.write() 转换数据,总是提示 could not write audio file: file type not supported, 问题可能是 输出文件的 AudioFomat 设置有问题,但尝试了许久,没找到问题点。

不能总吊在一棵树上。此计不通,立马考虑其他方法。直接在外面将 MP3 转成 PCM。在网站即时工具箱 中将 MP3 转成 PCM. 该页面有很简单的转换设置项。转换后出来的文件,使用 AudioTrack 播放,出来的是滋滋滋的声音,网上是说可能是大小端的问题。但网页转换没有这个设置项,没法验证。办法二宣告失败。

网上另一种途径是使用 FFMPEG 将 MP3 转换成 PCM。把我树莓派搬出来。参考博文mp3文件转pcm文件,生成了 单通道-8k采样率 的 PCM 文件。但使用 ffplay 播放时报错 ‘could not initialize sdl - displayindex must be in the range 0 - -1。首先安装 SDL。安装完成后,播放 PCM 仍旧有相同报错。貌似调试 SDL 也得大费周章。

2 使用 AudioTrack 播放以验证 PCM 正常

鉴于调试 SDL 也是不小的工程,遂停止使用 SDL 播放的尝试,直接在 Android 里面使用 AudioTrack 播放,正常,谢天谢地。

AudioTrack udioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_DEFAULT,AudioFormat.ENCODING_PCM_16BIT, 15000, AudioTrack.MODE_STREAM);binding.play.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new Thread(new Runnable() {@Overridepublic void run() {pcmAudioTrack.play();InputStream inputStream = null;byte[] data = new byte[5000];AssetManager assetManager = getAssets();try {inputStream = assetManager.open("dujia.pcm");int length = 0;while((length = inputStream.read(data))!= -1) {pcmAudioTrack.write(data, 0, length);SystemClock.sleep(100);}pcmAudioTrack.stop();inputStream.close();} catch (IOException e) {e.printStackTrace();}}}).start();}});

3 将 PCM 通过 UDP 传出去

这里是与上一步类似,将 PCM 文件以流的方式读入并按照接收端定义的格式打包后通过 UDP 传出去。具体过程非重点,略过不表。

这里要强调两点:

  • 为查看下通过 UDP 发出的包是否正确,需要比对下 PCM 二进制数据。在 Mac 系统中,可以在终端中使用 xxd 命令打开 PCM 文件。具体使用方式参见博文Linux xxd命令详解_angelasp的博客-CSDN博客_linux xxd.

  • 在获取连接到本机 WIFI 热点的设备 IP 时,使用方法参见博文Android获取实时连接热点的设备IP。代码如下:

public static ArrayList<String> getConnectedIP() {ArrayList<String> connectedIP = new ArrayList<>();try {BufferedReader bufferedReader = new BufferedReader(new FileReader("/proc/net/arp"));String line = bufferedReader.readLine();while ((line = bufferedReader.readLine()) != null) {String[] splitted = line.split(" +");if (splitted.length >= 4) {String ip = splitted[0];connectedIP.add(ip);}}} catch (Exception e) {e.printStackTrace();}return connectedIP;
}

需要注意两点:一是在 Android 10 及以上手机中可能提示没有权限,换低版本系统手机即可。二是在 Android Studio 终端 或者 Mac 终端 使用同样命令获取到设备IP:

adb shell
cat /proc/net/arp

将 MP3 转成 PCM 并使用 AudioTrack 播放相关推荐

  1. Android 音视频开发(一) -- 使用AudioRecord 录制PCM(录音);AudioTrack播放音频

    前言,音视频这块,确实比较难入门,本着学习的态度,我这边也跟着 Android 音视频开发入门指南 打怪升级,留下个脚印,大家共勉. 音视频 系列文章 Android 音视频开发(一) – 使用Aud ...

  2. 音视频开发系列(28)AudioTrack播放PCM音频

    目录 AudioTrack和MediaPlayer AudioTrack的API介绍(构造.操作.状态机) 具体实现(Static和Stream两种模式) 遇到的问题 收获 一.MediaPlayer ...

  3. Android编程中利用AudioTrack播放PCM数据在音频的最后出现重复回声现象的解决方案

    1 问题描述 今天在进行Android编程时遇到一个很奇怪的问题  重点说一下 这里我的测试机用的是"小米Note"  的确不怎么样 我在"华为P8"上面测试就 ...

  4. NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM(方法签名,CallXXXMethod)

    NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM 题目有点复杂,不过确实就是那么回事.这章想记录的内容比较多,先列出来: native static 与 nat ...

  5. 随笔(十) mp3格式转pcm格式并调用百度语音识别

    前言: 近期做帮做毕业设计,需求里面要做语音识别,识别出用户朗读的文章,将识别出来的字符串返回给用户查看.这个想到的就只有百度开放平台的api了. 思路: ① 前往百度开放平台拿到APP_ID,API ...

  6. 【Java】java转换可播放的QQ/微信高质量语音格式,mp3/wav转silk格式(高质量音频),mp3转换amr格式(低质量音频),mp3/wav转pcm(非语音格式)

    1.简要 参考各个博主,发现java里mp3转silk的案例真的少,几乎没有,有的都是基于 linux系统的,所以自己研究了下就有了以下代码 tips:mp3转换silk格式,需要先转换成pcm再转换 ...

  7. FFmpeg学习之MP3文件转PCM文件

    1.基本原理说明 本文采用FFMpeg编码库,将Mp3文件转换成Pcm文件,具体的API知识点整理在后面给出. FFmpeg作为常用的编解码库,其有着广泛的用途.现在主要介绍下FFmpeg的各个插件库 ...

  8. Java Mp3转化WAV/PCM音频数据,解码详细解析,提取每一帧数据集合/比特流/播放,一行代码!

    导言 大家好!我是原子君 1.因为Java本身只支持,wav,缺少mp3的解码器,所以Java自带的无法对mp3进行处理,这种MPEG-*音频有损压缩标准编码,更不要说使用Java的音频格式和音频流就 ...

  9. AudioTrack播放PCM音频

    一.前言 说到在 Android 平台上播放音频,我们最先想到的是 MediaPlayer.系统 API 对其做了比较全面的封装,开发者用少量的代码就能实现播放功能.MediaPlayer 可以播放多 ...

最新文章

  1. 不要再满屏写 try...catch 了!这个更香!
  2. python3 isinstance 类型判断函数
  3. Bootstrap常用类
  4. 正弦定理和余弦定理_苏州市高一数学(正弦定理与余弦定理)线上教育学案
  5. 老人与海好词100英文带翻译_《老人与海》经典语录(英文+译文)
  6. Mac下安装event库
  7. [css] css3的:nth-child和:nth-of-type的区别是什么?
  8. import sys; print“%s.%s.%s”% sys.version_info[ :3];
  9. linux ftp命令参数全集
  10. jpython 传入参数_C++嵌入Python程序(二):参数传入及返回
  11. 当下最实用计算机编程语言,目前最流行的计算机编程语言是什么?
  12. Red5流服务器搭建(实现在线直播,流媒体视频播放和在线视频会议)
  13. 关于yum repo-pkgs命令使用测试
  14. 计算机发展史上代表性的人物,计算机发展史最具影响力人物
  15. vlog用什么来剪辑?分享1个剪辑生活vlog的技巧
  16. MySQL数据库灵魂拷问
  17. 冶化工业计算机模拟仿真工作,工业仿真,工业三维虚拟仿真技术平台 - 【中视典数字科技】...
  18. [获取手机信息]-通过 ADB 命令获取手机信息
  19. Django项目实战——7—(openid是否绑定用户的处理、用户基本信息渲染、添加和验证邮箱)
  20. 手淘流量是什么意思?手淘搜索流量怎么增加?

热门文章

  1. php根据URL获得网页内容
  2. TwinCAT3库文件制作
  3. Elasticsearch外网无法通过ip访问
  4. 支付宝电脑网页支付接口的调用
  5. 51、PIC、AVR、16、32-BIT系列单片机区别与特点
  6. java面向对象基础练习1(坐标点移动)
  7. windows7隐藏桌面计算机,win7小技巧之隐藏桌面图标
  8. 忍者必须死代码 免费
  9. java解析word批注
  10. mongdb 下载慢,解决