[在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代码中?
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是什么的人。
这里是一个解决方案,从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
我的脚本对我来说似乎是一种解决方法,但我仍然要寻求更好(更快)的解决方案