我想使用 Linuxarecord
命令来使用文件时间标志或类似功能来记录和保存多个 FLAC 类型文件:
--max-file-time
对于 wav 文件,使用标志保存多个文件相当简单--max-file-time
。在下面的示例中,每 10 秒存储一个新的 wav 文件,其中包含 6 声道音频:
arecord -t raw -f S16_LE -r 44100 --max-file-time 10 -D ac108 -c 6 --use-strftime listen-%H-%M-%v.wav
在这个答案一位贡献者展示了如何通过将音频数据传输到程序以 flac 格式文件输出来录制到 FLAC 文件flac
,如下所示:
arecord -t raw -f S16_LE -r 44100 -D ac108 -c 6 | flac - -f --endian little --sign signed --channels 6 --bps 16 --sample-rate 44100 -s -o listen.flac
我的问题只是如何构建一个 Linux 命令,可以记录到多个 FLAC 文件,每个文件的大小都相似?
答案1
让我们利用您arecord
生成的原始格式的这些属性:
- 没有标题,没有元数据;
- 每个完整样本是 6(通道数)乘以 2 字节(即 16 位),所以正好是 12 个字节;
- 每秒恰好有 44100 个样本。
因此,每秒需要 44100 × 12 = 529200 字节。要获得 10 秒,您需要 5292000 字节。请注意,您不能从流中随机抽取 5292000 个连续字节,您需要确保不要从中间开始采样。但前 5292000 个字节肯定会包含整数个样本(严格来说是 44100 个样本),然后是下一个 5292000 个字节,然后是下一个,依此类推。
这就是split
命令的功能:它可以将流分割成给定大小的片段。真正的魔力来自于它的--filter=
选项。
arecord -t raw -f S16_LE -r 44100 -D ac108 -c 6 \
| split -d -b 5292000 --filter='
flac - -f --endian little --sign signed --channels 6 --bps 16 --sample-rate 44100 -s -o "${FILE}.flac"
'
上面的管道split
将flac
针对每条数据运行。
笔记:
--filter
POSIX 并不要求;您split
可能会支持或不支持它。- 请参阅
man 1 split
了解影响${FILE}
扩展为的选项。我只使用了-d
,因此在我的情况下是x00
、x01
、x02
、… - 这是一个管道,因此Ctrl+C将向
arecord
和发送 SIGINTsplit
。在我的测试中,这会导致最后一个 flac 文件被截断(以困难的方式split
终止?),因此我稍后解码文件时会得到 。仅向(例如)发送 SIGINT允许和(最重要的是)正常完成。flac
ERROR while decoding data
state = FLAC__STREAM_DECODER_END_OF_STREAM
arecord
killall arecord
split
flac
为了便于阅读,该命令需要多行,但从逻辑上讲,它是以下形式的单行命令:
arecord … | split … --filter='flac …'