Ich versuche einen Videoplayer zu bauen, der überall funktioniert. Bisher würde ich gehen mit:
<video>
<source src="video.mp4"></source>
<source src="video.ogv"></source>
<object data="flowplayer.swf" type="application/x-shockwave-flash">
<param name="movie" value="flowplayer.swf" />
<param name="flashvars" value='config={"clip":"video.mp4"}' />
</object>
</video>
(wie auf mehreren Websites zu sehen, zum Beispiel Video für alle ) so weit, so gut.
aber jetzt möchte ich auch eine Art Wiedergabeliste / Menü zusammen mit dem Videoplayer, aus dem ich andere Videos auswählen kann. Diese sollten sofort in meinem Player geöffnet werden. Also muss ich "die Quelle des Videos dynamisch ändern" (wie auf dev.opera.com/articles/everything-you-need-to-know-html5-video-audio/ zu sehen). - Abschnitt "Schauen wir uns einen anderen Film an ") mit Javascript. Vergessen wir vorerst den Flashplayer (und damit den IE) Teil, ich werde später versuchen, damit umzugehen.
Mein JS zum Ändern der <source>
Tags sollte also ungefähr so aussehen:
<script>
function loadAnotherVideo() {
var video = document.getElementsByTagName('video')[0];
var sources = video.getElementsByTagName('source');
sources[0].src = 'video2.mp4';
sources[1].src = 'video2.ogv';
video.load();
}
</script>
Das Problem ist, dass dies nicht in allen Browsern funktioniert. Firefox = O, es gibt eine schöne Seite, auf der Sie das Problem beobachten können, das ich habe: http://www.w3.org/2010/05/video/mediaevents.html
Sobald ich die load () -Methode auslöse (wohlgemerkt in Firefox), stirbt der Videoplayer.
Jetzt habe ich herausgefunden, dass, wenn ich nicht mehrere <source>
Tags verwende, sondern nur ein src-Attribut innerhalb des <video>
Tags, das Ganze in Firefox funktioniert.
Mein Plan ist es also, nur dieses src-Attribut zu verwenden und die entsprechende Datei mit der Funktion canPlayType () zu ermitteln .
mache ich es irgendwie falsch oder kompliziere ich die Dinge?
quelle
<source>
Tags zum Laufen zu bringen. dann würde das wohl einfacher seinAntworten:
Ich hasste all diese Antworten, weil sie zu kurz waren oder sich auf andere Rahmenbedingungen stützten.
Hier ist "eine" Vanilla JS-Methode, die in Chrome funktioniert. Bitte testen Sie sie in anderen Browsern:
http://jsfiddle.net/mattdlockyer/5eCEu/2/
HTML:
JS:
quelle
Modernizr hat für mich wie ein Zauber gewirkt.
Was ich getan habe ist, dass ich nicht verwendet habe
<source>
. Irgendwie hat das alles vermasselt, da das Video nur beim ersten Aufruf von load () funktioniert hat. Stattdessen habe ich das Quellattribut im Video-Tag -> verwendet<video src="blabla.webm" />
und mit Modernizr ermittelt, welches Format der Browser unterstützt.Hoffentlich hilft dir das :)
Wenn Sie Modernizr nicht verwenden möchten , können Sie jederzeit CanPlayType () verwenden .
quelle
Ihr ursprünglicher Plan klingt für mich gut. Sie werden wahrscheinlich mehr Browser-Macken finden, die sich mit der dynamischen Verwaltung der
<source>
Elemente befassen , wie hier in der W3-Spezifikation angegeben:http://dev.w3.org/html5/spec/Overview.html#the-source-element
quelle
Ich habe das mit dieser einfachen Methode gelöst
quelle
Anstatt denselben Videoplayer zum Laden neuer Dateien zu veranlassen, löschen Sie das gesamte
<video>
Element und erstellen Sie es neu. Die meisten Browser laden es automatisch, wenn die src's korrekt sind.Beispiel (unter Verwendung eines Prototyps ):
quelle
Setzen Sie einfach ein div und aktualisieren Sie den Inhalt ...
quelle
Nach der Spezifikation
Was Sie also versuchen, soll anscheinend nicht funktionieren.
quelle
Yaur: Obwohl das, was Sie kopiert und eingefügt haben, ein guter Rat ist, bedeutet dies nicht, dass es unmöglich ist, das Quellelement eines HTML5-Videoelements elegant zu ändern, selbst in IE9 (oder IE8). (Diese Lösung beinhaltet NICHT Ersetzen des gesamten Videoelements, da dies eine schlechte Codierungspraxis ist).
Eine vollständige Lösung zum Ändern / Wechseln von Videos in HTML5-Video-Tags über Javascript finden Sie hier und wird in allen HTML5-Browsern (Firefox, Chrome, Safari, IE9 usw.) getestet.
Wenn dies hilft oder wenn Sie Probleme haben, lassen Sie es mich bitte wissen.
quelle
Ich komme damit, um die Videoquelle dynamisch zu ändern. "canplay" -Ereignis wird in Firefox manchmal nicht ausgelöst, daher habe ich "geladene Metadaten" hinzugefügt. Außerdem pausiere ich das vorherige Video, wenn es eines gibt ...
quelle
canplay
noch Eigentumcanplaythrough
undlodedmetadata
muss den Video-Handlern hinzugefügt (und später entfernt) werden :-(Das ist meine Lösung:
quelle
Die Verwendung der
<source />
Tags erwies sich speziell in Chrome 14.0.835.202 als schwierig für mich, obwohl es in FireFox für mich gut funktioniert hat. (Dies könnte mein Mangel an Wissen sein, aber ich dachte, eine alternative Lösung könnte trotzdem nützlich sein.) Also habe ich nur ein<video />
Tag verwendet und das src-Attribut direkt auf dem Video-Tag selbst festgelegt. DascanPlayVideo('<mime type>')
Funktion wurde verwendet, um zu bestimmen, ob der bestimmte Browser das Eingangsvideo abspielen kann oder nicht. Das Folgende funktioniert in FireFox und Chrome.Übrigens spielen sowohl FireFox als auch Chrome das "ogg" -Format, obwohl Chrome "webm" empfiehlt. Ich habe den Check für die Browserunterstützung von "ogg" nur an erster Stelle gestellt, weil in anderen Posts erwähnt wurde, dass FireFox zuerst die ogg-Quelle bevorzugt (dh
<source src="..." type="video/ogg"/>
). Aber ich habe nicht getestet (und bezweifle sehr), ob die Reihenfolge im Code überhaupt einen Unterschied macht, wenn ich das "src" auf dem Video-Tag setze.HTML
JavaScript
quelle
Ich habe dies eine ganze Weile erforscht und ich versuche das Gleiche zu tun, also hoffe ich, dass dies jemand anderem hilft. Ich habe crossbrowsertesting.com verwendet und dies buchstäblich in fast jedem dem Menschen bekannten Browser getestet. Die Lösung, die ich derzeit habe, funktioniert in Opera, Chrome, Firefox 3.5+, IE8 +, iPhone 3GS, iPhone 4, iPhone 4s, iPhone 5, iPhone 5s, iPad 1+, Android 2.3+ und Windows Phone 8.
Dynamisch wechselnde Quellen
Das dynamische Ändern des Videos ist sehr schwierig. Wenn Sie einen Flash-Fallback wünschen, müssen Sie das Video aus dem DOM / der Seite entfernen und erneut hinzufügen, damit Flash aktualisiert wird, da Flash keine dynamischen Aktualisierungen von Flash-Variablen erkennt. Wenn Sie JavaScript verwenden, um es dynamisch zu ändern, würde ich alle
<source>
Elemente vollständig entfernen und nur verwendencanPlayType
, um dassrc
in JavaScript undbreak
oderreturn
nach dem ersten unterstützten Videotyp festzulegen, und vergessen Sie nicht, die Flash-Variable mp4 dynamisch zu aktualisieren. Einige Browser registrieren auch nicht, dass Sie die Quelle geändert haben, es sei denn, Sie rufen anvideo.load()
. Ich glaube, das Problem mit.load()
Ihnen kann durch einen ersten Anruf behoben werdenvideo.pause()
. Das Entfernen und Hinzufügen von Videoelementen kann den Browser verlangsamen, da das entfernte Video weiterhin gepuffert wird . Es gibt jedoch eine Problemumgehung .Browserübergreifende Unterstützung
Was den eigentlichen browserübergreifenden Teil betrifft, bin ich auch zu Video For Everybody gekommen . Ich habe bereits das MediaelementJS Wordpress-Plugin ausprobiert, das viel mehr Probleme verursachte als es löste. Ich vermute, die Probleme waren auf das Wordpress-Plug-In und nicht auf die eigentliche Bibliothek zurückzuführen. Ich versuche, etwas zu finden, das wenn möglich ohne JavaScript funktioniert. Bisher habe ich mir dieses einfache HTML ausgedacht:
Wichtige Hinweise :
<source>
da Mac OS Firefox den Versuch, das Video abzuspielen, beendet, wenn es als erstes auf einen MP4 stößt<source>
.video/ogg
, nichtvideo/ogv
.iphone.mp4
Datei ist für das iPhone 4+ vorgesehen, das nur MPEG-4-Videos mit H.264 Baseline 3-Video und AAC-Audio wiedergibt. Der beste Transcoder, den ich für dieses Format gefunden habe, ist Handbrake. Die Verwendung der Voreinstellung für iPhone und iPod Touch funktioniert auf dem iPhone 4+. Damit das iPhone 3GS funktioniert, müssen Sie die Voreinstellung für den iPod verwenden, die eine viel niedrigere Auflösung aufweist, als die ich hinzugefügt habevideo.iphone3g.mp4
.media
Attribut für die<source>
Elemente verwenden, um auf mobile Geräte mit Medienabfragen abzuzielen. Derzeit unterstützen die älteren Apple- und Android-Geräte dies jedoch nicht gut genug.Bearbeiten :
quelle
Ich habe eine ähnliche Web-App und stehe überhaupt nicht vor solchen Problemen. Was ich mache ist so etwas:
Wenn ich dann die Quellen ändern möchte, habe ich eine Funktion, die ungefähr so funktioniert:
Ich mache das, damit der Benutzer eine Wiedergabeliste durchgehen kann, aber Sie können nach userAgent suchen und dann die entsprechende Datei auf diese Weise laden. Ich habe versucht, mehrere Quell-Tags zu verwenden, wie es alle im Internet vorgeschlagen haben, aber ich fand es viel sauberer und zuverlässiger, das src-Attribut eines einzelnen Quell-Tags zu manipulieren. Der obige Code wurde aus dem Speicher geschrieben, daher habe ich möglicherweise einige der Details beschönigt, aber die allgemeine Idee besteht darin, das src-Attribut des Quell-Tags gegebenenfalls mithilfe von Javascript dynamisch zu ändern.
quelle
Versuchen Sie, die OGG-Quelle nach oben zu verschieben. Ich habe bemerkt, dass Firefox manchmal verwirrt ist und den Spieler stoppt, wenn derjenige, den er spielen möchte, OGG, nicht der Erste ist.
Einen Versuch wert.
quelle
Ein anderer Weg, den Sie in Jquery tun können.
HTML
Jquery
quelle
Verwenden von JavaScript und jQuery:
quelle