VideoJS-动态更改源

时间:2015-12-23 15:19:14

标签: javascript streaming video.js hls

我想要动态更改VideoJS播放器的视频源。我尝试了一种直接通过DOM更改源的方法,它确实改变了它,但播放器需要重新加载。所以在这里查看官方API:http://docs.videojs.com/docs/api/player.html#Methodssrc

有一种更改源的方法,但在运行以下代码时会抛出错误。



    var source = dropdown.options[dropdown.selectedIndex].value;

	var myVideo = videojs.getPlayers();
	console.log(myVideo);
	if (source == "Source2"){
		myVideo.src([
			{type: "application/x-mpegURL", src: "http://mycdn/playlist.m3u8"},
			{type: "rtmp/mp4", src: "rtmp://mycdn"}
		]);
	}




虽然控制台确实验证了myVideo是一个对象,但是调用.src(source)函数会抛出" TypeError:myVideo.src不是函数。 (在

我还发现了这样的教程,其中有更多的"官方"方法是完全处理玩家并重新初始化新的来源,但我似乎无法理解他在做什么。 https://ineed.coffee/3201/how-to-dynamically-change-video-js-videos-and-captions-with-javascript/

任何帮助都将不胜感激。

解决方案: 出于测试目的,我只是有一个很好的小下拉并添加了一个点击事件,因此它将频道更改为用户想要的任何内容。

var dropdown = document.getElementById('sel1');
var source = dropdown.options[dropdown.selectedIndex].value;

dropdown.addEventListener("click", function(){
source = dropdown.options[dropdown.selectedIndex].value;
console.log(source)

var myVideo = videojs('my-video');
console.log(myVideo);   
if (source == "Public Access"){
    myVideo.src([
        {type: "application/x-mpegURL", src: "http://mycdns/playlist.m3u8"},
        {type: "rtmp/mp4", src: "rtmp://mycdn"}
    ]);
}
else if (source == "Government"){
    myVideo.src([
        {type: "application/x-mpegURL", src: "http://mycdn/playlist.m3u8"},
        {type: "rtmp/mp4", src: "rtmp://mycdn"}
    ]);
}
else if (source == "Regional"){
    myVideo.src([
        {type: "application/x-mpegURL", src: "http://mycdn/playlist.m3u8"},
        {type: "rtmp/mp4", src: "rtmp://mysource"}
    ]);
}
});

2 个答案:

答案 0 :(得分:0)

getPlayers()返回一个包含所有玩家的对象,而不是玩家。

您通常会使用videojs('my_player_id')获得特定玩家。

答案 1 :(得分:0)

我这样做的方法是使用播放器对象的建议dispose方法。

我有一个功能,可以创建一个带有ID的新玩家,这个ID与前一个玩家的ID不同(出于某种原因,你无法实例化具有相同ID的玩家,即使它被处置掉后也是如此。) / p>

完整过程如下:

  1. 为您的播放器创建一个父元素。

        <div id="player-parent"></div>
    
  2. 创建一个函数,负责生成一个初始播放器元素,您将在其上调用videojs构造函数。

    function getPlayerInstance(curPlayerNumber, playerSource) {
        // curPlayerNumber is simply a counter number which must be different from any previous one passed to this function
        return $("<video id=\"video\ " + curPlayerNumber + "\" class=\"video-js vjs-default-skin\" controls data-setup='{\"plugins\" : { \"resolutionSelector\" : { \"default_res\" : \"360\" } } }'><source src=\"" + playerSource + "\" type=\"application/x-mpegURL\" data-res=\"360\"></video>");
    }
    
  3. 选择您的父元素

    $('#player-parent').append(getPlayerInstance(++playerCounter, someSourceHere));
    
    1. 实例化您的播放器,处置您可能拥有的任何旧播放器。
  4. 这是伪代码,为简单起见,我将播放器分配给全局变量以便于访问。你应该采用不同的方式。

        if (window.playerElement) {
            window.playerElement.dispose();
        }
    
        // the playerCounter variable is different for each function call
        videojs("video" + playerCounter).ready(function(){
            window.playerElement = this;
        });
    

    希望这有用,我浪费了3天。