0

基本上(希望)我想从网络摄像头录制视频流并将其保存在特定目录中,然后在用户输入一些数字时将其终止。我没有很好地解释这一点,所以这就是我目前正在做的事情:

#!/bin/bash

while true
do

TIMESTAMP=$(date +"%Y.%m.%d_%H.%M")

read -p "Enter your number here: " YOURNUMBER

echo -e "Saving video stream:"

mkdir /home/$USER/orders/$YOURNUMBER

avconv -f video4linux2 -r 3 -fs 52428800 -i /dev/video0 /home/$USER/orders/$YOURNUMBER/$TIMESTAMP-$YOURNUMBER.avi

echo -e "Video complete!"

done

所以我想停止录制并在新的 $YOURNUMBER 文件夹中开始新的录制。有任何想法吗?(对此很陌生……请耐心等待!)

更新:

感谢@TrueY

更新的脚本(不需要 mkdir 真的把它拿出来):

CPID=0
while :; do
  read -p "Enter your number here: " YOURNUMBER
  [ $CPID -ne 0 ] && kill -INT $CPID
  TIMESTAMP=$(date +"%Y.%m.%d_%H.%M")
  avconv -f video4linux2 -r 3 -fs 52428800 -i /dev/video0 /home/$USER/orders/$YOURNUMBER[packed-$TIMESTAMP].avi > /dev/null 2>&1 &
  CPID=$!
done

唯一的麻烦是我(或最终用户)必须输入两次数字才能再次开始录制。

4

1 回答 1

2

更新

尝试这样的事情(OP的代码修改了一点):

#!/usr/bin/bash

stop() { [ $CPID -ne 0 ] && kill -INT $CPID && wait $CPID && echo "Killed $CPID"; }

trap "stop; exit" INT

CPID=0
while :; do
  read -p "Enter your number here: " YOURNUMBER
  stop
  [ "$YOURNUMBER" == quit ] && break;
  TIMESTAMP=$(date +"%Y.%m.%d_%H.%M")
  avconv -f video4linux2 -r 3 -fs 52428800 -i /dev/video0 /home/$USER/orders/$YOURNUMBER/$TIMESTAMP-$YOURNUMBER.avi&
  CPID=$!
  echo -e "Video complete!"
done

这将在后台启动,以便用户可以输入新号码。也许应该将的 stdout 和 stderr重定向到日志文件或 /dev/null。还应该测试哪个信号优雅地停止-INT相当于 ctrl+c。它不起作用,请尝试-HUP-TERM或者即使-KILL没有其他帮助。也许您应该实现 atrap来捕获INT信号以杀死按ctrl+c的最后一个

于 2013-07-10T10:51:01.257 回答