如何使用Linux arecord命令生成多个FLAC文件?

如何使用Linux arecord命令生成多个FLAC文件?

我想使用 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"
'

上面的管道splitflac针对每条数据运行。

笔记:

  • --filterPOSIX 并不要求;您split可能会支持或不支持它。
  • 请参阅man 1 split了解影响${FILE}扩展为的选项。我只使用了-d,因此在我的情况下是x00x01x02、…
  • 这是一个管道,因此Ctrl+C将向arecord和发送 SIGINT split。在我的测试中,这会导致最后一个 flac 文件被截断(以困难的方式split终止?),因此我稍后解码文件时会得到 。仅向(例如)发送 SIGINT允许和(最重要的是)正常完成。flacERROR while decoding datastate = FLAC__STREAM_DECODER_END_OF_STREAMarecordkillall arecordsplitflac
  • 为了便于阅读,该命令需要多行,但从逻辑上讲,它是以下形式的单行命令:

    arecord … | split … --filter='flac …'
    

相关内容