Autostart einer Videoaufnahme & Umwandlung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
gragtoni435
User
Beiträge: 10
Registriert: Donnerstag 9. Januar 2020, 10:00

Hallo Zusammen,

folgende Frage an die Experten hier, da ich mit Python leider keine Erfahrung habe:

Ich habe eine Raspberry Pi 4 und die dazugehörige RaspiCam V2.1 und möchte damit beim Start direkt eine automatische Videoaufnahme für eine bestimmte Zeit starten. Das hab ich mit einer record.desktop Datei im Autostart-Menü geschafft. Dazu noch ein Shell-Script, damit die Video-Datei immer mit dem Datum und der Uhrzeit benannt wird, damit sich neue Videodateien nicht ständig überschreiben.

Problem ist nun, dass die Video-Datei im .h264 Format aufgenommen wird und bei dieser Datei kein Time-Code vorhanden ist. Um eine Untertitel Datei einzufügen benötige ich aber einen Time-Code. :roll:

Ist es möglich mit einen Programm in Python die Video-Datei direkt automatisch in bspw. .mp4 umzuwandeln?
Oder bei Python direkt angeben, dass die Video-Datei in einem anderen Format als .h264 erstellt werden soll?
Oder wäre es sinnvoller den kompletten Autostart der Aufnahme (und falls benötigt, die anschließender Umwandlung) alles in Python zu programmieren?

Bestenfalls soll dann die Untertitel-Datei noch automatisch ins Video eingebunden werden. Aber das wäre dann erst Thema wenn ich es überhaupt soweit geschafft habe.

Bevor ich mich da nämlich reinfuchse hätte ich gern eine Abwägung von Leuten mit Ahnung ob das überhaupt möglich ist und ob ich dann gegebenenfalls auch Hilfe bekomme.

Vielen Dank für jegliche Hilfe & beste Grüße!
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Ich kenne mich leider nicht damit aus, aber ich habe gesehen es gibt eine Möglichkeit dieses .h264 Format mithilfe von GPAC mit einer Zeile im Terminal in .mp4 umzuwandeln. Du könntest dann z.B. ein Python Script erstellen, welches alle .h264 Dateien sucht und in eine Liste packt. Diese Liste wird dann durchgegangen und für jede .h264 Datei in der Liste kannst du mit subprocess das Terminal öffnen mit dem richtigen Befehl und Parameter.

Beispiel (nur zur Veranschaulichung):

Code: Alles auswählen

import os
FILES = ["09-01-2020.h264", "08-01-2020.h264", "07-01-2020.h264"]


for file in FILES:
    filename = os.path.splitext(file)[0]
    subprocess.run(["MP4Box", "-add", file , f"{filename}.mp4"])
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Für mich klingt das nach einem XY-Problem. Vielleicht kannst du mal beschreiben, worum es dabei insgesamt geht.
gragtoni435
User
Beiträge: 10
Registriert: Donnerstag 9. Januar 2020, 10:00

Ok, das ganze ist ein kleines Projekt für mich als Werksstudent in der Firma.
Die Firma hat ein kleines Hochregallager. Hier muss jedes Jahr der Stahlbau kontrolliert werden.
Und das würde man gerne mit einer Videoaufzeichnung durchführen, auch als Dokumentation hinterher.

Nun hab ich 2 Raspberry Pis bekommen, die in einem Behälter montiert werden sollen. Eine Kamera nimmt die rechte Seite und eine die linke Seite des Stahlbaus auf.
Nun soll der Behälter einfach auf das Lastaufnahmemittel gestellt werden und von dort aus versorgt werden.
Sobald die Versorgung angeschlossen ist, soll die Aufnahme automatisch starten.
Zum genauen Ausrichten sind auch 2 Displays (jeweils einen pro Pi) in dem Behälter eingebaut.

