1

我正在使用 rtl_fm 和 sox 将调频电台保存到 mp3 文件中。rtl_fm 捕获信号,sox 将其转码为 mp3。

rtl_fm  -M  wbfm  -f  88.1M -d 0 -s 22050k -l 310 | sox -traw -r8k -es -b16 -c1 -V1 - -tmp3 - | sox -tmp3 - some_file.mp3

然后我尝试在第二个终端中播放该文件,因为正在使用以下方式编写 mp3:

play -t mp3 some_file.mp3

问题是它只播放到 mp3 在调用播放命令时的时间。

我如何让它随着时间的推移播放附加的 mp3,而它正在被写入?

编辑:在 Raspberry Pi 3 (Raspian Jessie)、NooElec R820T SDR 上运行

4

1 回答 1

1

这里有几件事。我不认为sox支持“拖尾”文件,但我知道支持mplayer。然而,为了更好地控制管道,使用gstreamer可能是一种方法,因为它在其效果管道中内置了一个并行事件流。

如果你想坚持使用sox,我会首先摆脱多余的第二次调用sox,例如:

rtl_fm -M wbfm -f 88.1M -d 0 -s 22050k -l 310 |
sox -ts16 -r8k -c1 -V1 - some_file.mp3

为了在转码时播放流,您可以将其与 多路复用tee,例如:

rtl_fm -M wbfm -f 88.1M -d 0 -s 22050k -l 310 |
tee >(sox -ts16 -r8k -c1 -V1 - some_file.mp3) |
play -ts16 -r8k -c1 -

或者,如果您希望它们成为单独的进程:

# Save stream to a file
rtl_fm -M wbfm -f 88.1M -d 0 -s 22050k -l 310 > some_file.s16

# Encode stream
sox -ts16 -r8k -c1 -V1 some_file.s16 some_file.mp3

# Start playing the file at 10 seconds in
tail -c+$((8000 * 10)) -f some_file.s16 |
play -ts16 -r8k -c1 -
于 2017-08-09T00:45:31.897 回答