Jupyter (IPython) Notebook 单元格中有多个音频对象

More than one Audio object in a Jupyter (IPython) Notebook cell

我试图在一个 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.Audio(...)命令仅创建一个"display"对象(在那种特殊情况下,subclass的对象Audio class DisplayObject).

之后,您可以对此类对象执行基本操作,绑定到 class DisplayObject(以及绑定到 class 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 对象的其他类型(subclasses):HTMLMarkdownMathSVGJavascriptVideoImage 等。详情请参阅 this

当你第一次尝试这样做时,有三件事真的很困惑(一开始我也很困惑):

  • 命令的名称IPython.display.Audio,似乎暗示着要显示一些东西;事实并非如此;

  • 事实是所有这些多媒体对象统称为 "display" 对象,而其中一些根本就不是 "displayed",只是嵌入在 DOM 树中(例如,Javascript 对象);

  • 事实上,如果你创建了这样一个对象并且不在其上使用IPython.display.display,它将被标准IPython交互机制自动显示如果它是在单元格中创建的最后一个东西;这是混淆的主要来源,因为它让人们认为您不需要使用任何特定函数来显示 "display object".