Como usar o ffmpeg para capturar um instantâneo do fluxo HLS / rtsp?

1

Eu gostaria de usar o ffmpeg para capturar instantâneos de fluxo HLS ou RTSP.

Existe alguma maneira simples de fazer isso?

Obrigado!

    
por Zhen Liu 11.05.2017 / 04:26

1 resposta

1

SO - Eu encontrei a resposta para isso há um tempo atrás no stackexchange eu acho, então estou apenas regurgitando informações que encontrei (ou seja, não posso levar crédito!)

#!/bin/bash

# TimeLapse snapshot capture script.

# This script should capture any stills in the incoming Stills directory

time='date '+%Y_%m_%d__%H_%M_%S'';

# Specific for each camera
CameraName=no-spaces-this-will-be-a-filename-eventually
CameraIP='192.168.1.150'

CameraUsername='user'
CameraPassword='password'

# Shouldn't need to be changed!
StorageDirectory=/mnt/storage/Stills
StorageFilename=$CameraName-$time.png

mkdir -p $StorageDirectory/$CameraName;

ffmpeg -rtsp_transport tcp -i rtsp://$CameraUsername:$CameraPassword@$CameraIP:554/mainStream -ss 00:00:01.50 -vframes 1 $StorageDirectory/$CameraName/$StorageFilename -nostats -hide_banner -v 0 -loglevel quiet

Agora - isso funciona EXCELENTE com as câmeras HikVision. Com o que estou fazendo isso.

Para dividi-lo, o -ss 00: 00: 01.50 significa que ele envia um segundo e meio de imagens ENTÃO -vframe 1 captura 1 quadro. Isso permite que o fluxo seja "ajustado" para que você não fique com metade de uma imagem.

Eu corro isso para fazer capturas regulares de câmeras que eu, uma vez por semana, faço em um filme timelapse

#!/bin/bash

# TimeLapse footage creation script.

# This script should take any stills in the incoming Stills directory and
# compile them into a .mp4 file in the Movies directory.
# Then moved the 'processed' stills into a timestamped directory the
# Processed directory.

time='date '+%Y_%m_%d__%H_%M_%S'';
source="/mnt/storage/"

for CameraName in 'ls $source/Stills/'; do

# If the Movies directory for $CameraName doesn't exist, make it.
   mkdir -p /mnt/storage/Movies/$CameraName

# Make the movie in the Movie directory using the stills from the Stills directory
   ffmpeg -framerate 10/1 -pattern_type glob -i "$source/Stills/$CameraName/*.png" -vf fps=30 -c:v libx264 -pix_fmt yuv420p $source/Movies/$CameraName/$CameraName-$time.mp4

# Make the Processed directory for $CameraName if it doesn't already exist
   mkdir -p /mnt/storage/Processed/$CameraName
# Make the timestamped directory for the stills to be moved into
   mkdir -p /mnt/storage/Processed/$CameraName/$time
# Move the stills
   mv $source/Stills/$CameraName/*.png $source/Processed/$CameraName/$time/

done

O primeiro script está em um cronjob para ser executado a cada 5 minutos. O segundo script está em um cron job para ser executado uma vez por semana.

Espero que ajude.

    
por 11.05.2017 / 09:23

Tags