加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 监听音频线

发布时间:2020-12-13 19:35:29 所属栏目:Linux 来源:网络整理
导读:我需要在 linux上监听我的音频线路,并且在音频播放的情况下,声音必须被记录并保存到一个文件中.类似于 motion如何监视视频Feed. 有可能用bash吗?一些沿着以下方向的东西: #!/bin/bash# audio devicedevice=/dev/audio-line-in# below this threshold audio
我需要在 linux上监听我的音频线路,并且在音频播放的情况下,声音必须被记录并保存到一个文件中.类似于 motion如何监视视频Feed.

有可能用bash吗?一些沿着以下方向的东西:

#!/bin/bash

# audio device
device=/dev/audio-line-in

# below this threshold audio will not be recorded.
noise_threshold=10

# folder where recordings are stored
storage_folder=~/recordings

# run indefenitly,until Ctrl-C is pressed
while true; do
   # noise_level() represents a function to determine
   # the noise level from device
   if noise_level( $device ) > $noise_threshold; then
     # stream from device to file,can be encoded to mp3 later.
     cat $device > $storage_folder/$(date +%FT%T).raw         
   fi;
done;

编辑:我想从这个程序获得的流程是

a. when noise > threshold,start recording  
 b. stop recording when noise < threshold for 10 seconds
 c. save recorded piece to separate file

解决方法

SoX是瑞士军刀的声音处理.您可以利用它来分析录音.以下解决方案的唯一缺点是:

>您需要将录音分割成固定大小的块
>您可能会丢失录音时间(由于杀死/分析/重新启动录音)

因此,进一步的改进可能是分析异步,尽管这将使工作复杂化.

#!/bin/bash 

record_interval=5
noise_threshold=3
storage_folder=~/recordings

exec 2>/dev/null        # no default  error output
while true; do 
    rec out.wav &
    sleep $record_interval
    kill -KILL %1
    max_level="$(sox  out.wav -n stats -s 16 2>&1|awk '/^Max level/ {print int($3)}')"
    if [ $max_level -gt $noise_threshold ];then 
    mv out.wav ${storage_folder}/recording-$(date +%FT%T).wav;
    else 
    rm out.wav
    fi
done

更新:

以下解决方案使用fifo作为rec的输出.通过在这个管道上使用拆分来获取块,应该没有丢失录音时间:

#!/bin/bash 

noise_threshold=3
storage_folder=~/recordings
raw_folder=~/recordings/tmp
split_folder=~/recordings/split
sox_raw_options="-t raw -r 48k -e signed -b 16"
split_size=1048576 # 1M

mkdir -p ${raw_folder} ${split_folder}

test -a ${raw_folder}/in.raw ||  mkfifo ${raw_folder}/in.raw

# start recording and spliting in background
rec ${sox_raw_options} - >${raw_folder}/in.raw 2>/dev/null &
split -b ${split_size} - <${raw_folder}/in.raw ${split_folder}/piece &


while true; do 
    # check each finished raw file
    for raw in $(find ${split_folder} -size ${split_size}c);do 
    max_level="$(sox $sox_raw_options  ${raw} -n stats -s 16 2>&1|awk '/^Max level/ {print int($3)}')"
    if [ $max_level -gt $noise_threshold ];then 
        sox ${sox_raw_options} ${raw} ${storage_folder}/recording-$(date +%FT%T).wav;
    fi
    rm ${raw}
    done
    sleep 1
done1

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读