如何以秒为单位(在js程序中,以秒为单位查找webm(opus)音频文件的持续时间?

问题描述 投票:0回答:2

[在JavaScript网页上,我使用HTML5 Media API生成了一条音频消息,然后通过socketio将其发送到将文件保存在磁盘上的nodejs服务器。都可以。

Javascript块,客户端:

navigator.mediaDevices
  .getUserMedia({ audio: true })
    .then(stream => {

      const mediaRecorder = new MediaRecorder(stream)
      ...
      }

服务器端我成功保存了webm / opus文件:

$ ll audiofiles/audiofile.webm
-rw-rw-r-- 1 username 180K May 29 21:04 audiofiles/audiofile.webm

使用vlc播放器,我看到以秒为单位的持续时间几乎是28秒。

让我们通过mediainfo / ffmpeg进行检查:

使用mediainfo

$ mediainfo audiofiles/audiofile.webm
General
Complete name                            : audiofiles/audiofile.webm
Format                                   : WebM
Format version                           : Version 4 / Version 2
File size                                : 180 KiB
Writing application                      : Chrome
Writing library                          : Chrome
IsTruncated                              : Yes

Audio
ID                                       : 1
Format                                   : Opus
Codec ID                                 : A_OPUS
Channel(s)                               : 1 channel
Channel positions                        : Front: C
Sampling rate                            : 48.0 kHz
Bit depth                                : 32 bits
Compression mode                         : Lossy
Language                                 : English
Default                                  : Yes
Forced                                   : No

使用ffmpeg

$ ffmpeg -hide_banner -i audiofiles/audiofile.webm
Input #0, matroska,webm, from 'audiofiles/audiofile.webm':
  Metadata:
    encoder         : Chrome
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0(eng): Audio: opus, 48000 Hz, mono, fltp (default)
At least one output file must be specified

我的问题是:

我如何在节点服务器日志文件的服务器端跟踪webm音频文件的长度(以秒为单位?

我需要具有文件的近似持续时间(以秒为单位)。可能使用nodejs函数。

运行时不良/粗糙的解决方案可能是根据经验将文件的长度(以字节为单位)与秒的长度进行映射...对于特定的编码/格式,例如:1000字节〜= 1秒。

还有更好的方法来测量音频文件的持续时间,可能在nodejs代码中?

javascript audio duration webm mediadevices
2个回答
0
投票

Node.js以其音频功能而闻名。

我喜欢用经验的方法来映射文件的长度以确定持续时间,如果可以提取采样率或类似信息进行计算,我相信您可以得到一些结果,但是如果您可以ffmpeg在您的环境中,我个人将使用一个子进程来获取该信息:

const { exec } = require('child_process');

let your_webm_file = 'audiofiles/audiofile.webm';

// https://trac.ffmpeg.org/wiki/FFprobeTips#Duration
let cmd_ffprobe_duration = `ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 ${your_webm_file}`;

exec(cmd_ffprobe_duration, (error, duration, stderr) => {
  if (error || stderr)
    return console.error('Can\'t determine webm file duration');
  console.log(duration);  // 30.543000
});

对于像我这样不知道ll是什么的人。


0
投票

这里是一个解决方案,从Tgrif提案开始。下面的bash脚本将输入的webm文件转换为中间/临时的wav文件。

$ cat com/duration
#!/bin/bash

#
# calculate duration in seconds of a webm file
# converting it in a wav temporary file
#
# usage: com/duration audiofiles/audiofile.webm
#

INPUT_FILE=$1
TMP_FILE=$1.wav

ffmpeg -loglevel panic -i $INPUT_FILE -y $TMP_FILE
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $TMP_FILE
rm $TMP_FILE

用法:

$ com/duration audiofiles/audiofile.webm 
28.380000


$ time com/duration audiofiles/audiofile.webm 
28.380000

real    0m0.182s
user    0m0.151s
sys 0m0.031s

我的脚本对我来说似乎是一种解决方法,但我仍然要寻求更好(更快)的解决方案

© www.soinside.com 2019 - 2024. All rights reserved.