用動作錄音?
我想設置一個守護程序,當它檢測到噪音或運動時,它會開始錄製帶聲音的影片。有些工具可以單獨完成,但可以同時完成嗎?我可以設置運動以在檢測到運動時執行腳本嗎?我可以對 SOX 做同樣的事情嗎?
我知道這是一個非常古老的問題,但我可以幫助那些在搜尋中偶然發現這個問題的人(比如幾年前的我)……當我想要錄製和流式傳輸音頻時,我從 ridgy 那裡找到了上述答案來自 Motion,它讓我去開發一個成功的解決方案,至少對我來說是這樣。我的案例是錄製來自巢箱的聲音。我在連接到 Pi 3B+ 執行運動的平移/傾斜安裝架上安裝了 MS LifeCam 網路攝像頭。解決方案確實是在觸發動作開始錄製電影時執行腳本,但我還有一個連續執行的腳本,可以從網路攝像頭傳輸音頻。然後我使用 VLC 查看網路影片流並在其旁邊播放音頻流。詳情如下:
我設置了三個目錄來處理音頻和影片文件
/home/pi/motion/videos
:/home/pi/motion/videosB
和/home/pi/videos/pre-mergevideos
motion.conf
已配置,因此 .mkv 影片保存到/home/pi/motion/videos
在電影開始時,motion 會執行一個名為 record_s.sh 的腳本,它會錄製一個與 .mkv 影片同名的 60 秒音頻文件並將其保存在
/home/pi/motion/videos
在電影關閉時,motion 會執行一個名為 merge_sv.sh 的腳本,這會將 .mkv 和 .mp3 文件
/home/pi/motion/videos
合併到其中並將合併的文件保存到/home/pi/motion/pre-mergevideos
. 然後刪除 .mkv 和 .mp3 源文件,合併文件的權限更改為 777,其所有者從 root 更改為 motion,最後,合併文件移動到/home/pi/motion/videosB
crontab 每 2 分鐘執行 rsync 以將“videosB”的內容移動到 NAS 共享 (/home/pi/motion/media)
後者是為了防止 NAS 共享因任何原因變得不可用時“運動”崩潰 - “運動”將其文件寫入本地目錄,而 crontab 負責輸出到 NAS 共享。
#!/bin/bash # record_s.sh # 15/4/18: Created # 25/11/20: libav-tools no longer available in 'Buster', 'avconv' replaced by 'ffmpeg' filename="$1" echo "$1" &> /home/pi/motion/filename.txt # filename.txt will contain /home/pi/motion/videos/xxxxxxxxxxxxxx.mkv #remove ".mkv" file extension - "${filename%.*} (parameter expansion) #Use of 'sudo' is only possible if user motion is in the sudoers file and in the sudo group sudo ffmpeg -y -f alsa -ac 1 -i default -acodec mp3 -b:a 64k -t 60 "${filename%.*}".mp3 &> /home/pi/motion/record_s.txt
#!/bin/bash # merge_sv.sh # 19/04/18: Created # Call arguments: %f %Y%H%d%T where %f is filename with full path (eg) /home/pi/motion/videos/9403-20180511053500.mkv # Allow record_s.sh to finish writing the .mp3 sound file (which will have the same name & path as above except .mp3) sleep 10 filename="$1" # The 'if' statement below will reject timelapse files '*.avi' if [[ ${filename##*\.} != avi ]] # See answer 5 in https://stackoverflow.com/questions/407184/how-to-check-the-extension-of-a-filename-in-a-bash-script then #Change output file address from /home/pi/motion/videos to /home/pi/motion/pre-mergevideos (/home/pi/motion/pre-mergevideos is a directory for temporarily holding the unmerged files) tempfolder="pre-mergevideos" outputfolder="videosB" # This is the folder containing the merged mkv & mp3 video and the jpg files from 'motion'. This folder is rsync'd to network share 'media'. # Replaces 'videos' in $filename with the text in $tempfolder (ie) 'pre-mergevideos' so $output becomes (eg) /home/pi/motion/pre-mergevideos/9403-20180511053500.mkv, whilst # $filename remains (eg) /home/pi/motion/videos/9403-20180511053500.mkv temp_locn="${filename/videos/$tempfolder}" final_locn="${filename/videos/$outputfolder}" # # # Merge video and audio into one file. Note the mp3 file has to be converted to aac for an mkv container. Error and stdout messages are redirected to merge_sv.txt. For # 'sudo' to work user 'motion' has to be added to the sudoers file and to the sudo group. # The expression "${filename%.*} removes ".mkv" file extension (parameter expansion) # -itsoffset option offsets the timestamps of all streams by (in this case) 0.8 seconds in the input file following the option (without it the audio leads the video by about 0.8s). sudo ffmpeg -y -i $filename -itsoffset 0.80 -i "${filename%.*}".mp3 -c:v copy -c:a aac $temp_locn &> /home/pi/motion/merge_sv.txt #Delete the source files sudo rm $filename sudo rm "${filename%.*}".mp3 # change the file permissions on the merged file (otherwise it's root 644 rw.r..r..) sudo chmod 777 $temp_locn # change the owner to 'motion' sudo chown motion:motion $temp_locn #move the recently merged file into the 'videosB' folder. Remember both $temp_locn and $final_locn contain path and filename sudo mv $temp_locn $final_locn fi
tldr 版本:
record_s.sh
在運動錄製影片時錄製來自網路攝像頭的音頻。影片錄製完成後,merge_sv.sh
將音頻和影片文件合併在一起並刪除源文件。該腳本將偏移量應用於音頻(通過反複試驗確定)以使文件同步在一起。如果網路共享變得不可用,還有一些詭計可以阻止運動崩潰。
sound_on.sh
音頻流:我在啟動時通過 crontab -e執行一個簡單的腳本來生成 rtp 流:#!/bin/bash # sound_on.sh # 13/1/18 # # killall -9 avconv #Pre Buster version: #avconv -f alsa -ac 1 -re -i default -acodec mp3 -ac 1 -f rtp rtp://234.5.5.5:5004 2> /tmp/mylog.log # default was hw:1,0 #Buster version onwards: ffmpeg -f alsa -channels 1 -i hw:1,0 -acodec mp3 -f rtp rtp://234.5.5.5:5004 2> /home/pi/motion/sound_on.log
這可以使用具有以下設置的 VLC 播放:
Media/Open Network Stream:網路URL:http: //192.168.1.122 :8081 (樹莓派跑動的地址)
顯示更多選項/同步播放另一個媒體:‘Extra media’ rtp://234.5.5.5:5004
然後按“播放”
請注意,這僅(在撰寫本文時)適用於 Ubuntu 版本的 VLC - 每次我嘗試此操作時,Windows 10 版本都會崩潰。