为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

UYOU 2021-03-11 14:08:25
使用C或python(首选python),如何将二进制文件编码为音频,然后通过耳机插孔输出,如何使用麦克风插孔的输入将音频解码为二进制,到目前为止,我已经学习了如何使用python将文本文件转换为二进制文件,这类似于RTTY通信。这样我就可以将数据记录到盒式磁带上。import binasciia = 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()
查看完整描述

4 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

根据您的评论,您想一点一点地处理二进制数据,将每一位变成高音或低音。


您仍然需要确切地确定那些高低音是什么,每个声音听起来要持续多长时间(以及两者之间是否有间隔等等)。如果您将其放慢,例如每个声音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)


查看完整回答
反对 回复 2021-03-30
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

因此,您想使用音频传输数字信息吗?基本上,您想在软件中实现MODEM(无论它是纯软件,还是称为调制解调器)。

调制解调器(MOdulator-DEModulator)是一种对模拟载波信号进行调制以对数字信息进行编码的设备,还对此类载波信号进行解调以对所传输的信息进行解码的设备。目标是产生一个易于传输和解码的信号,以再现原始数字数据。调制解调器可用于从发光二极管到无线电的任何传输模拟信号的方式。[维基百科]

您到处都需要通过模拟媒体传输数据的调制解调器,无论是声音,光波还是无线电波。您的电视遥控器可能是红外调制解调器。

用纯软件实现的调制解调器称为软调制解调器。我在野外看到的大多数软调制解调器都在使用某种形式的FSK调制:

频移键控(FSK)是一种调频方案,其中通过载波的离散频率变化来发送数字信息。1最简单的FSK是二进制FSK(BFSK)。BFSK使用一对离散频率来传输二进制(0和1s)信息。2在该方案中,“ 1”称为标记频率,“ 0”称为空间频率。右图显示了FSK调制载波的时域。[维基百科]

通过声波通过大气传输数据的应用非常有趣-我想这是shopkick用来验证用户是否存在的东西。

对于Python,请检查GnuRadio项目。

对于C库,请查看Steve Underwood的工作(但请不要在愚蠢的问题上与他联系)。我用他的软调制解调器来引导一个传真到邮件网关的星号(传真传输是不是比B / W更TIFF音频通过电话线编码进行传输文件)。


查看完整回答
反对 回复 2021-03-30
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

因此,这是Abarnert的代码,已更新为python3。


import binascii

import pyaudio


a = open('/home/ian/Python-programs/modem/testy_mcTest.txt', 'rb')

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 = ''.join(map(str, sample_stream))


p = pyaudio.PyAudio()

stream = p.open(format=p.get_format_from_width(1),

                channels=1,

                rate=44100,

                output=True)

stream.write(sample_buffer)


# stop stream (4)

stream.stop_stream()

stream.close()


# close PyAudio (5)

p.terminate()


查看完整回答
反对 回复 2021-03-30
  • 4 回答
  • 0 关注
  • 310 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信