设置HTML5音频位置


69

如何跳到HTML5音频元素中的某些时间偏移?

他们说您可以简单地设置其currentTime属性(重点是我的):

currentTime属性在获取时必须返回以秒为单位的当前播放位置。设置时,如果媒体元素具有当前媒体控制器,则它必须引发INVALID_STATE_ERR异常;否则,它将抛出INVALID_STATE_ERR异常。否则,用户代理必须寻求新值(这可能会引发异常)。

las,它似乎不起作用(我需要在Chrome中使用它)。

有类似的问题,但是没有答案。


Answers:


56

适用于我的Chrome浏览器...

$('#audio').bind('canplay', function() {
  this.currentTime = 29; // jumps to 29th secs
});

6
soemarko,谢谢!将音频的URL设置为您在jsbin中提供的音频的URL后,currentTime开始工作。所以我想那是服务器的事,因为我曾经python -m SimpleHTTPServer提供音频文件。
katspaugh 2012年

73

要在音频文件中跳转,必须正确配置服务器。

客户端发送字节范围请求以查找和播放文件的某些区域,因此服务器必须充分响应:

为了支持搜索和播放尚未下载的媒体区域,Gecko使用HTTP 1.1字节范围请求从搜索目标位置检索媒体。另外,如果您不提供X-Content-Duration标头,则Gecko使用字节范围请求查找到媒体的末尾(假定您提供Content-Length标头),以确定媒体的持续时间。

然后,如果服务器正确响应了字节范围请求,则可以通过currentTime以下方式设置音频的位置:

audio.currentTime = 30;

请参阅MDN的为Ogg媒体配置服务器(实际上,其他格式也一样)。

另外,请参阅为HTML5 Ogg视频和音频配置Web服务器


8
+1是解决真正的问题的方法,这是SimpleHTTPServer只是不理解字节范围请求的HTTP 1.0服务器。
丹尼尔·卢巴罗夫

3
+1用于用JavaScript回答一个JavaScript问题,而不是让每个人都跨过桥,因为其他人都是框架。
约翰

5
据我所知,WebKit / Chrome搜索在使用时才有效Accept-Ranges: bytes,即使对于已经缓冲(设置Content-LengthX-Content-Duration无济于事)的数据也是如此。这很奇怪,因为并非所有后端都能够来支持内容范围(我不这样做,因为我们会即时转换文件)。
马丁·图尔诺伊

1
正是我正在处理的-Django的网络服务器无法处理字节范围的请求,并且无论加载状态或传递的currentTime值如何,回放始终从Chrome的开头开始。
Marek Jalovec 2015年

1
因此,在总结,把Header set Accept-Ranges bytes 你的.htaccess家伙,谢谢。自2013年以来我就在这里:|
yPhil

18

这两个音频视频媒体接受#tURI时间范围属性

song.mp3 #t = 8.5

动态跳到特定点,请使用HTMLMediaElement。currentTime

audio.currentTime = 8.5;

1
似乎并不能在所有浏览器中都充当直接链接,但是仍然很有帮助。
约瑟夫·可可

我认为链接已过时。下面是我找到的链接:developer.mozilla.org/de/docs/Web/HTML/...
库尔特·穆勒

@KurtMueller两个链接都可以。谢谢
Roko C. Buljan

我认为您发布的第一个链接不会告诉您如何设置音频文件的时间范围。
Kurt Mueller

11

一个简单的解决方案是

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;

8

确保在音频元素准备好播放之后尝试设置currentTime属性。您可以将函数绑定到规范中定义的事件属性。oncanplay

您可以发布失败的代码示例吗?


龙,我将尝试该活动,谢谢!虽然,我是currentTime从控制台设置 的,当音频已经播放时。
katspaugh 2012年


6

我面临的问题是音频进度条无法正常工作,但音频正常工作。该代码对我有用。希望它也会对您有帮助。歌曲是音频组件的对象。

HTML部分

<input type="range" id="seek" value="0" max=""/>

jQuery部分

    $("#seek").bind("change", function() {
            song.currentTime = $(this).val();               
        });

song.addEventListener('timeupdate',function (){

    $("#seek").attr("max", song.duration);
    $('#seek').val(song.currentTime);
    });

5

@katspaugh的答案是正确的,但是有一种解决方法不需要任何其他服务器配置。这个想法是让音频文件作为一个blob,它转换dataURL,并用它作为srcaudio元素。

这是angular的解决方案$http,但是如果需要,我也可以添加香草JS版本:

$http.get(audioFileURL,
        {responseType:'blob'})
        .success(function(data){
            var fr = new FileReader;
            fr.readAsDataURL(data);
            fr.onloadend = function(){
                domObjects.audio.src = fr.result;
            };
        });

注意事项

  1. 此解决方法不适用于大文件。
  2. 除非正确设置CORS,否则它将无法跨域使用。

尽管我不确定是否需要dataURL,但是可以生成一个blob URL:URL.createObjectURL(data)吗?
bluejayke

@bluejayke是的,在获取数据之后,您可以执行以下操作:URL.createObjectURL(new Blob([data])),但是您需要从blob数据中获取一个新的blob对象
Lucas Andrade

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.