- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用连接到 Arduino(它本身连接到一些 5V 电压表)的计算机来“伪造”一个老式立体声 VU 表。我的目标是让正在播放音频文件的计算机分析信号并通过串行连接将振幅信息发送到 Arudino,以显示在电压表上。
我正在使用 MPD 渲染音频并将其发送到 USB DAC (ODAC)。 MPD 也输出到 FIFO,我使用 Python 脚本读取它。我以 4096 字节 block 的形式从 FIFO 中读取,然后使用 audioop 库将该 block /样本拆分为左右 channel 并计算每个 channel 的最大幅度。
这就是问题所在 - 我被数据淹没了。我猜我的数学有误,或者我不明白 FIFO 是如何工作的(或者两者都有)。 MPD 以 44100:16:2 格式输出所有内容——我认为这意味着它将每秒写出 44,100 个 4 字节样本。因此,如果我正在抓取 4096 字节的 block ,我应该期望每秒大约 43 个 block 。但我得到的远不止于此(超过 100 个),而且如果我增加 block 大小,我每秒获得的 block 数也不会改变。例如,如果我将 block 大小加倍到 8192,我仍然可以每秒获得大致相同的 block 数。很明显我做错了什么,但我不知道那是什么。有人有什么想法吗?
这是我的 mpd.conf 文件的相关部分:
audio_output {
type "fifo"
name "my_fifo"
path "/tmp/mpd.fifo"
format "44100:16:2"
}
这是 Python 脚本:
import os
import audioop
import time
import errno
import math
#Open the FIFO that MPD has created for us
#This represents the sample (44100:16:2) that MPD is currently "playing"
fifo = os.open('/tmp/mpd.fifo', os.O_RDONLY)
while 1:
try:
rawStream = os.read(fifo, 4096)
except OSError as err:
if err.errno == errno.EAGAIN or err.errno == errno.EWOULDBLOCK:
rawStream = None
else:
raise
if rawStream:
leftChannel = audioop.tomono(rawStream, 2, 1, 0)
rightChannel = audioop.tomono(rawStream, 2, 0, 1)
stereoPeak = audioop.max(rawStream, 2)
leftPeak = audioop.max(leftChannel, 2)
rightPeak = audioop.max(rightChannel, 2)
leftDB = 20 * math.log10(leftPeak) -74
rightDB = 20 * math.log10(rightPeak) -74
print(rightPeak, leftPeak, rightDB, leftDB)
最佳答案
回答我自己的问题。事实证明,无论我指定应读取多少字节,os.read() 都会返回 2048 字节。这意味着 os.read() 采用的第二个参数是它将读取的最大 字节数——但不能保证实际上 有那么多字节读。我原以为在打开 FIFO 时省略 NONBLOCK 选项,os.read() 调用将一直等待,直到它收到文件结尾或指定的字节数。但事实并非如此。为了解决这个问题,我的代码现在检查 os.read() 返回的字节字符串的长度 - 如果该长度小于我指定的 block 大小 - 将等待获取下一个 block 然后连接所有 block 放在一起,以便在继续处理数据之前,我的 block 大小与我的目标相匹配。
关于python - MPD、FIFO、Python、Audioop、Arduino 和电压表 : "Faking" a VU Meter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21762412/
我在尝试从单独的项目中引用 mscorlib fake DLL 时遇到问题,如下所述。 我有许多 VS12 解决方案,我正在使用 MS Fakes 为其编写单元测试。根据以下 URL 中的建议,我决定
我在使用 Microsoft fakes 的解决方案中有一个单元测试项目,当我构建它时出现以下错误。它提示无法加载的 DLL 在磁盘上。我已经打开了 Fusion 日志记录,这表明绑定(bind)成功
是否可以设置一个 Target,在 Build Target 完成后在远程创建并推送一个 git 标签? 感谢您的帮助。 最佳答案 我使用了以下似乎有效的方法 Target "TagBuild" (f
我已经使用 Django 大约 2 年了,有一个功能我一直害怕使用:伪造迁移 . 我几乎到处都看过,我能得到的最多信息来自 documentation它指出: --假 Tells Django to
我将在我的单元测试中使用 Microsoft.Fakes。我读了一个tutorial Microsoft.Fakes 在其中为接口(interface)创建了一个 stub (在解决方案中实现),但在
我使用 VS 2015 U1。 我使用带有奇怪版本控制的外部库 - 1.0.4056.40164 . 我为这个库添加了一个 .Fakes 文件。当构建 fakes 程序集时,我收到以下警告: C:\S
单元测试项目 Up.UnitTests 在构建期间失败,并出现此构建错误 错误 CS0430:未在/reference 选项中指定外部别名“snh”错误 CS0234:命名空间“snh”中不存在类型或
有没有一种简单的方法可以让我使用 FAKE 获取正在执行的 .fsx 文件的路径? Powershell 和 (psake) 的使用性质和 MSBUILD 提供了此功能,但作为 FAKE/F# 菜鸟,
因此,在我正在构建的光线追踪器中,我已经获得了适用于球体的折射以及焦散效果,但是玻璃球看起来并不是特别好。我相信折射数学是正确的,因为光线似乎在以您期望的方式反转时弯曲,但它看起来不像玻璃,它只是看起
在VS中,通常在Build(增量式)和Rebuild之间进行区分,后者将先进行清理,然后再执行与Build相同的操作。我可以使用FAKE提供类似的行为吗? 让我们假设以下目标: Target "Cle
作为解决方法,我需要更改某个 Java 程序的系统时钟,而不触及代码才能获取: calendar.getinstance().get(calendar.year) = 2013 是否可以仅通过启动配置
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
当类库引用 Visual Studio 2013 下针对 .Net 4.5 和 Silverlight 5 的 PCL(可移植类库)时,我无法为类库 (.NET 4.5) 生成 Microsoft F
我正在尝试使用 FAKE 来构建位于多个子目录中的 F# 文件。 filesInDirMatching来自 FAKE。 #r @"packages/FAKE/tools/FakeLib.dll" op
这与我提出的最后几个问题无关。 我需要从 IP 网络摄像头 (SNC-RZ25N) 获取视频到 Flash Media Server。我宁愿不必使用 Windows,但如果它使事情变得更容易,我会的。
在 FAKE你通常有一个像这样的构建脚本: // "foo.fsx" #r @"./packages/tools/FAKE/tools/FakeLib.dll" open Fake Target "F
Django迁移中的--fake-initial和--fake有什么区别?使用假迁移有什么危险?有人知道吗非常感谢大家。 我正在使用Django 1.10 最佳答案 好吧,文档对此很清楚 --fake
我正在为一个项目构建一个模板,它目前没有构建服务器端。我需要测试我的表单和验证,并想要“伪造”表单提交。 我正在尝试这个: $("#save").click(function(e) { e.pre
考虑以下因素: #r @"FakeLib.dll" open Fake open Fake.StringHelper open Fake.ProcessHelper Shell.Exec("mkdir
我是一名优秀的程序员,十分优秀!