Sobald alles stimmt, fährt das Regalbediengerät automatisch in einer langsamen Geschwindigkeit den kompletten Stahlbau ab.
Anschließend soll eine Untertitel-Datei mit den Positionsdaten, welche wir aus der Steuerung des Geräts haben, unter das Video gelegt werden.

Nun habe ich es mit Raspivid versucht, aber hier wird eben eine Video-Datei erstellt, die keinen Time-Code hat. Daher nicht mehr der Untertitel-Datei verknüpfbar.

Beste Grüße!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Selbst wenn du da time codes bekommst - das synchron zu kriegen wird schwer. Weder Start noch Geschwindigkeit sind abgeglichen. Kannst du die positionsdaten sofort kriegen? Dann würde ich die zb per gstreamer gleich mit einblenden.

Und sonst hilft das hier: https://www.raspberrypi.org/forums/view ... hp?t=50553
gragtoni435
User
Beiträge: 10
Registriert: Donnerstag 9. Januar 2020, 10:00

Geplant ist, sobald die Vorrichtung ausgerichtet ist und das Programm zum Durchfahren startet, dass dann eine Datei mit folgendem Aufbau erstellt wird.

Code: Alles auswählen

1
00:00:05,500 --> 00:00:10,400
Untertitel her!!
2
00:00:12,500 --> 00:00:20,300
Jawohl!
3
00:00:25,500 --> 00:01:20,300
Top, das funktioniert!
Die Positionsdaten müssen auch nicht auf die Millisekunde genau richtig angezeigt werden. Es reicht grob zu wissen, wenn man das Video stoppt, an welcher X und Y-Koordinate man sich befindet um bei Problemen nochmal nachschauen zu könnnen.

Es gibt eventuell auch die Möglichkeit mit dem Programm Node-Red und einer Verbindung zur Steuerung die Positionsdaten dauerhaft aus der Steuerung abzufragen.
Dafür müsste ich mich aber auch da erstmal reinfuchsen ob und wie das möglich ist.
Ich hätte es mir nur einfacher vorgestellt, die Untertitel Datei einfach mit der Videodatei zu verknüpfen, aber dafür fehlt wie gesagt der Time-Code.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der link von mir könnte das Timecode Problem lösen. Schon probiert?
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Bei dem Code unten ist ein kleiner Fehler drin, dort steht MP$Box, da müsste aber MP4Box hin.
gragtoni435
User
Beiträge: 10
Registriert: Donnerstag 9. Januar 2020, 10:00

__deets__ hat geschrieben: Freitag 10. Januar 2020, 06:56 Der link von mir könnte das Timecode Problem lösen. Schon probiert?
Leider noch nicht. Es ist momentan Prüfungszeit, da hab ich wenig Zeit dafür. Ich versuche es aber die nächsten Tage zu versuchen.
Vielen Dank schonmal.

Eventuell ist auch ein direktes Abfragen der Untertitel möglich. Wie bindet man denn diese direkt rein? Das wäre natürlich die Optimallösung. Dazu muss ich aber erst eine stabile Abfrage der Positionsdaten aus der S7 Steuerung per Node-Red hinbekommen.

Beste Grüße
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zb mit der opencv kann man die Kamera benutzen & Text in Bilder einfügen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1231
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Alternativ könnte ein externes Unternehmen die Steuerung erweitern.
Selber ohne Ahnung zu basteln, kann einem den Kopf kosten.

Jedenfalls könnte die Schrittkette dann alle Positionen nacheinander abfahren und jedes mal ein digitales Signal ausgeben (positive Flanke), dass dann die Kamera veranlasst ein Foto zu machen.
Wenn es Sequentiell gemacht wird, braucht man noch nicht einmal die Information wo das Foto gemacht worden ist, sondern man braucht einfach nur den Ablauf der Testfahrt zu kennen.
Hat den Vorteil, dass du keine Videos auswerten musst und du hast Fotos für jede Strebe vorliegen.

