gpt4 book ai didi

javascript - 第一次使用 HTML5

转载 作者:行者123 更新时间:2023-11-29 16:56:50 29 4
gpt4 key购买 nike

这是一个非常令人费解的问题,我在这里纠缠了好几次都没有找到解决方案。 That question was getting too complicated正确获取我的所有更新和格式,所以让我们从这里重新开始。

基本问题是音频剪辑是从网页上启动的,网页上有某种音频播放器。当页面出现时,浏览器不知道剪辑的持续时间,并且第一次播放时,无论播放器的 UI 是什么,都无法显示播放器播放文件的进度,即使播放剪辑时可以听到。播放器完成剪辑后,它还会了解持续时间,并且在随后的重播中,UI 会显示进度。

这是当前的游戏状态:

1) 最初的问题假定 jQuery jPlayer 与问题有关,但随后的测试表明它没有。 删除 jPlayer 并改为使用 HTML5 音频标签会显示完全相同的问题。

2) 最初我认为问题可能出在 .vox 文件到 .wav 的 SoX 转换上,但是 a go-round on the SoX mailing list说服我事实并非如此。

3) 有人建议(主要是 Gyrocode.com)问题可能在于使用 .wav 文件,但我可以用 .ogg 和其他格式重现完全相同的问题。

我能看到的一些 the samples that have been shown by Gyrocode 之间的唯一区别我正在做的是我的代码最初放入一个虚拟源,然后在向用户显示音频播放器之前动态更改它(在模态对话框内)。

下面是骨架形式的代码。

HTML:

<div class="form-group">
<label class="col-sm-4 control-label">Play Audio</label>
<div class="col-sm-8">
<div style="box-sizing:content-box;" class="container" id="player-container">
<audio controls src="NONE" id="audio-player" preload="metadata"></audio>
</div>
</div>
</div>

JS:

/**
* JavaScript functions for populating data on the transcripts page.
*/

var oParams = new Object();
// temporarily hardcoded
oParams.userId="sc1478";
oParams.audioId="";
var oAudioList;

// loads the data table
function showModalTranscribeDialog(id) {
console.log( 'You clicked on the row for audio id '+id );
oParams.audioId=id;
$('#playTranscribeModal').modal('show');
}

function fnLoadAudio() {
console.log('in fnLoadAudio');
var url="x/audio/" + oParams.userId + "/";
console.log("searching " + url);
oAudioList = $('#audiolist').DataTable({
"pageLength" : 10,
"processing" : true,
"serverSide" : false,
"cache" : false,
"ajax" : {
"url" : url,
"dataSrc" : "payload.listOfAudio"
},
"columns" : [{
"data" : "audioId",
"title" : "Audio ID",
"width" : "6%"
}, ...
],
"columnDefs" : [
...
],
});
// clicking on row of table brings up modal dialog for playing and
// transcribing
$('#audiolist tbody').on('click', 'tr', function () {
var id = $('td', this).eq(0).text();
showModalTranscribeDialog(id);
} );
console.log('done with fnLoadAudio');
}

...

// load clip into audio player
function fnLoadPlayer() {
var alerted = false;
var media_url_wav='audio/clip/wav/'+oParams.audioId+'/';

console.log("player will play " + media_url_wav);
$("#audio-player").attr("src", media_url_wav);
}

$(document).ready(function() {

console.log('in document ready !!');
$('#dynamic').html( '<table cellpadding="0" cellspacing="0" border="0" class="display" id="audiolist"></table>' );
fnLoadAudio();

// set the ID of the selected audio in the dialog when the playTranscribe
//modal dialog is shown
$('#playTranscribeModal').on('show.bs.modal', function (e) {
...

fnLoadPlayer();

});

...
});

代码如下:

页面上有一个 JQuery 数据表,它还包含一个模式对话框,当单击表格的一行时会弹出一个模式对话框,以便从用户那里进一步收集数据。此对话框包含音频播放器。显示对话框并且用户单击播放按钮时播放音频。

数据表在文档准备好后加载。就绪事件处理程序调用 fnLoadAudio() 填充数据表,并为单击表格行时设置单击处理程序。在那种情况下,函数 showModalTranscribeDialog() 被调用。这首先使用行数据获取要播放的音频的 id,并显示对话框。在显示对话框时,另一个事件处理程序使用 id 获取音频的正确 URL,然后才将其设置到对话框元素的 src 属性中。

这里要说明的一点是,音频元素的 src 属性在对话框出现之前不会被填充,尽管音频元素一直在对话框中(但隐藏),具有其他一些 src 值.

我的理论是,正是这种设置 src 的方式导致了问题,当音频的 src 以常规方式硬编码在页面上时,不会发生这种情况。

我的问题是,鉴于所描述的页面结构,是否有更好的方法来动态设置音频播放器的源。

最佳答案

答案很简单,持续时间(通常)不是元数据的一部分!如果在播放前知道持续时间,那是因为源是作为文件而不是流传送的。我的应用使用提供流的 API 调用。

呃!

某些格式(例如 .mp3)可能会在元数据中包含持续时间标签,但这不是强制性的并且 perhaps not even a good thing.

我在我的网络应用程序中制作了一个带有两个标签的测试页。

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Audio Test Page</title>
</head>
<body>
<h1>Audio Test Page</h1>
<br/>
<audio controls src="audio/clip/wav/103659/" id="audio-test-player" preload="auto"></audio>
<br/>
<audio controls src="audiotest/test.wav" id="audio-test-player2" preload="auto"></audio>
<br/>
</body>
</html>

第一个执行常规应用程序执行的操作。它进行 API 调用,将文件作为流返回。实际上是相同的 API。它将文件作为 InputStream 读取,然后将其复制到响应的 OutputStream 中。

第二个加载与我临时放置在 webapp 中的静态资源相同的文件。

第一个也无法加载持续时间(即使使用 preload="auto")。

第二个加载持续时间(即使使用 preload="metadata")。

似乎当源作为文件交付时,浏览器有机会查看文件的大小并应用一些逻辑来预先确定持续时间。这与 soxi 实用程序用来猜测持续时间的逻辑相同 as detailed here

$ soxi /var/tmp/test.wav

Input File : '/var/tmp/test.wav'
Channels : 1
Sample Rate : 8000
Precision : 16-bit
Duration : 00:00:10.48 = 83840 samples ~ 786 CDDA sectors
Sample Encoding: 16-bit Signed Integer PCM

但是,当源作为流传输时,文件大小未知,无法进行此计算。

一个可能的解决方案可能是在标准或自定义元数据标签中的元数据中包含计算的持续时间,并为某些播放器设置皮肤以使用它,但基本问题是预期之一。

持续时间通常不是元数据的一部分,并且不能由浏览器在流式传输源时计算。

因此我们得出了这个跨越过去的恼人问题的不完全令人满意但最终理解的答案

我的用例有点不标准,可能不是大多数声音 API 用户想要实现的目标。

关于javascript - 第一次使用 HTML5 <audio> 标签播放时音频剪辑没有获得持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31818821/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com