Jos*_*shz 4 python mime ogg ipython jupyter
我正在用 Jupyter 做一些音频分析,并尝试.ogg用IPython.display.Audio. 由于 PyCharm 经常无法打开大.ipynb文件,我主要使用 Web 浏览器在localhost:8888.
这张图片是我用 Chrome 得到的。如您所见,FailToDisplay.ogg取自我的作品,未激活音频播放栏。File-ACDC_-_Back_In_Black-sample.ogg和song sample.mp3都是从网上下载的。3个文件的完整性都经过验证,即它们都可以用音频播放器正确播放。
我也用 Microsoft Edge 和 Firefox 测试过,结果大体相同。2 个.ogg播放栏都处于非活动状态,而.mp3播放栏播放栏处于活动状态并且运行良好。所以我想问题不依赖于网络浏览器。
我用 Chrome 开发者工具检查了这 3 个音频播放栏的 html 源代码,它们都像:
<audio controls="controls">
<source src="data:None;base64,VERYLONGTEXT" type="None">
Your browser does not support the audio element.
</audio>
Run Code Online (Sandbox Code Playgroud)
该type支持mp3是audio/mpeg和type播放Ogg是None。经过一些谷歌搜索,我想这与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
Run Code Online (Sandbox Code Playgroud)
不是很奇怪。然后我找到了这篇博客文章如何在服务器上设置 MIMETYPES:论坛:PythonAnywhere并测试了我的 Python MIME 类型设置:
>>> import mimetypes
>>> mimetypes.guess_type("foo.ogg")
(None, None)
Run Code Online (Sandbox Code Playgroud)
现在遇到这种情况不知道下一步该怎么办。这只是 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
Run Code Online (Sandbox Code Playgroud)
既然没人给提示,我想我只能一个人工作了……
首先查看以下源代码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())
Run Code Online (Sandbox Code Playgroud)
这是生成音频控制块的 html 源代码的代码,type从self.mimetype. 并且self.mimetype源自reload():
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"
Run Code Online (Sandbox Code Playgroud)
很明显,如果是mimetypes.guess_type("filename.ogg")[0]gets None,那么我们有type == None,这会导致一个非活动的音频控制块。
从18.7。mimetypes — 将文件名映射到 MIME 类型 — Python 2.7.12 文档我了解到 MIME 类型可以从文件加载或动态添加mimetypes.add_type()。它还说默认情况mimetypes下将从 Windows 注册表加载。我尝试.ogg使用一个小实用程序FileTypesMan - Alternative to 'File Types' manager of Windows修改系统范围的 MIME 类型设置,但它没有反映在mimetypes,所以我想我不得不放弃它。
最后我意识到之前IPython.display.Audio使用的猴子补丁可能会起作用,并且确实有效:
解决问题可能并不完美,但至少它是有效的。就这样吧。
| 归档时间: |
|
| 查看次数: |
1167 次 |
| 最近记录: |