首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android java获取wav文件帧

Android java获取wav文件帧
EN

Stack Overflow用户
提问于 2021-05-21 16:42:44
回答 1查看 129关注 0票数 0

我需要从wav文件中获取波形数据,但我的代码返回错误的波形(我将我的结果与fl studio中的波形进行比较)这是我的代码:

代码语言:javascript
运行
复制
path = "/storage/emulated/0/FLM User 
Files/My Samples/808 (16).wav";
waveb = FileUtil.readFile(path);
waveb = waveb.substring((int) (waveb.indexOf("data") + 4), (int)(waveb.length()));
byte[] b = waveb.getBytes();

for(int i= 0; i < (int)(b.length/4); i++) {
        map = new HashMap<>();
        map.put("value", String.valueOf((long)((b[i*4] & 0xFF) + 
            ((b[i*4+1] & 0xFF) << 8))));
        map.put("byte", String.valueOf((long)(b[i*4])));
        l.add(map);
    }
listview1.setAdapter(new 
Listview1Adapter(l));
( (BaseAdapter)listview1.getAdapter()).notifyDataSetChanged();

我的结果:

Fl studio移动结果:

EN

回答 1

Stack Overflow用户

发布于 2021-05-22 06:45:10

我不确定我能帮上什么忙,因为我对此一无所知,但也许这会在您寻找解决方案时引发一些想法。

在我看来,您假设声音文件是16位立体声,小端,并且您只尝试检查立体声帧的一首曲目。你能确认这一点吗?

这个计划至少有一个地方会出错:.wav报头的长度可能是奇数个字节,因此您可能无法正确解析帧边界。作为实验,也许可以尝试在引用b[]数组时添加一个不同的增量?例如bi_4 + 1和bi_4 +2,而不是bi_4和bi_4 +1。这不会解决解析.wav头的一般问题,但它至少可以让您更接近理解这种情况。

看起来Java的AudioInputStream在安卓系统中是无法访问的,而且我所有的搜索都询问是否有与安卓系统相对应的东西,结果都是无人应答。

我用过AudioTrack播放原始的PCM,但我不知道用Android来读wav文件。AudioRecord类和read()方法看起来很有趣,因为read方法将PCM数据存储在一个短数组中,但我从未使用过它们,而且它们似乎是硬编码到麦克风中进行输入的。

曾经有一个谷歌集团: andraudio@googlegroups.com。IDK如果它还在的话。我过去经常去那里,偶尔会问一些事情。

也许你可以使用OboelibGDX中的代码?后者利用OpenAL进行跨平台开发,安卓是目标平台之一。这两个问题我都没有研究过。

如果你真的找到了答案,最好把它作为一个解决方案发布出来。这似乎是许多人试图解决并放弃的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67633737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档