I have an html video that I'm trying to render on ios but the video won't autoplay. I found similar questions mentioning to use "playsinline" but I tried this approach and it doesn't fix the issue in my case. Here is how I'm currently displaying the video in Html:
<video class="remoteVideo" playsinline autoplay muted>
<source src="https://192.168.1.134:7278/GetVideo" type="video/mp4;" />
</video>
This gets streamed from some C# .NET Core code:
FileStream fileStream = new FileStream(path, FileMode.Open);
var result = new FileStreamResult(fileStream, contentType)
{
EnableRangeProcessing = true
};
return result;
This approach works great in chrome but on ios its getting this issue where it won't autoplay. If I add "controls" to the video in html then the play button will appear on ios and I can press play and the video will start playing. However, I'm looking to get the video to autoplay and without the video controls.
So, I'm not exactly sure why but, Changing my html to this (with the src specified directly in the video html rather than in a sub "source" html class) fixed the issue:
<video class="remoteVideo" src="https://192.168.1.134:7278/GetVideo" playsinline loop muted autoplay></video>
Audio autoplay is working in Mozilla, Microsoft Edge and old Google Chrome as well but not in Google Chrome 67+ due to a policy change for autoplay.
They have blocked the autoplay (until specific session conditions are met as specified in the linked blogpost). How can one make audio autoplay in Google Chrome 67+?
Solution #1
My solution here is to create an iframe
<iframe src="audio/source.mp3" allow="autoplay" style="display:none" id="iframeAudio">
</iframe>
and audio tag aswell for non-chrome browsers
<audio autoplay loop id="playAudio">
<source src="audio/source.mp3">
</audio>
and in my script
var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
if (!isChrome){
$('#iframeAudio').remove()
}
else {
$('#playAudio').remove() // just to make sure that it will not have 2x audio in the background
}
Solution #2:
There is also another workaround for this according to #Leonard
Create an iframe that doesn't play anything just to trigger the autoplay in the first load.
<iframe src="silence.mp3" allow="autoplay" id="audio" style="display: none"></iframe>
good source for the mp3 file silence.mp3
Then play your real audio file at ease.
<audio id="player" autoplay loop>
<source src="audio/source.mp3" type="audio/mp3">
</audio>
Personally I prefer solution #2 because it is cleaner approach for not relying so much in JavaScript.
Update August 2019
Solution #3
As an alternative we can use <embed>
For Firefox
It seems that audio auto-play is working so we don't need the <embed> element because it will create double audio running.
// index.js
let audioPlaying = true,
backgroundAudio, browser;
browser = navigator.userAgent.toLowerCase();
$('<audio class="audio1" src="audio.mp3" loop></audio>').prependTo('body');
if (!browser.indexOf('firefox') > -1) {
$('<embed id="background-audio" src="audio.mp3" autostart="1"></embed>').prependTo('body');
backgroundAudio = setInterval(function() {
$("#background-audio").remove();
$('<embed id="background-audio" src="audio.mp3"></embed>').prependTo('body');
}, 120000); // 120000 is the duration of your audio which in this case 2 mins.
}
Also if you have a toggle event for your audio make sure to remove the created <embed> element for audio.
Note: After your toggle, it will restart from the beginning because the <embed> is already deleted and the <audio> element will play as normal now.
$(".toggle-audio").on('click', function(event) {
audioPlaying = !audioPlaying;
$("#background-audio").remove();
clearInterval(backgroundAudio);
if (audioPlaying){
$(".audio1").play();
// play audio
}
else {
$(".audio1").pause();
}
And now make sure to hide these <audio> and <embed> elements
audio, embed {
position: absolute;
z-index: -9999;
}
Note: diplay: none and visibility: hidden will make the <embed> element not work.
There is a really neat trick to use the autoplay-function of the audio tag in chrome.
Add
<iframe src="silence.mp3" allow="autoplay" id="audio"></iframe>
whereas silence.mp3 only is 0.5 seconds of silence.
This
<audio id="player" autoplay controls><source src="0.mp3" type="audio/mp3"></audio>
works afterwards.
Chrome notices that a sound has been played and gives the permission for autoplay in audio tags.
As of April 2018, Chrome's autoplay policies changed:
"Chrome's autoplay policies are simple:
Muted autoplay is always allowed.
Autoplay with sound is allowed if:
User has interacted with the domain (click, tap, etc.).
On desktop, the user's Media Engagement Index threshold has been
crossed, meaning the user has previously play video with sound.
On mobile, the user has added the site to his or her home screen.
Also
Top frames can delegate autoplay permission to their iframes to allow
autoplay with sound.
"
Chrome's developer site has more information, including some programming examples, which can be found here: https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
Just add this small script as depicted in https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio
<head>
<script>
window.onload = function() {
var context = new AudioContext();
}
</script>
</head>
Than this will work as you want:
<audio autoplay>
<source src="hal_9000_sorry_dave.mp3">
</audio>
At least you can use this:
document.addEventListener('click', musicPlay);
function musicPlay() {
document.getElementById('ID').play();
document.removeEventListener('click', musicPlay);
}
The music starts when the user clicks anywhere at the page.
It removes also instantly the EventListener, so if you use the audio controls the user can mute or pause it and the music doesn't start again when he clicks somewhere else..
The browsers have changed their privacy to autoplay video or audio due to Ads which is annoying. So you can just trick with below code.
You can put any silent audio in the iframe.
<iframe src="youraudiofile.mp3" type="audio/mp3" allow="autoplay" id="audio" style="display:none"></iframe>
<audio autoplay>
<source src="youraudiofile.mp3" type="audio/mp3">
</audio>
Just add an invisible iframe with an .mp3 as its source and allow="autoplay" before the audio element. As a result, the browser is tricked into starting any subsequent audio file. Or autoplay a video that isn’t muted.
You may simply use (.autoplay = true;) as following (tested on Chrome Desktop):
<audio id="audioID" loop> <source src="path/audio.mp3" type="audio/mp3"></audio>
<script>
var myaudio = document.getElementById("audioID").autoplay = true;
</script>
If you need to add stop/play buttons:
<button onclick="play()" type="button">playbutton</button>
<button onclick="stop()" type="button">stopbutton</button>
<audio id="audioID" autoplay loop> <source src="path/audio.mp3" type="audio/mp3">
</audio>
<script>
var myaudio = document.getElementById("audioID");
function play() {
return myaudio.play();
};
function stop() {
return myaudio.pause();
};
</script>
If you want stop/play to be one single button:
<button onclick="PlayStop()" type="button">button</button>
<audio id="audioID" autoplay loop> <source src="path/audio.mp3" type="audio/mp3">
</audio>
<script>
var myaudio = document.getElementById("audioID");
function PlayStop() {
return myaudio.paused ? myaudio.play() : myaudio.pause();
};
</script>
If you want to display stop/play on the same button:
<button onclick="PlayStop()" type="button">Play</button>
<audio id="audioID" autoplay loop> <source src="path/audio.mp3" type="audio/mp3">
</audio>
<script>
var myaudio = document.getElementById("audioID");
function PlayStop() {
if (elem.innerText=="Play") {
elem.innerText = "Stop";
}
else {
elem.innerText = "Play";
}
return myaudio.paused ? myaudio.play() : myaudio.pause();
};`
</script>
In some browsers audio may doesn't work correctly, so as a trick try adding iframe before your code:
<iframe src="dummy.mp3" allow="autoplay" id="audio" style="display:none"></iframe>
<button onclick="PlayStop()" type="button">Play</button>
<audio id="audioID" autoplay loop> <source src="path/audio.mp3" type="audio/mp3">
</audio>
<script>
var myaudio = document.getElementById("audioID");
function button() {
if (elem.innerText=="Play") {
elem.innerText = "Stop";
}
else {
elem.innerText = "Play";
}
return myaudio.paused ? myaudio.play() : myaudio.pause();
};
</script>
On adress bar click site settings, or for copy this address (localhost) and select allow on Sound
chrome://settings/content/siteDetails?site=https%3A%2F%2Flocalhost
Since 2020 this is a browser-related setting and cannot be enabled by html-code. The autoplay is blocked by default on most browsers. Here is where you can find it:
Firefox : where to enable/disable autoplay
Chrome : where to enable/disable autoplay
[EDIT # Sep. 7, 2021]
Just received some downvotes few days ago and I guess I have to make it clear: this solution REQUIRES users to hover their mouse over the webpage to work. There's no way to play sound on chrome without user interaction as it's blocked on purpose. The internet is now filled with intimidating ads and no one wants their browser spamming sounds from ads whenever they visit a website.
[EDIT # Dec. 22, 2021] I was a clown by spreading misinformation
Turns out some folks didn't grasp an important point of this method. You MUST enclose all parts in the <body> section with a <div>, as states below in the original description. This will NOT work on jsfiddle as it uses an embedded <iframe> document, which is exactly what Chrome is supposed to block.
[EDIT # Dec. 24, 2021]
Turns out I was a clown. Chrome blocks autoplay whenever users land on a page under a domain different from the last page they visited. Here are some demo I made:
If you visit the autoplay demo through this link, it will work properly.
However, this direct link will not work as the target domain is different from this very page.
[Original]
If you're OK with enclosing the whole HTML <body> with a <div> tag, here is my solution, which works on Chrome 88.0.4324.104 (the latest version as of Jan., 23, 2021).
First, add the audio section along with a piece of script shown below at the start of <body> section:
<audio id="divAudio">
<source src="music.mp3" type="audio/mp3">
</audio>
<script>
var vAudio = document.getElementById("divAudio");
var hasInit = false;
function playMusic()
{
if(!hasInit)
{
hasInit = true;
vAudio.play();
}
}
</script>
Second, enclose your whole HTML <body> contents (excluding the inserted piece of code shown above) with a dummy section <div onmouseover="playMusic()">. If your HTML <body> contents are already enclosed by a global <div> section, then just add the onmouseover="playMusic()" tag in that <div>.
The solution works by triggering the playMusic() function by hovering over the webpage and tricks Chrome of "thinking" that the user has done something to play it. This solution also comes with the benefit that the piece of audio would only be played when the user is browsing that page.
You could use <iframe src="link/to/file.mp3" allow="autoplay">, if the origin has an autoplay permission. More info here.
i used pixi.js and pixi-sound.js to achieve the auto play in chrome and firefox.
<script>
PIXI.sound.Sound.from({
url: 'audios/tuto.mp3',
loop:true,
preload: true,
loaded: function(err, sound) {
sound.play();
document.querySelector("#paused").addEventListener('click', function() {
const paused = PIXI.sound.togglePauseAll();
this.className = this.className.replace(/\b(on|off)/g, '');
this.className += paused ? 'on' : 'off';
});
}
});
</script>
HTML:
<button class="btn1 btn-lg off" id="paused">
<span class="glyphicon glyphicon-pause off"></span>
<span class="glyphicon glyphicon-play on"></span>
</button>
it also works on mobile devices but user have to touch somewhere on the screen to trigger the sound.
Use iframe instead:
<iframe id="stream" src="YOUTSOURCEAUDIOORVIDEOHERE" frameborder="0"></iframe>
temp fix
$(document).on('click', "#buttonStarter", function(evt)
{
var context = new AudioContext();
document.getElementById('audioPlayer').play();
$("#buttonStarter").hide()
$("#Game").show()
});
Or use a custom player to trigger play
http://zohararad.github.io/audio5js/
Note : Autoplay will be renabled in 31 December
Solution without using iframe, or javascript:
<embed src="silence.mp3" type="audio/mp3" autostart="true" hidden="true">
<audio id="player" autoplay controls><source src="source/audio.mp3" type="audio/mp3"></audio>
With this solution, the open/save dialog of Internet Explorer is also avoided.
<embed src="http://deinesv.cf/silence.mp3" type="audio/mp3" autostart="true" hidden="true">
<audio id="player" autoplay controls><source src="https://freemusicarchive.org/file/music/ccCommunity/Mild_Wild/a_Alright_Okay_b_See_Through/Mild_Wild_-_Alright_Okay.mp3" type="audio/mp3"></audio>
I've been banging away at this today, and I just wanted to add a little curiosum that I discovered to the discussion.
Anyway, I've gone off of this:
<iframe src="silence.mp3" allow="autoplay" id="audio" style="display:none"></iframe>
<audio id="audio" autoplay>
<source src="helloworld.mp3">
</audio>
This:
<audio id="myAudio" src="helloworld.mp3"></audio>
<script type="text/javascript">
document.getElementById("myAudio").play();
</script>
And finally this, a "solution" that is somewhat out of bounds if you'd rather just generate your own thing (which we do):
<script src='https://code.responsivevoice.org/responsivevoice.js'></script>
<input onclick='responsiveVoice.speak("Hello World");' type='button' value='Play' />
The discovery I've made and also the truly funny (strange? odd? ridiculous?) part is that in the case of the former two, you can actually beat the system by giving f5 a proper pounding; if you hit refresh repetetively very rapidly (some 5-10 times ought to do the trick), the audio will autoplay and then it will play a few times upon a sigle refresh only to return to it's evil ways.
Fantastic!
In the announcement from Google it says that for media files to play "automatically", an interaction between the user and the site must have taken place. So the best "solution" that I've managed to come up with thus far is to add a button, rendering the playing of files less than automatic, but a lot more stable/reliable.
I thought I would add what I found that will work for our solution. We will be hosting a site in our domain and we can add that site to Chrome's settings to allow auto-play.
I understand why autoplay is usually a little onerous but in this case for our organization it made sense to allow it.
The location in Chrome to allow autoplay by URL is: chrome://settings/content/sound?search=sound
In development with ASP.NET Core MVC, I just added the word: Localhost and that got it working for me (*Note it needs to be added in the Chrome Browser Visual Studio opens automatically).
In your HTML file <audio src="/path/to/your/music.mp3" autoplay></audio> or this
<audio id="musicplayer" autoplay>
<source src="/path/to/your/music.mp3" />
</audio>
And in your js file just add this line of code:audioElement.play(); This will play your music!
Notice that browsers often provide various forms of autoplay blocking
I add controls attribute too tag audio, and simply hide it in CSS.
And all works fine in Chrome.
<audio autoplay loop controls id="playAudio">
<source src="audio/source.mp3">
</audio>
The video tag can play audio as well. Given the audio tag doesn't seem to be behaving as it should be, you can just use the video tag for audio:
<video autoplay muted id="audio1" src="your.mp3" type="audio/mp3">
Your browser does not support the <code>video</code> element.
</video>
<script>
unmuteButton.addEventListener('click', function()
{
if ( unmuteButton.innerHTML == "unmute" )
{
unmuteButton.innerHTML = "mute";
audio1.muted = false;
} else {
unmuteButton.innerHTML = "unmute";
audio1.muted = true;
}
});
</script>
This little trick worked for me. I used a video tag instead. Auto played the video as muted and set the muted property to false on the window's load event.
<video autoplay loop muted>
<source src="sample.mp3" />
</video>
<script>
window.onload = function () {
document.querySelector("video").muted = false;
};
</script>
Google changed their policies last month regarding auto-play inside Chrome. Please see this announcement.
They do, however, allow auto-play if you are embedding a video and it is muted. You can add the muted property and it should allow the video to start playing.
<video autoplay controls muted>
<source src="movie.mp4" type="video/mp4">
<source src="movie.ogg" type="video/ogg">
Your browser does not support the video tag.
</video>
The default HTML5 audio autoplay attribute is not working in chrome, but you can force audio autoplay using JavaScript. Try this:
document.getElementById('myAudio').play();
This works for me.
Rephrasing the question
HTML5 video autoplay is not working in slick.js on chrome and safari.
everthing is working fine in firefox.
Autoplay works fine outside the slick container.
I tried this:
Video auto play is not working in Safari and Chrome desktop browser
But cant seem to get it to work.
My slick setup
$(document).ready(function () {
$('.slick-hero').on('init', function (e, slick) {
var $firstAnimatingElements = $('div.slick-hero:first-child').find('[data-animation]');
doAnimations($firstAnimatingElements);
});
$('.slick-hero').on('beforeChange', function (e, slick, currentSlide, nextSlide) {
console.log(nextSlide);
var $animatingElements = $('div.slick-slide[data-slick-index="' + nextSlide + '"]').find('[data-animation]');
console.log($animatingElements.length);
doAnimations($animatingElements);
});
$('.slick-hero').slick({
autoplay: true,
autoplaySpeed: 7000,
pauseOnHover: false,
speed: 1000,
dots: true,
fade: true,
adaptiveHeight: true
});
function doAnimations(elements) {
var animationEndEvents = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend';
elements.each(function () {
var $this = $(this);
var $animationDelay = $this.data('delay');
var $animationType = $this.data('animation');
$this.css({
'animation-delay': $animationDelay,
'-webkit-animation-delay': $animationDelay
});
$this.addClass($animationType).one(animationEndEvents, function () {
$this.css({});
$this.removeClass($animationType);
});
});
}
});
Original question:
I cant get a simpel HTML5 video to autoplay.
everthing is peachy in Firefox.
My relatively straight forward implementation
<video poster="assets/video/ocean.jpg" id="bgvid" controls autoplay loop muted>
<source src="assets/video/ocean.mp4" type="video/mp4">
<source src="assets/video/ocean.webm" type="video/webm">
<source src="assets/video/ocean.ogv" type="video/ogg">
</video>
This doesn't work!!! the controlls work fine, but autoplay doesn't.
I tried opening it in the browser by double-clicking, via localhost and on a my own website... nothing.
The URL´s to the videos are fine, i tested them.
Im on a macbook pro using latest version of chrome and safari.
Everything works just fine in firefox.
This example works fine:
http://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_video_autoplay,
This example works fine:
https://codepen.io/dudleystorey/pen/knqyK
Tried using this allso:
https://github.com/VodkaBears/Vide/
The demo files work just fine.
But when i trie to implement it on my own code, then it just shows the poster image.
Re-posting the answer from a related question:
After using jQuery play() or DOM maniupulation as suggested by the other answers, it was not still working (Video wasn't autoplaying) in the Chrome for Android (Version 56.0).
As per this post in developers.google.com, From Chrome 53, the autoplay option is respected by the browser, if the video is muted.
So using autoplay muted attributes in video tag enables the video to be autoplayed in Chrome browsers from version 53.
Expert from the above link:
Muted autoplay for video is supported by Chrome for Android as of version 53. Playback will start automatically for a video element once it comes into view if both autoplay and muted are set[...]
<video autoplay muted>
<source src="video.webm" type="video/webm" />
<source src="video.mp4" type="video/mp4" />
</video>
Muted autoplay is supported by Safari on iOS 10 and later.
Autoplay, whether muted or not, is already supported on Android by Firefox and UC Browser: they do not block any kind of autoplay.
If any of the parents of this video tag in your code have any DOM manipulation on them, autoplay won't work in Safari and Chrome. Here's a similar question with answers that should help you:
Video auto play is not working in Safari and Chrome desktop browser
I'm trying to get a video to work with videoJS and with the help of the videoJS guide I got it working on Chrome and Firefox, but not IE8.
I've added the CDN tags to my head and created a videotag.
I'm using the following:
<video id="my_vid" class="video-js vjs-default-skin"
controls preload="auto" width="244px" height="196px"
poster="img/poster.jpg">
<source src="files/mymov.mp4" type='video/mp4' />
<source src="files/mymov.webm" type='video/webm' />
<source src="files/mymov.ogv" type='video/ogg' />
</video>
It seems like the Flash fallback isn't working in IE8, since it doesn't create a flash object when I look in my inspector (which it does at the homepage of videojs.com). The video tag just remains, and IE8 can't cope with that. The video on the homepage of videojs.com is shown properly in IE8.
What am I doing wrong?
Solved: It seems like I had to add data-setup="{}" as an attribute in the video tag. The only problem now is that the video won't play in Chrome.
You can force videJS to display flash. You can use rtmp streaming to use flash
vjs.options.techOrder = ["flash", "html5", "links"];
$(document).ready(function() {
setTimeout(function() {
vjs("videoPlayer").ready(function() {
var swfVideo = $("#videoPlayer_flash_api")[0];
swfVideo.vjs_setProperty("RTMPConnection", "path");
swfVideo.vjs_setProperty("RTMPStream", "videoName");
});
}, 1000);
});
Platform: Android version 4.x
Issue: HTML 5 Audio Tag
Compiled: Framework Phonegap
I have been trying to play a simple sound with HTML 5, i cant get it to work.
I read that there is a general "not supporting" thing going on with Android, but as i understand it, version 4.x supports HTML 5 Audio tag.
Config.xml
I did enable some of the features in it eg. File access, device access and so, i even tried to include all features. Just to let u guys know.
HTML
This is what i am working with atm, i figured that maybe i should go back to directly try and get a sound out, then make the costum controls with JQ.
<audio controls="true">
<source src="media/sound.mp3" type="audio/mpeg">
<source src="media/sound.ogg" type="audio/ogg">
<source src="media/sound.wav" type="audio/wav">
Your browser does not support HTML5 audio.
</audio>
Conclusion
So far i havent hear any sounds, i tried to trigger it different ways like:
var Newsound = new Audio("sound.ogg");
Newsound.play();
Any idea or suggestion is welcome.
Thanks in advance :-)
You generally need a piece of JavaScript to get this working. Try the following:
<audio id="a" controls="true">...
var audio = document.getElementById('a');
audio.addEventListener('touchstart', function() { audio.play(); }, false);
When a user touches the audio element the sound should now play.
#Ian Devlin
I tried it, and i dident get a sound so far.
New updated exmaple:
HTML Head Section
<script>
var audio = document.getElementById('myplayer');
audio.addEventListener('touchstart', function() { audio.play(); }, false);
</script>
HTML Body Section
<body>
<audio controls="true" id="myplayer">
<source src="media/1.mp3" type="audio/mpeg">
<source src="media/1.ogg" type="audio/ogg">
<source src="media/1.wav" type="audio/wav">
Your browser does not support HTML5 audio.
</audio>
</body>
Experiencing same issue in Android >= 4.2, in Android from 2.2 to 4.0 works fine, don't have a 4.1 Android at hand to see if it works, this is my code:
<audio autoplay loop autobuffer>
<source src="http://buecrplb01.cienradios.com.ar/Mitre790.mp3" type="audio/mpeg" />
</audio>
Note on loop attribute: I've found some streams played for 1 second and stopped, after adding loop attr they played continuously.