How to play only the audio of a Youtube video using HTML 5?

前端 未结 9 615
花落未央
花落未央 2020-12-02 11:17

Is it possible to play only the audio from a YouTube video using HTML 5 and Javascript?

9条回答
  •  清歌不尽
    2020-12-02 11:55

    You can parse Youtube meta file for all streams available for this particular video id using this link: https://www.youtube.com/get_video_info?video_id={VID} and extract audio only streams.

    Here is an example with public Google Image proxy (but you can use any free or your own CORS proxy):

    var vid = "3r_Z5AYJJd4",
        audio_streams = {},
        audio_tag = document.getElementById('youtube');
    
    fetch("https://"+vid+"-focus-opensocial.googleusercontent.com/gadgets/proxy?container=none&url=https%3A%2F%2Fwww.youtube.com%2Fget_video_info%3Fvideo_id%3D" + vid).then(response => {
        if (response.ok) {
            response.text().then(data => {
    
                var data = parse_str(data),
                    streams = (data.url_encoded_fmt_stream_map + ',' + data.adaptive_fmts).split(',');
    
                streams.forEach(function(s, n) {
                    var stream = parse_str(s),
                        itag = stream.itag * 1,
                        quality = false;
                    console.log(stream);
                    switch (itag) {
                        case 139:
                            quality = "48kbps";
                            break;
                        case 140:
                            quality = "128kbps";
                            break;
                        case 141:
                            quality = "256kbps";
                            break;
                    }
                    if (quality) audio_streams[quality] = stream.url;
                });
    
                console.log(audio_streams);
    
                audio_tag.src = audio_streams['128kbps'];
                audio_tag.play();
            })
        }
    });
    
    function parse_str(str) {
        return str.split('&').reduce(function(params, param) {
            var paramSplit = param.split('=').map(function(value) {
                return decodeURIComponent(value.replace('+', ' '));
            });
            params[paramSplit[0]] = paramSplit[1];
            return params;
        }, {});
    }

    Doesn't work for all videos, very depends on monetization settings or something like that.

提交回复
热议问题