Problème capture vidéo avec Motioneye

Bonjour,
après avoir déjà essayer pas mal de choses, je poste ce message afin de voir si il est possible de trouver une réponse/solution à un petit souci avec mon Raspberry Pi 4 avec disque ssd.
J’ai y installé Raspbian Buster , motioneye et domoticz.
Il y a une caméra dôme IP (Yoluke) dont je réupère le flux (protocole rtsp).
Le problème c’est que lors d’une détection de mouvement la vidéo enregistrée est presque tout le temps perturbée par des images grises. La nuit , le jour , lorsqu’il y a un mouvement ou même lorsque rien ne se passe. Par exemple au début la vidéo est ok puis pour quelques secondes l’image devient floue grisâtre ou grise ensuite l’image redevient normale ou pas durant la séquence.
J’ai essayé de diminuer la qualité de la vidéo, de passer la caméra du wifi en câblé, d’adapter certains paramètres dans motioneye - mais cela n’a rien arrangé.
Même en regardant les images en live de la caméra avec motioneye ce phénomène apparaît souvent.
Il est a noter que les captures faites avec l’appli CamHi n’ont pas ce problème.
La capture vidéo est en mp4 (hevc main L5.1 , yuv420p , 2560x1920 , 284 kb/s).
Si quelqu’un a une idée de la source/raison de ce problème, je suis preneur.


D’avance, merci à tous.

Le problème est du, selon mes connaissances, à l’encodage. Ce problème est visible aussi avec des vidéo standard sans nécessairement en stream live.

Ce qui ce passe, est que quelques bits du stream ne sont pas la, corrompu ou mal formaté, et empêche une gestion de l’image correctement. Ceci peut être du à la source ou au lecteur destinataire.

Sans savoir ce qui cause exactement ce problème, il faut jouer avec les paramètre de l’encodage (si possible) et du décodeur.
L’idée serait de jouer avec les valeurs de « buffer », « frame skip » et de « frame sync ».

Ton lecteur HiCam doit avoir ce type de paramètre, qui permet d’éviter ce problème.

Ce problème arrive aussi si la lecture et trop proche du point de réception; je m’explique.

La plupart du temps, quand tu suis un Stream, tu a un décalage de 1 à 5 secondes, (pouvant être plus), ce délais permet a la source de streamer sans que le lecteur subisse d’arrêt.

EN principe, un serveur vidéo doit faire un « Tampon », d’un certain nombre de seconde, disont 5 secondes.
Quand le stream est reçu, théoriquement il doit attendre 5 secondes pour permettre l’écoute, comme sa si la source stop quelques instant (msec ou sec) sa permet au stream de continuer sans coupure en lecture (mais un saut d’image est possible). C’est le principe de « buffering » et « frame skip ».

Si ton serveur pousse le stream reçu sans tampon, il doit encoder à la volé et suivre le stream en limitant la perte, il ne veut pas « couper » le stream et envoie des images partiel pour « tenir le rythme ». ET plus le RPi va encoder direct, plus la chance d’erreur est grande.

Quand tu as du mouvement, l’encodeur doit recréer une map de couleur et d’autres information du « header » vidéo, quand l’image est fix ou que les mouvements sont minime, l’encodeur utilise l’image précédente et ajoute que les pixels bougé, mais plus il y a du mouvement dans l’image, plus il doit noter de modification au « header » vidéo, voir « flush » le frame précédente pour redéfinir l’ensemble.

C’est un peu dur a comprendre et à expliquer. Le meilleur moyen est de ne pas demander a MotionEye de réencoder mais de copier le stream, ce qui lui fera sauter l’encodage et fournir le stream dans sont état reçu. Mais il est difficile de changer ce type de paramètre avec MotionEye.


J’ai déja testé MotionEye et malgré le côté AiO qui est for intéressant, j’ai abandonné ce système pour opter de quoi de plus simple et maniable. Le problème de ma solution est que j’utilise une application qui n’est plus supporté.

J’ai créé un serveur FFServer pour mes Stream, j’ai 5 caméras sur ce serveur, chaque caméra est Stream depuis une commande par FFmpeg. Chaque caméra Stream donc en MJpeg directement sur le server, ce serveur ne fait que copier le format reçu vers le client, à la demande. Dans mes commandes, je demande aux caméras de faire du Frame Skip, de limiter le débit à 15 img/s sur ceux en Wifi et 25 img/sec ceux en filaire.

Résultat, j’ai aucun bug d’image. Mais ici je dois spécifier de quoi.

