보안 카메라와 움직임이 감지되면 영상을 녹화하는 프로그램이 있습니다. 기본적으로 이 프로그램은 매우 무거운 형식으로 비디오를 저장합니다.
내 솔루션은 ffmpeg를 사용하여 비디오를 변환하는 스크립트를 호출하는 것이었습니다. 이 스크립트는 영상이 만들어질 때마다 호출됩니다.
변환에는 상대적으로 시간이 적게 걸리지만 CPU를 많이 사용합니다. 변환해야 할 새 비디오가 도착하고 다른 비디오의 변환이 아직 완료되지 않은 경우 문제가 발생합니다. 이 경우 스크립트를 다시 호출하면 두 개 이상의 ffmpeg 프로세스가 나타나며 시스템이 상당한 시간 동안 거의 정지 상태가 됩니다.
이전 변환 작업이 완료된 후 변환 작업이 실행되도록 대기열에 추가하려면 어떻게 해야 합니까? 내가 원하는 것은 한 번에 하나의 ffmpeg 프로세스만 갖는 것입니다.
답변1
batch
다음 프로그램의 일부를 사용할 수 있습니다존재하다패키지(작업 대기열 도구). 많은 시스템에 기본적으로 설치됩니다.
답변2
대기열 디렉터리를 설정하고 백그라운드 프로세스가 대기열 디렉터리를 통과하여 ffmpeg 변환을 생성하도록 하겠습니다. 백그라운드 프로그램의 예는 다음과 같습니다.
queue=/var/tmp/vidq
outdir=/var/tmp/videos
while true; do # do forever
for file in $queue/*; do
name=`basename $file`
mv -f $file $queue/.current
ffmpeg -i .current $outdir/$name
touch -r $queue/.current $outdir/$name
rm $queue/.current
done
sleep 300 # sleep for 5 minutes
done
대기 중인 파일이 비디오 파일이 아닌지 여부 등 몇 가지 보안 검사를 수행해야 합니다. 그리고 수면 값을 조정하세요. 그러나 이렇게 하면 이름과 원본 날짜 스탬프가 동일한 변환된 파일이 생성됩니다.
또 다른 방법은 파일 잠금을 확인하는 것입니다. ffmpeg 프로세스가 종료되면 잠금이 제거되고 다른 프로세스가 시작되어 파일 잠금이 먼저 생성될 수 있습니다. 그러나 이는 이제 논리가 프로그램 내에 상주하며 어떤 파일을 처리해야 하는지 추적해야 함을 의미합니다. 위의 대기열 디렉터리 솔루션은 프런트엔드 프로그램이 이를 대기열에 전달하기만 하면 된다는 것을 의미합니다.