在jupyter笔记本的文件夹中播放mp3

问题描述 投票:2回答:2

在jupyter笔记本中播放视频:我这样做: from IPython.display import * Audio("linktomp3.mp3", autoplay=True) 这创建了一个像手机一样的音频播放器,你可以播放mp3。

现在我想解决一件事。我在一个文件夹中有很多mp3文件。我想逐个在jupyter笔记本中播放所有这些内容。怎么做?有什么帮助吗?

还有一种方法来调整此功能,以启用播放.m4a音乐文件?

提前致谢!!

python-3.x ipython jupyter
2个回答
1
投票

Audio Playlist

我们可以在Jupyter中直接用IPython.display.HTML显示html代码,你需要做的就是创建一个音频播放列表控制器并为hrefsrc attr指定文件名。

我刚刚从HTML5 Audio and Video and how to make a playlist借了一个演示,因为我不太熟悉web开发。对CSS样式进行了小的修改以使示例更直观。作者值得称赞!

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

../Music/:
Stille/  贼/

以下代码将加载.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))

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

Jupyter的输出就足够了。控制器加载所有文件并可以按顺序播放音频文件。

enter image description here

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

.m4a support

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

我曾经遇到过类似的情况:python - IPython.display.Audio cannot correctly handle .ogg file type? - Stack Overflow。手动将.m4a的MIME类型更改为audio/mp4将根据我的测试解决问题。在IPython中播放.m4a文件之前添加此代码段:

import mimetypes
mimetypes.init()
mimetypes.add_type('audio/mp4', '.m4a')

0
投票

我有人想要在你的jupyter笔记本中有一个可播放的音频文件,这是我使用的解决方案。我使用html5音频元素。

from IPython import display, HTML
def show_audio_with_controls(file_path):
    display(HTML("<audio controls><source src={} type='audio/mpeg'></audio>".format(file_path)))
© www.soinside.com 2019 - 2024. All rights reserved.