J’ai une caméra sur un RPi Zero 2, qui fait aussi office de Deskboard. Par moment le RPi commence à être surchargé, sont encodage ralenti, au point que j’ai un décalage avec la réalité et le visionnement pouvant atteindre, attention les yeux… 5 heures de décalage. Car le RPi, même en prenant le format MJpeg de la caméra et sans l’encoder, à de la misère à suivre le rythme, et j’ai aussi un problème de décalage de quelques secondes avec une autre caméra RPi (RPi Zero 1 WH), qui fait que ça.

Le RPi est vraiment pourri en encodage vidéo et Stream. Alors gérer plusieurs Stream via MotionEye est encore plus exigeant, pouvant causer à des pertes de qualité d’encodage pour être le plus « Real Time ». La solution la plus viable est de travailler soit même le serveur pour ajuster tout les paramètre à fin de limiter la charge de travail et la perte de qualité. De faire travailler chaque source dans l’encodage au lieu de demander à un seul appareil de le faire.


Je n’ai pas de solution pour toi, sauf de faire des tests et de comprendre ou le problème ce crée exactement. De hack/tweaker le MotionEye pour changer sa charge de travail et la manière qui travail le tout. Si je ne me trompe pas, le MotionEye sort en format MJpeg tout les stream, alors il doit réencoder la source. Lui fournir un stream directement en MJpeg peut grandement l’aider.

Un tout grand merci pour cette réponse très complète et compréhensible.
Cette réponse me rassure un peu. C’est donc plutôt du côté des limitations (software et hardware) qu’il faut trouver la source de ce dysfonctionnement.
Motioneye est assez complet est m’intéressait par sa facilité d’accès et pour améliorer les détections (diminuer les fausses alertes).
Pour ce qui est de passer au MJpeg , je dois vérifier mais je crains que ma caméra IP n’offre pas cette possibilité. Comme vous je vais essayer autre chose pour analyser les images.
Peut-être que mon NAS Synology ferait l’affaire.
Ou peut-être installer une caméra plus performante.
En tout cas, je vais d’abord essayer les différentes solutions dont tu parles.
Mais je dois tout de même limiter mes prétentions car je n’ai pas ton niveau en informatique, je suis juste un dilettante en la matière…
Encore merci à toi pour cette explication et tes conseils de pro :+1:

En répondant a ton post, j’ai décidé de regarder ma caméra IP que j’ai trouvé dans les vidanges. Elle n’était pas relié à mon setup de caméra, vu qu’elle utilisait le Cloud de la compagnie. Après quelques recherche, j’ai vu que le port 80 est ouvert et que le format est RTSP.

Après uen autre recherche, je trouve le lien de mon stream; rtps://192.168.0.103/live qui es en format H.264 MP4 avec audio AAC.

Je prend ma ligne de code et je teste en simple; retire le chargement du support caméra et je replace la source par simplement l’URL RTSP de la caméra.

Bingo! Le signal H.264 est converti en MJpeg « on the fly » avec 0 perte. Même en passant d’un stream 720p à 720x480 (SD). Sans aucune complication.

Après un debug du log de mon FFmpeg, je réalise que si le signal est en RTSP, il va passer en mode MJpeg si demandé, au lieu de fournir le H.264 par défaut. (FFMpeg dit que dans le Header il y a un choix de stream disponible, vu que la destination demande du MJPeg, FFMpeg ce met automatiquement en mode MJpeg pour la demande)

Je tiens a préciser que la caméra est un HM203, et que selon les recherches, c’est très « Generic » et basé sur un circuit Chinois (toujours eux … :stuck_out_tongue: ), et que l’accès API est très limité.

Bref, trouve le lien de ton stream si tu ne l’a pas déjà, si c’est en RTSP tu as de forte chance que le MJpeg soit supporté.

Et petite note, le Stream source fait du 60fps, et mon code le descend à 5fps pour limiter l’usage de la bande passante local et ne pas surcharger le serveur inutilement.

Bonne nouvelle pour moi alors.
Merci pour tes tests et pour le temps consacrés à compléter ta réponse pour m’apporter une solution à ce problème de décrochage vidéo.
Il est vrai que ces caméras IP made in PRC (République populaire de Chine) ont souvent une base commune et ça aide pour trouver des infos.
J’utilise actuellement le protocole RTSP qui me donne donc dans Motioneye un fichier vidéo en HEVC.
Je vais donc voir pour trouver le bon flux s’il est disponible. Mes tests avec VLC ne sont pas concluant pour ouvrir un flux RTSP , on dirait qu’il ne lit pas ce format H.264 (probablement un codec qui manque).
J’ai racheté il y a peu sur Ebay une autre caméra IP générique qui semble offrir plus de possibilités à ce niveau.
Mais ce serait en effet moins de travail de trouver la bonne configuration pour celle qui est déjà installée :thinking: .
Je te tiens bien sûr au courant de l’avancé des tests qui vont être fait.
Et je te remercie à nouveau pour cette aide bienvenue …

