如何从多个音频文件中获取总音频持续时间

牛扒

我试图从一组音频路径中获取音频的总持续时间。

这是数组的样子:

var sound_paths = ["1.mp3","2.mp3",...]

我看过这篇文章,它有帮助:如何通过函数获取 audio.duration 值

但是,我不知道如何通过数组实现这一点。这个想法是我想遍历每个音频文件,获取其持续时间,并将其添加到“sum_duration”变量中。

我似乎无法找到通过 for 循环执行此操作的方法。我已经尝试过 Promises(我承认我是新手):(注意函数来自一个类)

getDuration(src,cb){
    // takes a source audio file and a callback function
    var audio = new Audio();
    audio.addEventListener("loadedmetadata",()=>{
        cb(audio.duration);
    });
    audio.src = src;
}

getAudioArrayDuration(aud_path_arr){
    // takes in an array of audio paths, finds the total audio duration
    // in seconds

    return new Promise((resolve)=>{
        var duration = 0;

        for(const aud_path in aud_path_arr){
            var audio = new Audio();
            audio.src = aud_path;
            audio.onloadedmetadata = ()=>{
                console.log(audio.duration);
                duration += audio.duration;
            }
            resolve(duration);
        }

    });

}

但是,这显然不起作用,只会返回持续时间值 0。

如何循环音频文件并返回每个文件的总音频持续时间?

观风者

我认为,在这种情况下,使用 Promise 是正确的方法,是时候习惯它们了 ;) 试着记住,一个 Promise 将在不久的将来实现你的愿望。让你的问题更难的是你有一个文件数组要检查,每个文件都需要被它自己的 Promise 单独覆盖,这样你的程序就可以知道何时所有文件都已满。

我总是称我的“承诺”getter 为“fetch...”,这样我就知道它会返回一个承诺而不是一个直接值。

function fetchDuration(path) {
  return new Promise((resolve) => {
    const audio = new Audio();
    audio.src = path;
    audio.addEventListener(
      'loadedmetadata',
      () => {
        // To keep a promise maintainable, only do 1
        // asynchronous activity for each promise you make
        resolve(audio.duration)
      },
    );
  })
}

function fetchTotalDuration(paths) {
  // Create an array of promises and wait until all have completed
  return Promise.all(paths.map((path) => fetchDuration(path)))
    // Reduce the results back to a single value
    .then((durations) => durations.reduce(
      (acc, duration) => acc + duration,
      0,
    ))
  ;
}

在某些时候,你的代码将不得不处理这些异步的东西,老实说,我相信 Promises 是最简单的方法。这需要一点时间来适应,但最终它会是值得的。以上可以在您的代码中使用以下内容:

window.addEventListener('DOMContentLoaded', () => {
  fetchTotalDuration(["1.mp3","2.mp3",...])
    .then((totalDuration) => {
      document.querySelector('.player__total-duration').innerHTML = totalDuration;
    })
  ;
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何获取iOS中音频文件的持续时间?

如何获得颤动的音频文件的持续时间?

如何使用jQuery获取音频文件的当前持续时间

如何获得音频文件的总时间?

从URL提取音频文件持续时间

在上传之前验证音频文件的持续时间

如何在Django中获取FileField的音频持续时间?

使用go lang获取caf音频文件的持续时间

如何快速获得任何音频文件的准确持续时间?

如何将 JProgressBar 设置为音频文件的持续时间?

在AudioKit中创建一个特定持续时间的空白音频文件

FFMPEG:元数据中的flac音频文件持续时间为0

在音频文件中给定的持续时间添加蜂鸣或静音 NAudio || C#

mplayer(通过控制台)并不总是显示音频文件的持续时间-如何更改行为?

获取.ogg音频剪辑持续时间

iOS 从 avplayer 获取音频持续时间

使用libsndfile获取音频持续时间

输出音频文件未正确创建或持续时间未知

确定没有第三方成分的音频文件的持续时间

为什么我不能将音频文件的持续时间格式化为 textView?

如何设置音频持续时间

获取音频文件长度(时间)的函数

如果视频持续时间大于ffmpeg中的音频持续时间,如何添加视频的替换音频并循环播放音频?

如何串联多个具有特定重叠持续时间的简短音频MP3文件

如何在 google colab 中显示多个音频文件?

如何在flutter中同时播放多个音频文件

如何在python脚本中运行多个音频文件

如何在特定时间使用 ffmpeg 在静音音频文件上添加多个音频文件?

HTML音频对象报告错误的文件持续时间