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

时间:2015-10-29 14:35:21

标签: python-3.x ipython jupyter

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

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

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

提前致谢!!

2 个答案:

答案 0 :(得分:1)

音频播放列表

我们可以在Jupyter中直接使用IPython.display.HTML显示HTML代码,您只需要创建一个音频播放列表控制器并为hrefsrc attr分配文件名。

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

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

../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支持

我在自己的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')

答案 1 :(得分:0)

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

{
    "vishReqHeader": {
        "ClientId": "0",
        "AppId": "101",
        "ApiCode": "1007",
        "ReqNo": "123456789"
    },
    "vishReqBody": {
        "RegPhNo": "9880889660",
        "Cnt": "3",
        "Contacts": [{
                "PhNo": "9880889660",
                "Name": "Alex"
            },
            {
                "PhNo": "9538607847",
                "Name": "Cindy"
            },
            {
                "PhNo": "9886949651",
                "Name": "Rob"
            }
        ]

    },
    "vishReqTrailer": {
        "DeviceData": "lat=12.9677992|lng=77.596204|IMEI=1234567890|appVer=3.0.1|OS=ANDROID|SoftVer=6.0.1",
        "Authentication": "securitytoken"
    }
}