J’ai justement pris VLC sous Windows pour mes test, simplement donné le lien du Sream et il à marché pour moi. SI tu as un trouble à faire de même, ton problème (initial du message) serais, je crois, la caméra, car VLC est reconnu pour accepter « Tout et n’importe quoi » et que si il ne prend pas en charge ton Stream, c’est que ce dernier est « Buggé ».

Mais attend! SI tu test VLC sous Linux, assure toi d’avoir les librairies. C’est rare que j’utilise VLC sous Linux, mais peut-être une librairie manquante ou de mauvaise qualité cause le problème alors. (Librairie installé en root et accessible qu’en root, ou une version moins performante ou non optimisé, etc…)

Le signal en HEVC, est identique a ma caméra au passage.

Merci pour ce complément d’info à propos de VLC.
Faut dire que je suis encore avec windows 7 et une bécane un peu ancienne mais cela convient à mon usage quotidien. Et je ne m’étonne donc pas si quelque chose ne tourne pas comme prévu.
C’est la version 3.0.17.4 Vetinari de VLC qui est installée. Et je confirme que ma configuration bug avec le format HEVC . Le flux de la caméra n’est pas lu avec mon VLC mais une vidéo enregistrée par cette caméra n’est non plus pas lue.
Et pour lire ces vidéos j’ai dû installer un media player compatible : MPC-HC.
Cela étant dit, grâce à ton aide, il semble que la réinstallation de la caméra IP dans Motioneye a été payante.
En effet, les quelques vidéos de détections enregistrées cette nuit ont l’air toutes bien enregistrées.
J’ai juste changé dans la configuration de la caméra le codage vidéo (passé de H265 en H264).
Et dans Motioneye j’enregistre en AVI.
Je vais tout de même essayer de trouver un flux MJpeg lorsque j’aurai un peu de temps.
J’ai aussi lu sur un forum de domotique que ces formats H264 et H265 ne sont pas encore supportés sur la plupart des box domotique. Il faut donc ne pas l’oublier…
Je reviens vers toi lorsque j’en saurai plus sur ce problème avec VLC et après avoir fait plus de test avec ma caméra pour en tirer le meilleur parti.
Encore un tout grand merci pour ton assistance qui a permis de trouver une solution à mon problème de vidéo.
A bientôt alors …
2022-08-16_16-59-41

Le décodage de ce format requière une accélération matériel pour un meilleur rendu, sinon c’est que logiciel. Sous RPi 1/2/3/0 il faut payer et ajouter un code dans le config pour autoriser le décodage matériel, mais perso, jamais vraiment vu un gain notable, mais vu le prix, j’ai tout mis mes RPi avec une license, ce qui simplifie le debug, en ne me demandant si c’est ça.

Le MJpeg, malgré qui soit vieux et limité, est un format JPEG sans fin, alors plus facile a prendre en charge par tous. Les première caméra USB 1.x était souvent dans ce format.

L’idée est de limiter la compression pour faciliter la décompression, un format en continue frame par frame, au lieu d’un format conteneur d’une série de frame, limite les possibilité d’incompatibilité et d’erreurs.

En partant avec MJpeg, que MotionEye utilise bien, tu peux une fois tout le système OK et Fiable, faire des tests avec d’autres formats de codec.

