一个Jupyter(IPython)笔记本单元格中有多个音频对象

32
我试图在单个Jupyter Notebook单元格中嵌入多个IPython.display.Audio对象,但出于某种原因只有最后一个被显示。
这里是一个简单的例子:
import IPython
IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/090412-Incendios.mp3")
IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/130224-Undertow.mp3")

这只显示了一个音频对象(第二个)。理想情况下,我想将其放在 for 循环中,并在单个单元格中显示多个音频对象。

有什么建议吗?

注意:我正在运行 Jupyter 4.0.6,使用 IPython 4.0.0,在 Python 2.7.10 上。


您可以通过重复使用 IPython.display.display 函数,在单个单元格的显示区域中显示多个“显示”对象。请参见此处的示例。 - Taar
很遗憾,Taar,在使用音频对象时这种方法不起作用(或者至少我没想出来)。不过还是谢谢你。 - Oriol Nieto
我做了这个:import IPythonIPython.display.display(IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/090412-Incendios.mp3"))IPython.display.display(IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/130224-Undertow.mp3"))看起来它正在工作(在Windows 7上使用python 3.4 + IPython 3.2...) - Taar
太棒了,正是这样!你愿意把它发布为答案吗?谢谢。 - Oriol Nieto
1个回答

49
IPython.display.Audio(...) 命令仅创建一个“显示”对象(在这种情况下,是类别为 DisplayObject 的子类 Audio 的对象)。
之后,您可以对这样的对象进行基本操作,这些操作与类别 DisplayObject(以及特定于类别 Audio 的一些内容)相关。其中之一就是通过使用 IPython.display.display 函数来显示它。
因此,您可以通过以下代码实现您的特定目标:
import IPython
IPython.display.display(IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/090412-Incendios.mp3"))
IPython.display.display(IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/130224-Undertow.mp3"))

使用相同的机制显示其他类型(子类)的DisplayObject对象: HTMLMarkdownMathSVGJavascriptVideoImage等。有关详细信息,请参见此处

第一次尝试时会有三件事情真正令人困惑(我也曾经困惑):

  • IPython.display.Audio命令的名称似乎意味着将显示某些内容,但实际上并不是这样;

  • 所有这些多媒体对象都被称为“display”对象,而其中一些根本没有真正“显示”,而只是嵌入在DOM树中(例如,Javascript对象);

  • 如果您创建这样的对象并且不对其使用IPython.display.display,则它将自动由标准IPython交互式机制显示,如果它是单元格中创建的最后一个对象。这是混淆的主要来源,因为它让人们认为您不需要使用任何特定的函数来显示“display object”。


非常有教育意义的回答。我希望能有更多这样的回答。 - mins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接