在不使用cpython扩展的情况下播放和录制音频
SoundCard的Python项目详细描述
声卡是一个无需借助 cpython分机。相反,它是使用美妙的CFFI和 Linux、Windows和MacOS。
声卡是跨平台的,支持linux/pulseaudio、mac/coreaudio和 Windows/Wasapi。尽管跨平台的编程接口是相同的, 声卡命名方案和默认块大小在设备和 平台。
声卡仍在开发中。所有主要功能都适用于所有平台,但是 有一些已知的问题仍然需要解决。如果你发现了虫子, 请打开一个问题,我会尽力解决它。或者打开一个请求,我 将尝试将您的修复程序包含到声卡中。
不过,请注意,这是我的爱好项目,我是 免费开发,在我的业余时间。当我试着像 可能的话,我不能保证对问题的及时反应。发布打开 github上的源代码软件并不意味着有义务修复您的问题 现在。请文明一点。
教程
以下是使用扬声器和麦克风的方法:
importsoundcardassc# get a list of all speakers:speakers=sc.all_speakers()# get the current default speaker on your system:default_speaker=sc.default_speaker()# get a list of all microphones:mics=sc.all_microphones()# get the current default microphone on your system:default_mic=sc.default_microphone()# search for a sound card by substring:>>>sc.get_speaker('Scarlett')<SpeakerFocusriteScarlett2i2(2channels)>>>>one_mic=sc.get_microphone('Scarlett')<MicrophoneFocusriteScalett2i2(2channels)># fuzzy-search to get the same results:one_speaker=sc.get_speaker('FS2i2')one_mic=sc.get_microphone('FS2i2')
所有这些函数都返回Speaker和Microphone对象,这些对象可以 用于播放和录制。传入和传出这些对象的所有数据 是frames×channelsnumpy数组。
importnumpy>>>print(default_speaker)<SpeakerFocusriteScarlett2i2(2channels)>>>>print(default_mic)<MicrophoneFocusriteScarlett2i2(2channels)># record and play back one second of audio:data=default_mic.record(samplerate=48000,numframes=48000)default_speaker.play(data/numpy.max(data),samplerate=48000)# alternatively, get a `Recorder` and `Player` object# and play or record continuously:withdefault_mic.recorder(samplerate=48000)asmic, \ default_speaker.player(samplerate=48000)assp:for_inrange(100):data=mic.record(numframes=1024)sp.play(data)
延迟
默认情况下,声卡在操作系统默认情况下录制和播放 配置。特别是在笔记本电脑上,这种配置可能有极端的 延迟,最多几秒。
为了请求更低的延迟,请将blocksize传递给player或 recorder。这将告诉操作系统您所需的延迟,并且它将 尽量满足你的要求。在windows/wasapi上,设置 exclusive_mode=True也可能有帮助(这目前是实验性的)。
延迟的另一个来源是record函数,它缓冲输出 到请求的numframes。一般来说,为了获得最佳的延迟,您应该使用 anumframes显著低于上面的blocksize,可能是 二或四的因数。
为了尽可能快地获取音频数据,您可以使用 numframes=None,它将返回任何可用的音频数据 现在,没有任何缓冲。注意,这可能会收到不同数量的 每次帧。
使用上述设置,256个样本或10毫秒的块大小为 通常没问题。播放和录制的总延迟取决于 但是,操作系统是如何处理这些缓冲区的 明显更高。
频道映射
一些专业声卡有大量的频道。如果你想的话 只录制或播放这些频道的子集,可以指定频道映射。 播放时,[0, 3, 4]的频道映射将播放三个频道的音频数据 在物理频道一,四,五。为了录音,一张 [0, 3, 4]将返回从物理 一、四、五频道。
此外,pulseaudio/linux将channel-1定义为所有 播放和录制的频道。coreadio/macos定义频道-1 作为播放和录制的静音。
已知问题:
- 如果只记录一个通道,windows/wasapi当前会记录垃圾。 原因尚不清楚。多通道和通道图工作, 不过。
- 在某些情况下,windows/wasapi会自动忽略blocksize。显然,它 仅在独占模式下支持可变块大小。
- 误会我消息经常报告一些内部cffi/后端错误。这将是 在未来有所改善。
更改日志
- 2018-04-25录制时实现固定块大小 (谢谢你,帕伦特·曼纽尔!)
- 2018-05-10为Windows添加测试套件和各种修复程序
- 2018-05-11 MacOS的各种修复程序
- 2018-06-27为Linux/Pulseaudio添加延迟属性 (谢谢你,帕伦特·曼纽尔!)
- 2018-07-17增加对Windows的环回支持 (谢谢你,简·莱斯科维奇!)
- 2018-10-16在windows上为ipython添加bug修复 (谢谢你,塞巴斯蒂安·米歇尔!)
- 2018年11月28日,增加斯芬克斯/ReadtheDocs文档
- 2019-03-25增加了对Python3.5的支持 (谢谢你,丹尼尔·R·库莫!)
- 2019-04-29在Windows上添加了对独占模式的实验性支持
推荐PyPI第三方库
- 热门话题
- java如何将jaxb插件扩展与gradlejaxbplugin一起使用 java Hibernate列表<Object[]>到特定对象 java使用多态性显示arraylist的输出 java水平堆叠卡,带有一定偏移量 java错误:找不到符号方法liesInt() java客户机/服务器文件收发中的多线程流管理 在java中可以基于访问重载方法吗? 包含空元素的java排序数组 swing Java按钮/网格布局 java BottomNavigationView getmaxitemcount java空指针异常字符串生成器 java Xamarin升级导致“类文件版本错误52.0,应为50.0”错误 java我正在尝试打印它,而不只是对每一行进行println Tomcat7中的java是否需要复制上下文。将xml转换为conf/Catalina/locahost以使其生效 带有注入服务的java REST端点在何处引发自定义WebServiceException? 在Java中使用GPS数据 java如何将JFreeChart ChartPanel导出到包含添加的CrosshairOverlay的图像对象? 内置Eclipse期间的Java 8堆栈溢出 java在GWT编译的JavaScript中如何表示BigDecimal