Wenn es eine S5 ist, würde ich aber definitiv die Finger von lassen :-D
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
gragtoni435
User
Beiträge: 10
Registriert: Donnerstag 9. Januar 2020, 10:00

DeaD_EyE hat geschrieben: Mittwoch 15. Januar 2020, 11:29 Alternativ könnte ein externes Unternehmen die Steuerung erweitern.
Selber ohne Ahnung zu basteln, kann einem den Kopf kosten.

Jedenfalls könnte die Schrittkette dann alle Positionen nacheinander abfahren und jedes mal ein digitales Signal ausgeben (positive Flanke), dass dann die Kamera veranlasst ein Foto zu machen.
Wenn es Sequentiell gemacht wird, braucht man noch nicht einmal die Information wo das Foto gemacht worden ist, sondern man braucht einfach nur den Ablauf der Testfahrt zu kennen.
Hat den Vorteil, dass du keine Videos auswerten musst und du hast Fotos für jede Strebe vorliegen.

Wenn es eine S5 ist, würde ich aber definitiv die Finger von lassen :-D
Das ganze wurde sogar mal ausgeschrieben. Dabei war auch eine automatische Erkennung für Auffälligkeiten in die Beschreibung mit dabei.
Die Angebote der Firmen waren dann jedenfalls viel zu hoch. Somit wurde es eben als "abgespeckte" Version (Video mit Positionsdaten) an uns weitergegeben. Glaube die sind selbst gespannt, was da bei uns am Ende rauskommt :wink:
Den Ablauf, wie das Gerät durch den Stahlbau fährt kann man sich sowieso dann aus der Steuerung ziehen. Aber dann müsste man eben beim Video mitzählen an der wievielten Position man gerade ist. Das stell ich mir auch ziemlich nervig vor :lol:

Die Steuerung ist eine S7 (317 von Siemens)
gragtoni435
User
Beiträge: 10
Registriert: Donnerstag 9. Januar 2020, 10:00

So, jetzt kann ich das Thema endlich mal ernsthaft angehen. Prüfungen sind vorbei.
Bei weiterem Suchen im Internet habe ich das hier gefunden:

https://www.meccanismocomplesso.org/en/ ... and-video/

Das funktioniert auch ziemlich einfach, aber ist es möglich den Text hier zu konfigurieren? Oder ist in der Variante nur der feste Text möglich?
Ansonsten versuche ich mich mal an openCV um einen Text ins Video zu kriegen.

Beste Grüße & Vielen Dank für jegliche Hilfe
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das steht doch da:

Code: Alles auswählen

 camera.annotate_text = "I am what I am"
Und spaeter taucht das auf dem Bild auf. Was ausser einem konfigurierbaren Text sollte das denn sein?
gragtoni435
User
Beiträge: 10
Registriert: Donnerstag 9. Januar 2020, 10:00

__deets__ hat geschrieben: Freitag 7. Februar 2020, 16:13 Das steht doch da:

Code: Alles auswählen

 camera.annotate_text = "I am what I am"
Und spaeter taucht das auf dem Bild auf. Was ausser einem konfigurierbaren Text sollte das denn sein?
Ja das ist mir schon klar :)
Aber könnte ich diese Zeile so verändern, dass eben die Positionsdaten, die ständig immer neu mit Node-Red aus der CPU ausgelesen werden, dort eingefügt werden?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, natürlich. Was auch immer du da setzt, das wird dann eingeblendet.
gragtoni435
User
Beiträge: 10
Registriert: Donnerstag 9. Januar 2020, 10:00

__deets__ hat geschrieben: Sonntag 9. Februar 2020, 17:25 Ja, natürlich. Was auch immer du da setzt, das wird dann eingeblendet.
Glaube wir reden etwas aneinender vorbei.
Natürlich egal was ich da einsetze. Es ist eben nur eine sich ständig veränderter Wert in der X und Y-Koordinate.
Daher muss ich das ja so entsprechend hier einsetzen, dass es immer den neuen Wert dort automatisch einsetzt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist schon klar & ändert die Antwort nicht. Du kannst das jederzeit umsetzen/ändern. Und das wird dann übernommen.
gragtoni435
User
Beiträge: 10
Registriert: Donnerstag 9. Januar 2020, 10:00

