Détection des changements de scène et enregistrement des clips vidéo h264 sur Raspberry Pi sans décodage


Bonne après-midi. Dans cet article, je vais vous dire, loin de la première fois, comment détecter simultanément un mouvement et enregistrer / diffuser une vidéo au format H264 sur Raspberry Pi 3 et sur des plateformes plus faibles. Je partagerai avec les mêmes nouveaux venus dans le monde du Raspberry Pi, comme moi, ce que j'ai découvert en quelques jours, alors que je savais comment résoudre le problème. Je vais parler de travailler avec la caméra Raspberry Pi dans un langage humain simple.


" CSI- Raspberry Pi v.1.3 2.1 720p @ 25 FPS, 1 h264, , ".


, , .


, , , ( ) , , .

RPi, , OpenCV, , - , ffmpeg, - .


OpenCV, , : " RGB/MJPEG, - H264 MP4...".


Raspberry Pi , - , datasheets- ( ), — , .


, Raspberry Pi . , , , 2.8-3.2 . , , CS-mount , . - 3d-, — , Thingverse .


Raspberry 3 / — . FullHD OpenMAX.


: Raspberry Pi - H264 -.


FFmpeg :


#!/bin/bash

SS=$1
FPS=$2

WIDTH=1600
HEIGHT=1200

while :
do

ffmpeg -f video4linux2 -input_format h264 -video_size ${WIDTH}x${HEIGHT} \
    -framerate $FPS -i /dev/video0 -vcodec copy -map 0 \
    -segment_time $SS -f segment \
    -strftime 1 -reset_timestamps 1 \
    -segment_format mp4 /video/file_%s.mp4
done

$SS FPS $FPS , unix-timestamp. , MP4. CPU . , FTP.


v2.1 1080p — ( FOV). 1600x1200 — FPS. , , ffmpeg raspivid (. ) . .


, , , RAM GPU Raspberry Pi, - — .

H264, , . : Raspberry Pi 3 FullHD OpenCV , 1280x720 @ 30 FPS .


H264? — H264.


Raspberry Pi (motion vectors) H264. . , .


Raspberry Pi , MV :


typedef struct
{
   signed char x_vector;
   signed char y_vector;
   short sad;
} INLINE_MOTION_VECTOR; 

{x,y}_vector — , sad — . sad vectors . sad, motion vectors.


FFmpeg motion vectors , Raspivid:


#!/bin/bash

SS=$1
FPS=$2

W=1600
H=1200

while :
do
    raspivid -pts -stm -w $W -h $H -fps $FPS -t 0 \
                    -sn $(date +%s) -sg $(($SS*1000)) \
                    -o /video/video_%d.h264 -x /video/mv_%d.txt
done

, raspivid +1, , timestamp, stat .

FFmpeg CVLC, RTSP . , — motion vectors .


, "", , , . . FPS=25 ( 30) , , 50Hz , .


— , , MV, , . . , , .

, , RPi — H264 , MV.


, *.h264 — H264, MP4, VLC, , , . Raspberry Pi gpac:


sudo apt install -y gpac

h264 mp4 :


time MP4Box -add /video/video_1588645858.h264 /video/video_1588645858.mp4
AVC-H264 import - frame size 1280 x 720 at 25.000 FPS
AVC Import results: 1560 samples - Slices: 26 I 1534 P 0 B - 0 SEI - 26 IDR
Saving to /video/video_1588645858.mp4: 0.500 secs Interleaving

real    0m11.164s
user    0m0.548s
sys 0m0.469s

11 Raspberry Pi 3, .


MV :


import os
import sys
import struct
import numpy as np

resolution = [1280, 720]

framelength = int(((resolution[0] + 16) / 16) * (resolution[1] / 16) * 4)

framedata = []

cnt = 0

while True:
    data = sys.stdin.read(framelength)

    if data == '':
      break

    cnt += 1

    framedata = struct.unpack('>%db' % framelength, data)
    vectors = np.reshape(framedata[:(resolution[1]/16 * (resolution[0]/16 + 1) * 4)], (resolution[1]/16, resolution[0]/16 + 1, 4)).astype(np.float32)
    vectors = np.multiply(vectors[:, :, 0:1], vectors[:, :, 0:1])

    print int(np.sum(vectors))

C, .


time $(cat /video/mv_1588645871.txt| python proc.py > /dev/null)

real    0m26.288s
user    0m25.005s
sys 0m0.583s

, NumPy ( C), , , , 50% , . MV, , .


, :


, , — . — . .


:


cat /video/mv_1588645871.txt | python proc.py | awk '{ if ($1 > 0) print "motion" }' | grep motion > /dev/null
echo $?
0

, . , FTP, .


, " " , , Raspberry Pi .


, , , MV . Medium, MV Python.


L'article peut sembler banal pour les professionnels, mais j'ai dû consacrer beaucoup de temps à faire face à ces choses. J'espère que pour les débutants qui commenceront à travailler avec la vidéo sur la plate-forme Raspberry Pi, cela sera utile.


All Articles