MediaElement.js setSrc不适用于FF,IE7-8上的闪回后备

时间:2011-09-09 05:19:14

标签: javascript flash mediaelement mediaelement.js

我已经看过一些关于此的讨论,但没有真正的答案。我mediaelement.js为我工作取得了很大的成功,除了它不会让我setSrc()闪回后退。经过这么多工作,这是一个巨大的失败。

对于一些小背景我正在使用mediaelement-and-player.js v2.1.9并使用其播放器的API通过player.setSrc更改媒体src。我正在播放音频MP3。

我在FF Mac中收到此错误:

  

this.media.setSrc不是函数

IE8 Win中的这个错误:

  

SCRIPT445:对象不支持此操作

我觉得很难相信它没有经过全面测试,因为它似乎是他们API的基础部分。我已经看到了一些关于类似问题的其他问题但又没有真正的答案。

4 个答案:

答案 0 :(得分:0)

您需要在代码中添加“flashmediaelement.swf”。

答案 1 :(得分:0)

有同样的问题。通过添加非空srctype="audio/mp3"属性来解决此问题:

<audio id="player" controls src="#" type="audio/mp3" preload="none"></audio>

此处建议使用preload="none",因为没有它,元素​​会向当前页面的网址发送额外请求,以尝试下载音频。


更新:找到了另一种方法,可以在src中嵌入零长度WAV文件,因此您可以正常使用preload属性并停止担心不需要的如果用户在设置正常src之前点击播放按钮,则会发送请求。

<audio id="player" controls type="audio/mp3" src="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQAAAAA=">

不要担心typesrc不兼容,因为根据audio element specificationtype不是audio的合法属性完全标记{type只是source标记的属性),此处它仅用于修复MediaElement.js行为。

答案 2 :(得分:0)

我在github上回答了类似的问题。这是我的解决方案:

在初始化mediaElement播放器后过早调用setSrc方法时会发生这种情况。由于闪回后退,swf(因此其api方法)在成功事件被触发之前将不可用。之后,setSrc在IE8中工作正常。

我不想在成功处理程序中设置初始源。因此我使用boolean var来检查是否发生了成功事件。在我的源设置方法中,我检查它的值并使用递归(使用setTimeout来防止过度杀伤)每当布尔值var等于false时。对我来说是诀窍。

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

答案 3 :(得分:-2)

var plugin = new MediaElementPlayer(#mplay_audio_p',
{
//...params...
});

var url="http://www.somesite.com/audiofile.mp3";

plugin.setSrc(url);
plugin.load();
plugin.play();