2016-08-22 102 views
2

我正在用Jupyter做一些音频分析的东西,并尝试使用IPython.display.Audio播放.ogg文件。由于PyCharm经常无法打开大文件.ipynb,我主要使用网络浏览器查看我的Notebook文件,其格式为localhost:8888IPython.display.Audio无法正确处理`.ogg`文件类型?

enter image description here

这张照片是我所得到的Chrome浏览器。正如你所看到的,FailToDisplay.ogg是从我的作品中取得的,音频播放栏未激活。 File-ACDC _-_ Back_In_Black-sample.ogg and song sample.mp3都是从网上下载的。 3个文件的完整性都是有效的,即它们都可以用音频播放器正确播放。

我还使用Microsoft Edge和Firefox对其进行了测试,结果基本相同。 2 .ogg播放栏全部不活动,而.mp3播放栏处于活动状态,并且完美无瑕。所以我想这个问题不是依赖网页浏览器。

我检查与Chrome开发者工具这三个音频playbars的HTML源代码,他们都是这样的:

<audio controls="controls"> 
        <source src="data:None;base64,VERYLONGTEXT" type="None"> 
        Your browser does not support the audio element. 
       </audio> 

type的MP3是OGG audio/mpegtypeNone。经过一些谷歌搜索,我想这与MIME类型有关。所以我用命令检查了3个音频文件mimetype

$ mimetype ./* 
./AudioDisplayErrorTest.ipynb:   text/plain 
./FailToDisplay.ogg:     audio/x-vorbis+ogg 
./File-ACDC_-_Back_In_Black-sample.ogg: video/x-theora+ogg 
./song sample.mp3:      audio/mpeg 

不是很奇怪。然后我发现这个博客帖子How to set MIMETYPES on server : Forums : PythonAnywhere和测试我的Python的MIME类型设置:

>>> import mimetypes 
>>> mimetypes.guess_type("foo.ogg") 
(None, None) 

现在,我不知道接下来有这种情况该怎么办。这只是Jupyter或IPython或系统范围的错误?我在哪里可以改变这种行为?

我的Python环境设置

audioread==2.1.4 
ipykernel==4.4.1 
ipython==5.1.0 
ipython-genutils==0.1.0 
ipywidgets==4.1.1 
jupyter==1.0.0 
jupyter-client==4.3.0 
jupyter-console==5.0.0 
jupyter-core==4.1.1 
librosa==0.4.3 
nbconvert==4.2.0 
nbformat==4.0.1 
notebook==4.2.2 
numpy==1.11.1 
openpyxl==2.3.2 
pydub==0.16.5 
+0

好吧,我自己想清楚了。 – Joshz

回答

2

既然没有人给出了一个提示,我想我得单独工作...

首先看到的IPython.display.audio源代码:ipython/display.py at 48b01aadcbb6a53d2c77fa250c8a4344931c357c · ipython/ipython

def _repr_html_(self): 
    src = """ 
      <audio controls="controls" {autoplay}> 
       <source src="{src}" type="{type}" /> 
       Your browser does not support the audio element. 
      </audio> 
      """ 
    return src.format(src=self.src_attr(),type=self.mimetype, autoplay=self.autoplay_attr()) 

这是生成音频控制块的html源代码的代码,typeself.mimetype。而self.mimetypereload()得出:

if self.filename is not None: 
     self.mimetype = mimetypes.guess_type(self.filename)[0] 
    elif self.url is not None: 
     self.mimetype = mimetypes.guess_type(self.url)[0] 
    else: 
     self.mimetype = "audio/wav" 

很明显,如果mimetypes.guess_type("filename.ogg")[0]得到None,那么我们有type == None,这会导致无效的音频控制块。

18.7. mimetypes — Map filenames to MIME types — Python 2.7.12 documentation我了解到,MIME类型可以从文件加载或者通过mimetypes.add_type()动态添加。它还表示默认mimetypes将从Windows注册表中加载。我尝试使用一个小工具FileTypesMan - Alternative to 'File Types' manager of Windows修改.ogg的系统范围MIME类型设置,但它没有反映在mimetypes上,所以我想我必须放过它。

最后我意识到IPython.display.Audio之前猴子补丁使用很可能会工作,它确实:

enter image description here

它可能不是完美的解决问题,但至少它的工作原理。现在就这样吧。