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);
    }
}