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

唯一の問題は、私 (またはエンド ユーザー) が再度記録を開始する前に、番号を 2 回入力する必要があることです。

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 にリダイレクトする必要があるかもしれません。を正常に停止するかをテストする必要があります。-INTctrl+c と同等です。機能しない場合は、試してみるか-HUP、他に何も役に立たなくても。おそらく、ctrl+c が押された最後のを強制終了するシグナルをキャッチするために a を実装する必要があります。-TERM-KILLtrapINT

于 2013-07-10T10:51:01.257 に答える