我正在使用 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 上运行
这里有几件事。我不认为
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 -