Ok andere Frage: Wie mache ich das. Hab momentan keinerlei Ansatz, wie ich das realisieren kann.
Momentan habe ich nur eine automatische Videoaufnahme wie folgt realisiert:
Im Verzeichnis: /home/pi/.config/autostart
ist die Camrecord.desktop Datei mit folgendem Inhalt:

Code: Alles auswählen

[Desktop Entry]
Type=Application
Name=camrecord
Comment=camrecord
Exec=lxterminal -e /bin/bash /home/pi/video.sh
Terminal=false
Die video.sh Datei hat wiederrum diesen Inhalt:

Code: Alles auswählen

#!/bin/bash

dateiname=/home/pi/video_$(date "+%Y_%m_%d-%H_%M").h264

/usr/bin/raspivid -t 300000 -w 1280 -h 720 -o $dateiname
Soweit so gut. Nun arbeite ich dran die Positionsdaten via Node-Red aus der CPU ständig abzufragen.
Diese Daten sollen dann eben ständig aktualisierend ins Video eingebunden werden.
Ich habe hier im Forum geschrieben, weil mir ein Kollege aus der Firma empfohlen hat, es mit Python zu versuchen, da es hier eventuell umzusetzen ist.
Aber meine Fragen sind eben wie wie wie..?

Ob meine jetzige Realisierung der automatische Videoaufnahmen dann komplett gelöscht werden kann und es sinnvoller ist, alles in Python zu realisieren, das kann ich nicht beurteilen.
Ich hab ja noch nicht mal eine automatische Videoaufnahme mit Python beim Boot des Raspberrys geschafft.

Hier habe ich lediglich mal folgende Datei erstellt
textonvideo.py

Code: Alles auswählen

from picamera import PiCamera
import time;

camera = PiCamera()
camera.resolution = (1280,720)

camera.start_preview()
camera.annotate_text = "Untertitel her"
camera.start_recording('Versuch.h264')
time.sleep(10)
camera.stop_recording()
camera.stop_preview()
Und habe dieses Datei versucht im rc.local zu starten:

Code: Alles auswählen

#
# By default this script does nothing.
p
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
python /home/pi/textonvideo.py &
exit 0
Hätte gemeint die einzige Bedienung hierfür ist lediglich, dass der Link vor dem Exit 0 sein muss.
Funktioniert hat das Ganze aber bislang nicht.

Außerdem wird bei dem Umsetzen mit der .Desktop Datei und dem Shell Skript die aktuelle Aufnahme ständig auf dem Display angezeigt, welcher mit dem Raspberry dauerhaft verbunden ist. Das ist optimal zum justieren und einstellen der Kamera.

Ist das bei Python auch möglich?

Beste Grüße!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst die Aufnahme des Videos schon mit Python machen, wenn du da Kontrolle ueber die Untertitel haben willst. Und der Code den du gerade selbst gepostet hast, ist dafuer auch der richtige Ansatz - aber statt schlafen musst du schleifen, und eben die neuen Informationen (wie auch immer die aus dem Node Red rauskommen) abfragen, und einen entsprechenden Text setzen.

Hier ein kleiner Test, der ein Video mit 10 Untertiteln erzeugen sollte.

Code: Alles auswählen

from picamera import PiCamera
import time;

camera = PiCamera()
camera.resolution = (1280,720)

camera.start_preview()
camera.annotate_text = "Untertitel her"
camera.start_recording('Versuch.h264')
for i in range(10):
    camera.annotate_text = "Untertitel {}".format(i)
    time.sleep(1)  
  
camera.stop_recording()
camera.stop_preview()
Antworten