使用 jupyter notebook 在文件夹中播放 mp3

Sum*_*nal 4 ipython python-3.x jupyter

在 jupyter notebook 中播放视频:我这样做: from IPython.display import * Audio("linktomp3.mp3", autoplay=True) 这会创建一个类似感觉的音频播放器,您可以播放 mp3。

现在我想解决一件事。我在一个文件夹中有很多 mp3 文件。我想在 jupyter notebook 中一一播放。怎么做?请问有什么帮助吗?

还有一种方法可以调整此功能以播放 .m4a 音乐文件吗?

提前致谢!!

Jos*_*shz 5

音频播放列表

我们可以IPython.display.HTML在 Jupyter 中直接显示 html 代码,您需要做的就是创建一个音频播放列表控制器并将文件名分配给hrefsrcattr。

我刚刚从HTML5 音频和视频中借用了一个演示以及如何制作播放列表,因为我对网络开发不太熟悉。对 css 样式进行了小的修改,使示例更加直观。作者值得所有赞美!

在文件的同一个父目录下,.ipynb我创建了Musicdir 并将两个专辑目录复制到其中。目录结构如下:

../Music/:
Stille/  ?/
Run Code Online (Sandbox Code Playgroud)

以下代码将加载dir下的所有.mp3文件Music并生成播放列表。

import os
from IPython.display import display,Audio,HTML
playlist_html=""
audio_html=""
music_dir = u'Music'
count=0
for root, dirs, files in os.walk(music_dir):
    #print 'root: ' + repr(root)
    #print 'dirs: ' + repr(dirs)
    #print 'files: ' + repr(files)
    for file in files:
        if count==0:
            playlist_html = u'''<li class="active"><a href="{0}">{1}</a>
                </li>\n'''.format(os.path.join(root, file), file)
            audio_html = u'''<audio id="audio" preload="auto" tabindex="0" controls="" type="audio/mpeg">
                <source type="audio/mp3" src="{}">Sorry, your browser does not support HTML5 audio.
                </audio>'''.format(os.path.join(root, file))
        else:
            playlist_html +=u'''<li><a href="{0}">{1}</a></li>\n'''.format(os.path.join(root, file), file)
        count += 1

playlist_html = audio_html + u'''\n<ol id="playlist">\n{}</ol>'''.format(playlist_html)
#print playlist_html


playlist_css = """
<style>
#playlist .active a{color:#CC0000;text-decoration:none;}
#playlist li a:hover{text-decoration:none;}
</style>
"""

playlist_js = """
<script>
var audio;
var playlist;
var tracks;
var current;

init();
function init(){
    current = 0;
    audio = $('audio');
    playlist = $('#playlist');
    tracks = playlist.find('li a');
    len = tracks.length - 1;
    audio[0].volume = .10;
    playlist.find('a').click(function(e){
        e.preventDefault();
        link = $(this);
        current = link.parent().index();
        run(link, audio[0]);
    });
    audio[0].addEventListener('ended',function(e){
        current++;
        if(current == len){
            current = 0;
            link = playlist.find('a')[0];
        }else{
            link = playlist.find('a')[current];    
        }
        run($(link),audio[0]);
    });
}
function run(link, player){
        player.src = link.attr('href');
        par = link.parent();
        par.addClass('active').siblings().removeClass('active');
        audio[0].load();
        audio[0].play();
}
</script>
"""
display(HTML(playlist_html))
display(HTML(playlist_css))
display(HTML(playlist_js))
Run Code Online (Sandbox Code Playgroud)

所有这些代码片段所做的就是将 html、css 和 js 代码插入到单元格输出中。href用正确的文件名替换attr 有点麻烦但并不困难。实际上,js 代码可能更难阅读。

Jupyter 中的输出已经足够好了。控制器加载所有文件,可以顺序播放音频文件。

在此处输入图片说明

如果您想将代码重构为IPython.core.display.DisplayObject子类,我建议您阅读c4ef808311f2bb84bf4a0a5d3bb980b3d81c373b 上的 ipython/Custom Display Logic.ipynb,还有很多工作要做。

.m4a 支持

我在自己的 Jupyter 环境(使用 Chrome)上进行了测试,但它也无法播放.m4a。我猜是因为标签的type属性audioaudio/m4a,Chrome 无法正确识别。

我曾经遇到过这种类似的情况:python - IPython.display.Audio 无法正确处理.ogg文件类型?- 堆栈溢出。根据我的测试,手动更改.m4ato的MIME类型即可audio/mp4解决问题。.m4a在 IPython 中播放文件之前添加此代码片段:

import mimetypes
mimetypes.init()
mimetypes.add_type('audio/mp4', '.m4a')
Run Code Online (Sandbox Code Playgroud)