Javascript MediaElement.js setSrc不适用于FF、IE7-8上的闪存回退
我看过一些关于这方面的讨论,但没有真正的答案。我已经成功地让Javascript MediaElement.js setSrc不适用于FF、IE7-8上的闪存回退,javascript,flash,mediaelement,mediaelement.js,Javascript,Flash,Mediaelement,Mediaelement.js,我看过一些关于这方面的讨论,但没有真正的答案。我已经成功地让mediaelement.js为我工作了很多次,只是它不允许我setSrc()。在做了这么多工作之后,这真是一个大麻烦 作为一个小背景,我正在使用mediaelement和player.jsv2.1.9,并使用其播放器的API通过player.setSrc更改媒体src。我正在播放音频MP3 我在FF Mac中遇到以下错误: this.media.setSrc不是一个函数 IE8 Win中的错误是: SCRIPT445:对象不支持此操作
mediaelement.js
为我工作了很多次,只是它不允许我setSrc()。在做了这么多工作之后,这真是一个大麻烦
作为一个小背景,我正在使用mediaelement和player.js
v2.1.9,并使用其播放器的API通过player.setSrc
更改媒体src。我正在播放音频MP3
我在FF Mac中遇到以下错误:
this.media.setSrc不是一个函数
IE8 Win中的错误是:
SCRIPT445:对象不支持此操作
我发现很难相信这没有经过充分测试,因为它似乎是他们API的基本部分。我看到了一些关于类似问题的其他问题,但同样没有真正的答案。您需要在代码中添加“flashmediaelement.swf”。也有同样的问题。通过添加非空的src
和type=“audio/mp3”
属性解决了此问题:
var plugin = new MediaElementPlayer(#mplay_audio_p',
{
//...params...
});
var url="http://www.somesite.com/audiofile.mp3";
plugin.setSrc(url);
plugin.load();
plugin.play();
<audio id="player" controls src="#" type="audio/mp3" preload="none"></audio>
不要担心type
和src
的不兼容性,因为根据,type
根本不是audio
标签的合法属性(type
只是源代码
标签的属性),在这里放置它只是为了修复MediaElement.js行为。我回答了一个类似的问题。以下是我的解决方案:
当初始化mediaElement播放器后调用setSrc方法过快时,会发生这种情况。由于闪存回退,swf(及其api方法)将在触发成功事件之前不可用。之后,setSrc在IE8中工作良好
我不想从成功处理程序中设置初始源。因此,我使用一个布尔变量来检查是否发生了成功事件。在我的源代码设置方法中,每当布尔值等于false时,我检查它的值并使用递归性(使用setTimeout防止过度杀戮)。。他为我做了这件事
//create the tag
var video = $("<video>",{id:"videoElement",width:640,height:360}).appendTo('body');//jquery
var mediaElementInitialized = true
//create the mediaelement
var mediaElement = new MediaElementPlayer("#videoElement",{
/**
* YOU MUST SET THE TYPE WHEN NO SRC IS PROVIDED AT INITIALISATION
* (This one is not very well documented.. If one leaves the type out, the success event will never fire!!)
**/
type: ["video/mp4"],
features: ['playpause','progress','current','duration','tracks','volume'],
//more options here..
success: function(mediaElement, domObject){
mediaElementInitialized = true;
},
error: function(e){alert(e);}
}
);
var setSource = function(src){
if(mediaElementInitialized == true){
if(mediaElement){
mediaElement.setSrc(src);
mediaElement.play();
}
} else {
//recursive.. ie8/flashplayer fallback fix..
var self = this;
setTimeout(function(){
self.setSource(src);
},100);
}
}
//创建标记
var video=$(“”,{id:“videoElement”,宽度:640,高度:360})//jquery
var mediaElementInitialized=true
//创建mediaelement
var medialelement=new medialelementplayer(“#videoElement”{
/**
*当初始化时未提供SRC时,必须设置类型
*(这一个没有很好的文档记录。如果不输入,成功事件将永远不会触发!!)
**/
类型:[“视频/mp4”],
特点:[“播放暂停”,“进度”,“当前”,“持续时间”,“曲目”,“音量],
//这里有更多选项。。
成功:函数(mediaElement、domObject){
mediaElementInitialized=true;
},
错误:函数(e){alert(e);}
}
);
var setSource=函数(src){
如果(mediaElementInitialized==true){
if(mediaElement){
mediaElement.setSrc(src);
mediaElement.play();
}
}否则{
//递归..ie8/flashplayer回退修复。。
var self=这个;
setTimeout(函数(){
self.setSource(src);
},100);
}
}
Update:我找到了一个解决方法,尽管它并非没有缺陷,但似乎工作得相当好。请参阅我在mediaelement的github问题中对以下讨论的评论:有人对此有明确的解决方案吗?没有出现上述错误,但必须在“setSrc()”之前调用“pause()”,然后一切正常me@Gluip如果这对你来说仍然是真实的,试试看
//create the tag
var video = $("<video>",{id:"videoElement",width:640,height:360}).appendTo('body');//jquery
var mediaElementInitialized = true
//create the mediaelement
var mediaElement = new MediaElementPlayer("#videoElement",{
/**
* YOU MUST SET THE TYPE WHEN NO SRC IS PROVIDED AT INITIALISATION
* (This one is not very well documented.. If one leaves the type out, the success event will never fire!!)
**/
type: ["video/mp4"],
features: ['playpause','progress','current','duration','tracks','volume'],
//more options here..
success: function(mediaElement, domObject){
mediaElementInitialized = true;
},
error: function(e){alert(e);}
}
);
var setSource = function(src){
if(mediaElementInitialized == true){
if(mediaElement){
mediaElement.setSrc(src);
mediaElement.play();
}
} else {
//recursive.. ie8/flashplayer fallback fix..
var self = this;
setTimeout(function(){
self.setSource(src);
},100);
}
}