python - 将二进制编码为音频 python 或 C

标签 python c audio binary

使用 C 或 python(首选 python),如何将二进制文件编码为音频,然后通过耳机插孔输出音频,以及如何使用来自麦克风插孔的输入将音频解码回二进制,到目前为止我已经学习了如何使用 python 将文本文件转换为二进制文件,这类似于 RTTY 通信。

这样我就可以将数据记录到盒式磁带上。

import binascii

a = open('/Users/kyle/Desktop/untitled folder/unix commands.txt', 'r')
f = open('/Users/kyle/Desktop/file_test.txt', 'w')
c = a.read()
b = bin(int(binascii.hexlify(c), 16))
f.write(b)
f.close()

最佳答案

从你的评论来看,你想对二进制数据进行一点一点的处理,将每一位变成高音或低音。

您仍然需要确定这些高音和低音到底是什么,每个声音持续多长时间(以及两者之间是否有间隙,等等)。如果你让它变慢,比如每个声音 1/4 秒,那么你就把它们当作音符。如果你让它变得非常快,比如 1/44100 秒,你就把它们当作样本。人耳在一秒钟内无法听到44100种不同的声音;相反,它会听到高达 22050Hz 的单一声音。

做出这些决定后,您的问题分为两个部分。

首先,您必须生成样本流 - 例如,每秒 44100 个 16 位整数的流。对于非常简单的事情,例如以 44k 16 位单声道格式播放一大块原始 PCM 文件,或生成方波,这是微不足道的。对于更复杂的情况,例如播放一段 MP3 文件或从正弦波和滤波器中合成声音,您需要一些帮助。 audioop模块和 stdlib 中的其他一些模块,可以为您提供基础知识;除此之外,您还需要在 PyPI 中搜索合适的模块。

其次,您必须将该样本流发送到耳机插孔。在 Python 中没有对此的内置支持。在某些平台上,您只需打开一个特殊文件并写入即可完成此操作。但是,更一般地说,您需要在 PyPI 上找到第三方库。

较简单的模块适用于一种特定类型的音频系统。 Mac 和 Windows 都有自己的标准,而 Linux 有六种不同的标准。还有一些 Python 模块可以与更高级别的包装器对话;您可能必须安装和设置包装器,但是一旦您这样做了,您的代码就可以在任何系统上运行。


那么,让我们来看一个非常简单的示例。假设您已经在您的系统上设置了 PortAudio,并且您已经安装了 PyAudio与它交谈。此代码将播放 441Hz 和 220.5Hz 的方波(略高于中 C 和低 C)不到 1/4 秒(只是因为这真的很容易)。

import binascii

a = open('/Users/kyle/Desktop/untitled folder/unix commands.txt', 'r')
c = a.read()
b = bin(int(binascii.hexlify(c), 16))

sample_stream = []
high_note = (b'\xFF'*100 + b'\0'*100) * 50
low_note = (b'\xFF'*50 + b'\0'*50) * 100
for bit in b[2:]:
    if bit == '1':
        sample_stream.extend(high_note)
    else:
        sample_stream.extend(low_note)

sample_buffer = b''.join(sample_stream)

p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(8),
                channels=1,
                rate=44100,
                output=True)
stream.write(sample_buffer)

关于python - 将二进制编码为音频 python 或 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16930271/

相关文章:

python - 根据groupby条件从数据框中删除值

python - 导入的 python 模块中的依赖注入(inject)

python - tkinter 单击后无法更改单选按钮的外观

c - 学习C - 为什么这个方法不释放内存?

c - 有很多线程 WaitingForSingleObject() 会降低性能吗?

audio - 多个过滤器语法的ffmpeg序列

Python Json解码数组到字符串

c++ - c/c++ 中局部变量的作用域和生命周期的困惑

iphone - 有没有一种简单的方法可以在iPhone中播放m3u?

Java Clip(Clip.Stop 不起作用)