ffserver Status
Available Streams 
Path	Served |    Conns	|    bytes	Format	| Bit rate kbit/s	| Video kbit/s	| Codec	Audio kbit/s	|    Codec	Feed
camera1	470	33681M	mpjpeg	2048	2048	mjpeg	0		camera1.ffm
camera1/preview.jpg	5796	58035k	singlejpeg	200	200	mjpeg	0		camera1.ffm
camera2	470	35565M	mpjpeg	2048	2048	mjpeg	0		camera2.ffm
camera2/preview.jpg	5792	67447k	singlejpeg	200	200	mjpeg	0		camera2.ffm
camera3	470	35741M	mpjpeg	2048	2048	mjpeg	0		camera3.ffm
camera3/preview.jpg	5788	78971k	singlejpeg	200	200	mjpeg	0		camera3.ffm
camera4	470	26629M	mpjpeg	2048	2048	mjpeg	0		camera4.ffm
camera4/preview.jpg	0	0	singlejpeg	200	200	mjpeg	0		camera4.ffm
camera5	470	5870M	mpjpeg	2048	2048	mjpeg	0		camera5.ffm
camera5/preview.jpg	5794	53902k	singlejpeg	200	200	mjpeg	0		camera5.ffm
camera6	470	30022M	mpjpeg	2048	2048	mjpeg	0		camera6.ffm
camera6/preview.jpg	0	0	singlejpeg	200	200	mjpeg	0		camera6.ffm
stat.html	4	14174	-	-	-		-	
index.html	0	0	-	-	-		-	
Feed camera1.ffm
Stream	type	kbit/s	codec	Parameters
0	video	2048	mjpeg	720x480, q=1-15, fps=5
1	video	200	mjpeg	720x480, q=2-31, fps=5
Feed camera2.ffm
Stream	type	kbit/s	codec	Parameters
0	video	2048	mjpeg	720x480, q=1-15, fps=5
1	video	200	mjpeg	720x480, q=2-31, fps=5
Feed camera3.ffm
Stream	type	kbit/s	codec	Parameters
0	video	2048	mjpeg	720x480, q=1-15, fps=5
1	video	200	mjpeg	720x480, q=2-31, fps=5
Feed camera4.ffm
Stream	type	kbit/s	codec	Parameters
0	video	2048	mjpeg	720x480, q=1-15, fps=5
1	video	200	mjpeg	720x480, q=2-31, fps=5
Feed camera5.ffm
Stream	type	kbit/s	codec	Parameters
0	video	2048	mjpeg	720x480, q=1-15, fps=5
1	video	200	mjpeg	720x480, q=2-31, fps=5
Feed camera6.ffm
Stream	type	kbit/s	codec	Parameters
0	video	2048	mjpeg	720x480, q=1-15, fps=5
1	video	200	mjpeg	720x480, q=2-31, fps=5
Connection Status
Number of connections: 13 / 100
Bandwidth in use: 12288k / 100000k
#	File	IP	URL	Proto	State	Target bit/s	Actual bit/s	Bytes transferred
1	stat.html	192.168.0.111	/stat.html	HTTP/1.1	HTTP_WAIT_REQUEST	0	0	0
2	camera6	192.168.0.25	/camera6	HTTP/1.1	WAIT_FEED	2048k	2146k	14167k
3	camera5	192.168.0.25	/camera5	HTTP/1.1	WAIT_FEED	2048k	361k	2283k
4	camera4	192.168.0.25	/camera4	HTTP/1.1	WAIT_FEED	2048k	1057k	5250k
5	camera3	192.168.0.25	/camera3	HTTP/1.1	WAIT_FEED	2048k	2014k	11945k
6	camera2	192.168.0.25	/camera2	HTTP/1.1	WAIT_FEED	2048k	2001k	12048k
7	camera1	192.168.0.25	/camera1	HTTP/1.1	WAIT_FEED	2048k	2224k	13723k
8	camera6.ffm(input)	127.0.0.1	/camera6.ffm	HTTP/1.1	RECEIVE_DATA	4096k	2745k	14136M
9	camera3.ffm(input)	192.168.0.102	/camera3.ffm	HTTP/1.1	RECEIVE_DATA	4096k	2726k	45513M
10	camera2.ffm(input)	192.168.0.102	/camera2.ffm	HTTP/1.1	RECEIVE_DATA	4096k	2640k	44056M
11	camera5.ffm(input)	192.168.0.53	/camera5.ffm	HTTP/1.1	RECEIVE_DATA	4096k	494k	7198M
12	camera4.ffm(input)	192.168.0.55	/camera4.ffm	HTTP/1.1	RECEIVE_DATA	4096k	1119k	31739M
13	camera1.ffm(input)	127.0.0.1	/camera1.ffm	HTTP/1.1	RECEIVE_DATA	4096k	2707k	40509M
Generated at Tue Aug 16 18:09:04 2022

Je te poste ma config de FFserver, ben le status avec les configs, pour te montrer en MJpeg mes débits et usages etc…

Je ne suis pas spécialiste en la matière mais il est vrai que la bande passante utilisée pour toutes tes caméras n’est pas exagéré. Probablement que cela vient de ton bas fps.
Si les images sont de bonnes qualités, c’est un bon choix.
En fait, je débute avec l’enregistrement des vidéos car les applis deviennent payantes (stockage & détection améliorée).
Les formats H26X ont l’air de fournir un bon compromis haute qualité vidéo et bas débit.
Mais comme tu dis, il faut le matériel adapté et le MJpeg n’est pas mal non plus.
En vidéosurveillance, la HEVC n’est pas nécessairement utile.
Peut-être que je devrais passer par le vendeur/fabricant pour voir si ma caméra sort un flux MJpeg.
Mais recevoir une réponse n’est pas évident avec les vendeurs d’Amazon et souvent les marques ne font pas long feu.
En tout cas grâce à toi on en apprend pas mal.
Un grand merci pour le partage de tes expériences et informations pertinentes.