正在编写MP3文件

时间:2017-08-08 21:27:31

标签: linux mp3 sox software-defined-radio

我使用rtl_fm和sox将fm电台保存到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

1 个答案:

答案 0 :(得分: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 -