可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
How to jump to certain time offsets in HTML5 Audio elements?
They say you can simply set their currentTime
property (emphasis mine):
The currentTime
attribute must, on getting, return the current
playback position, expressed in seconds. On setting, if the media
element has a current media controller, then it must throw an
INVALID_STATE_ERR exception; otherwise, the user agent must seek to
the new value (which might raise an exception).
Alas, it doesn\'t seem to work (I need it in Chrome).
There are similar questions, although, no answers.
回答1:
Works on my chrome...
$(\'#audio\').bind(\'canplay\', function() {
this.currentTime = 29; // jumps to 29th secs
});
回答2:
To jump around an audio file, your server must be configured properly.
The client sends byte range requests to seek and play certain regions of a file, so the server must response adequately:
In order to support seeking and playing back regions of the media that
aren\'t yet downloaded, Gecko uses HTTP 1.1 byte-range requests to
retrieve the media from the seek target position. In addition, if you
don\'t serve X-Content-Duration headers, Gecko uses byte-range requests
to seek to the end of the media (assuming you serve the Content-Length
header) in order to determine the duration of the media.
Then, if the server responses to byte range requests correctly, you can set the position of audio via currentTime
:
audio.currentTime = 30;
See MDN\'s Configuring servers for Ogg media (the same applies for other formats, actually).
Also, see Configuring web servers for HTML5 Ogg video and audio.
回答3:
You can use the #t
URI Time range property
and that is valid for both audio and video media.
stackoverflow.mp3#t=8.5 // Will start playing from the 8.5 sec.
var a = new Audio();
a.src= \"http://upload.wikimedia.org/wikipedia/en/4/45/ACDC_-_Back_In_Black-sample.ogg#t=4.5\";
a.play();
If you want to dynamically skip to a specific range, than use HTMLMediaElement.currentTime:
audio.currentTime = 8.5;
回答4:
A much easier solution is
var element = document.getElementById(\'audioPlayer\');
//first make sure the audio player is playing
element.play();
//second seek to the specific time you\'re looking for
element.currentTime = 226;
回答5:
Make sure you attempt to set the currentTime
property after the audio element is ready to play. You can bind your function to the oncanplay
event attribute defined in the specification.
Can you post a sample of the code that fails?
回答6:
Firefox also makes byte range requests when seeking content that it has not yet loaded- it is not just a chrome issue.
Set the response header \"Accept-Ranges: bytes\" and return a 206 Partial Content status code to allow any client to make byte range requests.
See https://developer.mozilla.org/en-US/docs/Web/HTTP/Configuring_servers_for_Ogg_media#Handle_HTTP_1.1_byte_range_requests_correctly
回答7:
I was facing problem that progress bar of audio was not working but audio was working properly. This code works for me. Hope it will help you too.
Here song is the object of audio component.
HTML Part
<input type=\"range\" id=\"seek\" value=\"0\" max=\"\"/>
JQuery Part
$(\"#seek\").bind(\"change\", function() {
song.currentTime = $(this).val();
});
song.addEventListener(\'timeupdate\',function (){
$(\"#seek\").attr(\"max\", song.duration);
$(\'#seek\').val(song.currentTime);
});
回答8:
The @katspaugh\'s answer is correct, but there is a workaround that does not require any additional server configuration. The idea is to get the audio file as a blob, transform it to dataURL
and use it as the src
for the audio
element.
Here is solution for angular $http
, but if needed I can add vanilla JS version as well:
$http.get(audioFileURL,
{responseType:\'blob\'})
.success(function(data){
var fr = new FileReader;
fr.readAsDataURL(data);
fr.onloadend = function(){
domObjects.audio.src = fr.result;
};
});
cautions
- This workaround is not suitable for large files.
- It will not work cross-origin unless CORS are set properly.
回答9:
Set time position to 5 seconds:
var vid = document.getElementById(\"myAudio\");
vid.currentTime = 5;