2013-05-04 71 views
2

正確方法我用<音頻>和<視頻>與預緊=「無」,然後嘗試從Javascript打得到我Firefox和Chrome不同的結果。打<audio> + <video>從Javascript

比方說,我是用預緊=「自動」或預裝=「元數據」:

audio.src = "filename"; 
audio.play(); 

,似乎工作在Firefox和Chrome的罰款,但我想用預緊=「無」,然後Chrome dossent play。

所以我想這個代碼預緊=「無」:

audio.src = url; 

audio.load(); 

audio.addEventListener('canplay', function(e) { 
    audio.play(); // For some reason this dossent work in Firefox 
}, false); 

audio.play(); // Added this so Firefox would play 

我不知道這是做了正確的道路。

我使用的是: 火狐20.0.1 的Chrome 25.0.1364.172米

我做了一個演示:http://netkoder.dk/test/test0217.html

編輯:

在第二音頻播放器(上演示頁面)似乎使用preload =「none」時,您必須使用load()。 但是,在load()之後立即使用play(),還是在播放之前使用事件等待文件加載的正確方法是正確的?

在第三個音頻播放器中,似乎Firefox 20.0.1 dossent在與addEventListener()一起使用時正確支持canplay事件,因爲它在load()之後觸發,它在play()之後觸發,並且在觸發時通過聲音這似乎是戲劇應該奏效的方式。 使用.oncanplay工作。

所以下面的代碼似乎工作:

function afspil2(url) { 

    afspiller2.src = url; 
    afspiller2.load(); // use load() when <audio> has preload="none" 
    afspiller2.play(); 

    } 

    function afspil3(url) { 

    afspiller3.src = url; 
    afspiller3.load(); // use load() when <audio> has preload="none" 

    //afspiller3.addEventListener('canplay', function() { // For some reason this dossent work correctly in Firefox 20.0.1, its triggers after load() and when scrubbing 
    // afspiller3.play(); 
    //}, false); 

    afspiller3.oncanplay = afspiller3.play(); // Works in Firefox 20.0.1 

    } 

我更新了演示,包括更改:http://netkoder.dk/test/test0217.html

我加入afspil3()函數dossent內的addEventListener的方式似乎不錯,因爲第一時間函數被稱爲addEventListener裏面的代碼被稱爲1次。第二次調用函數時,addEventListener裏面的代碼被調用2次,然後3次,等等。

+0

你能提供一個完整的例子,說明你在哪裏設置'preload =「none」'而且它不起作用嗎? – user1091949 2013-05-04 00:49:22

+0

演示:http://netkoder.dk/test/test0217.html – scootergrisen 2013-05-04 01:40:02

回答

3

這是因爲您的audio標記缺少所需的src屬性或<source>標記。當我將它們添加到演示中時,所有3名玩家立即開始在Chrome和FF中工作。

此外,我最近發現,src不能是一個空字符串,隨後用JS更改。如果有一個原因,你不能設置在HTML中src,你最好的選擇,國際海事組織,是使用JavaScript創建audio元素:

var audio = new Audio(); 
audio.src = url; 
audio.controls = true; 
audio.preload = false; 
// and so on 

編輯:確定。看起來在Chrome中,當HTML爲preload="none"時,在src更改時有必要在播放之前調用load()。你的第二個audio不預裝,因此你需要的功能是這樣的:

function afspil2(url) { 
    afspiller2.src = url; 
    afspiller2.load(); // add load call 
    afspiller2.play(); 
    } 

然後,似乎在Firefox中,有必要設置preload="auto";附加一個事件時,該事件canplay,就像在第三功能。

function afspil3(url) { 
    afspiller3.src = url; 
    afspiller3.preload = "auto"; 
    afspiller3.load(); 
    afspiller3.addEventListener('canplay', function(e) { 
     this.play(); // For some reason this dossent work in Firefox 
    }, false); 
    } 

這只是似乎很奇怪,但我多次測試了它,每一次如果preload="auto"被稱之爲將發揮,但不會玩,如果它不叫。請注意,對於第二個播放器來說這不是必需的,這也是HTML標記中的preload="none"

最後,如果頁面上有多個<audio>元素,Chrome會有一些奇怪的行爲。對於所有三個玩家,重新加載頁面並點擊「大電子」鏈接將正確播放。

重新載入然後點擊第二位或第三位玩家的「Yoda」將不會執行任何操作,但它會爲第一位玩家播放。但是,如果頂級球員首先以任何方式進行比賽 - 播放按鈕或鏈接 - 那麼其他兩個「尤達」鏈接將突然發揮作用。

此外,如果您在重新加載後首先點擊第2或第3個「Yoda」鏈接,然後單擊頂級玩家,之前點擊的「Yoda」(以前未玩過的)將開始自行玩頂尖選手停下來。

只要說它們有一些缺陷就可以了。

+0

添加一個src播放該文件,如果啓動音頻播放器,但我的Javascript代碼仍然不工作後,如果你嘗試通過鏈接更改音頻源在玩家之上。 – scootergrisen 2013-05-04 05:18:44

+0

@scootergrisen剛剛添加了一個編輯。 Man,HTML5'

+0

沒關係,它還沒有開發出來,並不適用於所有的瀏覽器,我喜歡生活在邊緣:D但是我想知道正確的方法是什麼。 – scootergrisen 2013-05-04 19:10:30

1

在我看來,正確的方法將意味着使用現有的解決方案,像http://mediaelementjs.com/

如果你在最好的方式的細節很感興趣播放音頻和視頻JS再看看源: https://github.com/johndyer/mediaelement/tree/master/src/js

https://github.com/johndyer/mediaelement/blob/master/src/js/me-mediaelements.js

+0

https://github.com/johndyer/mediaelement/blob/master/build/mediaelement-and-player.js中有一段以「Chrome現在支持preload =」none「開頭的註釋部分,所以也許這是一個提示這仍然可能存在一些問題。我正在寫的代碼是爲了讓其他人在我的網站上看到的,所以我不想使用像mediaelementjs這樣的代碼。 – scootergrisen 2013-05-05 10:50:15

+0

通過mediaelementjs,您甚至可以獲得對舊瀏覽器的全面支持,而且大多數人都會使用它,而不是試圖重新發明輪子。你應該至少添加一個鏈接到你的網頁mediaelementjs作爲(IMO:更好)的選擇。 – 2013-05-05 11:59:56

+0

這很好,你認爲它更好,但那不是什麼即時通訊尋找。我想知道如何從底部自己編寫它,我不介意它不適用於舊的瀏覽器甚至所有新的瀏覽器。 – scootergrisen 2013-05-05 12:08:41

相關問題