在不使用cpython扩展的情况下播放和录制音频

SoundCard的Python项目详细描述


versionpythonstatuslicense

contributorsdownloads

声卡是一个无需借助 cpython分机。相反,它是使用美妙的CFFI和 Linux、Windows和MacOS。

声卡是跨平台的,支持linux/pulseaudio、mac/coreaudio和 Windows/Wasapi。尽管跨平台的编程接口是相同的, 声卡命名方案和默认块大小在设备和 平台。

声卡仍在开发中。所有主要功能都适用于所有平台,但是 有一些已知的问题仍然需要解决。如果你发现了虫子, 请打开一个问题,我会尽力解决它。或者打开一个请求,我 将尝试将您的修复程序包含到声卡中。

不过,请注意,这是我的爱好项目,我是 免费开发,在我的业余时间。当我试着像 可能的话,我不能保证对问题的及时反应。发布打开 github上的源代码软件并不意味着有义务修复您的问题 现在。请文明一点。

声卡根据BSD 3条款许可的条款获得许可
(c)2016年巴斯蒂安贝希托

open-issuesclosed-issuesopen-prsclosed-prs

教程

以下是使用扬声器和麦克风的方法:

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')

所有这些函数都返回SpeakerMicrophone对象,这些对象可以 用于播放和录制。传入和传出这些对象的所有数据 是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传递给playerrecorder。这将告诉操作系统您所需的延迟,并且它将 尽量满足你的要求。在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上添加了对独占模式的实验性支持

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐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