Kasutatavad skriptid
Tänaseks on süsteemi oluliselt muudetud. Kui algselt oli siin skripti näidiseid neli kuni viis, siis täna ainult kolme saabki jagada.
DS18b20 ja DHT22

Antud skript on lääne poolse välise anduri (DS18b20) viimase mõõtmise võtmiseks ja minu enda andmebaasi kirjutamiseks. JSON mängimine on veel paras peavalu, kuid töötab :) Sarnane skript on ka DHT22 anduri jaoks väikeste mööndustega.

                        
#!/usr/bin/python3.7
# -*- coding: utf-8 -*-

"""
Skript mis loeb viimast kirjet kesksest andmebaasist ja kirjutab minu andmebaasi.
Loeb nii temperatuuri kui ka niiskus, kuid paneb mõlemad eraldi tabelisse.
"""

import subprocess   # Päringu käivitamiseks
import json         # tulemuse parsimise jaoks
import pymysql.cursors  # Andmebaasiga ühenduseks
import math         # floor funktsiooni jaoks

"""
Funktsioon, mis float tüüpi väärtusel võtab ilma ümardamata koma kohti.
1.456 kaks kohta on 1.45 (ei ümerdanud)
"""
def truncate(f, n):
    return math.floor(f * 10 ** n) / 10 ** n

# Enda andmebaasiga ühenduse tegemine
conn = pymysql.connect(host='SERVER', port=3306, user='USER', passwd='PAROOL', db='DATABASENAME', )

# Päring andmebaasist koos SQL lausega ja tulemuse kinni püüdmine
cmd = subprocess.Popen(['curl', '-X', 'POST', '-k', 'https://SERVER/FOLDER/query?u=USER&p=PAROOL&db=DATABASE', '--data-urlencode', 'q=SELECT * FROM TABEL ORDER BY time DESC LIMIT 1 tz(\'Europe/Tallinn\');' ], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
output,error = cmd.communicate()

# Mängimine JSONiga
d = json.loads(output)

results = d['results']
series = results[0]['series']
values = series[0]['values'] # Siin on üks või mitu kirjet kuupäev ja väärtus

# Vaatame kui palju andmeid on ja hakkame neid kuidagi andmebaasi lisama.
if len(values) > 0:
    window = 'west'
    place = 'out'
    for x in range(len(values)):
        time = d['results'][0]['series'][0]['values'][x][0]
        tempTime = time[0:19]
        timeParts = tempTime.split("T")
        time = timeParts[0] + " " + timeParts[1]
        temp = d['results'][0]['series'][0]['values'][x][1]

        if temp is not None:
            print(time + " " + str(truncate(temp,1)) + " " + window + " " + place)
            cur = conn.cursor()
            cur.execute("INSERT INTO TABLENAME SET added = '" + time + "', celsius = " + str(temp) + ", window = '" + window  + "', place = '" + place + "'")
            conn.commit()

conn.close() # Sulgeme andmebaasi ühenduse
                        
                    
CPU Temperatuur

Antud juhul on tegemist Raspberry Pi peal oleva CPU temperatuuri mõõtmine ja info edastamine sisevõrgus olevasse kesksesse andmebaasi. Jällegi tegemist Pythoni skriptiga. Seda skripti käivitatakse iga minuti järgi.

                        
#!/usr/bin/python3.7
# -*- coding: utf-8 -*-

import subprocess # Et käsureal saaks CPU temperatuuri kätte
import pymysql.cursors  # Andmebaasiga ühenduseks
from datetime import datetime

cmd = '/usr/bin/vcgencmd'
opt = 'measure_temp'

result = subprocess.Popen([cmd, opt], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = result.communicate()
# b"temp=47.8'C\n"
correct = output.strip().decode('ascii')
parts = correct.strip().split('=')

temp = parts[1][0:4]
time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

#print(temp + " " + time)

conn = pymysql.connect(host='LAN_SERVER', port=3306, user='USERNAME', passwd='PASSWORD', db='DATABASE', )
cur = conn.cursor()
cur.execute("INSERT INTO TABLENAME SET added = '" + time + "', celsius = " + str(temp))
conn.commit()
conn.close()

                        
                    
Video tegemine

Raspbeery Pi on nüüd peaaegu ainult pildistamiseks. Pilte tehakse iga minut ja siis, kui toimub liikumine. Päevas võib pilte palju tulla ja kui need on kõik ühes kaustas koos, siis on väga raske (aeglane) selle kausta sisu lugeda. Tavaline päev on 10 - 20 tuhat pilti. Antud skript aga tõstab pildid õigetesse kaustadesse (kuupäevad) ning siis teeb etteantud parameetritega videoklipi. Antud skript on pikk ja vajaks ümbertegemist ;). Skripti käivitan käsitsi, siis kui vaja on videot ning on kirjutatud Pythonis.

2021-02-11_1280x720_30fps_mov_0800-1800.mp4
Näide failinimest. Esmalt kuupäev, siis pildi mõõdud (video suurus). Selle järgi fps. Siin on kas mov (liikumine) või min (iga minut). Lõpuks veel kellaaeg.

                        
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Name:     CreateMotionMovie.py
# Version:  2.1
# Date:     24.11.2018
# Author:   (c) Marko Livental

""" 
Description:

Teeb raspberry pi "motion" piltidest etteantud parameetritega video. Video saab teha minutite kui liikumiste baasil tehtud piltidest. Videole saab 
määrata FPS'i. Lisaks saab määrata milliste kellaaegade pilte kasutada. Kõige olulisem ja mitte viimane on see et võimaldab teha aasta video, kui 
pilte on ikka piisavalt. Loe: kuupäevi on piisavalt. Aasta video pole muud kui modifitseeritud minutite baasil tehtud video.
Vajadusel saab lugeda kokku kui palju pilte mingil kuupäeval on tehtud. NÜÜD arvutatakse MIN ja MOV pildid eraldi kokku, kuid päeva piltide
mahtu näidatakse ühiselt.

Versioon 2.1 UUENDUS: Minuti baasil videol kahe päeva puhul arvestab nüüd kellaaega (kuu liikumine üle keskköö)

"""

# IMPORDID
import argparse                     # Käsureal majandamiseks
import time                         # time.strptime jaoks ja time.strftime jaoks
import glob, os, re, shutil, sys    # Skripti töö lõpetamiseks (sys) ja failidega majandamiseks
import subprocess                   # Vajalik välise programmi käivitamiseks (shell)
from datetime import datetime       # Et saaksime kuupäeva soovitud kujul
from datetime import timedelta      # päeva kaupa toimetamine

# SEADED
srcPath = '/home/pi/cameraImages/'  # Siin on pildid
dstPath = '/home/pi/nice/'          # Siia kopeeritakse pildid ja tehkse video
warning = 'Pole'
scriptStop = False                  # Kas eelkontrollitud vea pärast tuleb skripti töö lõpetada
daysTotal = 1                       # Päevi kokku 1 või mitu
fileMP4 = ''                        # See on failinime vastavalt parameetritele

# Iga minuti tagant tehtavad ja liikumise pildid
minMatch = re.compile('^[0-9]{4}-[0-9]{2}-[0-9]{2}\_[0-9]{6}\.jpg$')
movMatch = re.compile('^[0-9]{4}-[0-9]{2}-[0-9]{2}\_[0-9]{6}\_[0-9]{2}\.jpg$')

minutid = []
movies = []

counter = 0

# Värvid
RED = '\033[1;31m'
GRN = '\033[1;32m'
END = '\033[0;0m'


# FUNKTSIOONID
def showTimeStamp():
    return (datetime.now().strftime("%H:%M:%S"))

def parseCommandLine():
    parser = argparse.ArgumentParser(prog='createMotionMovie.py', formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=100, width=100), description='Teeb video faili motion failidest. Pildid pannakse kokku nii minuti baasil piltidest, kui liikumise peale piltidest.')
    # Kohustuslik parameeter
    parser.add_argument('-s', '--startDate', type=lambda s: time.strptime(s, '%Y-%m-%d'), help='Algus kuupäev on KOHUSTUSLIK. Kuupäeva vorming on AAAA-KK-PP. Sellest kuupäevast alustatakse või tehakse selle kuupäeva video.', required=True)
    # Valikuleine parameeter
    parser.add_argument('-e', '--endDate', type=lambda e: time.strptime(e, '%Y-%m-%d'), nargs='?', help='Valikuline. Lõpu kuupäev, kui mitme päeva videod kokku miksida. Kuupäeva vorming on AAAA-KK-PP')
    # Valikuline minuti või liikumise baasil default min
    parser.add_argument('-m', '--movie', type=str, nargs='?', const='min', default='min', help='Vaikimisi tehakse iga minuti video. Väärtuse mov puhul liikumiste video. Väärtused on min või mov')
    # Valikuline fps. Vaikimisi on 60
    parser.add_argument('-f', '--fps', type=int, nargs='?', const=60, default=60, help='Vaikimisi tehakse video 60 FPSi. Lubatud täisarvud.')
    # Valikuline vaikimisi videot ei tehtua
    parser.add_argument('-c', '--count', type=bool, nargs='?', const=False, default=False, help='Mõõdetakse kaustade suurust (maht ja faile kokku) kuupäevade kaupa. Vaikimisi False. MP4 faili ei tehta.')
    # Teha aasta video
    parser.add_argument('-y', '--year', type=bool, nargs='?', const=False, default=False, help='Tehakse aasta video True. Vaikimisi False. Lisaks tuleks määrata ka võti -t mis valib kellaaja. Vaikimisi on ajaks kell 12:00 (failinimes 1200).')
    # Kui on määratud, siis tehakse selles kellaaja vahemikus olevatest piltidest video (Võimaldab teha talivseal ajal ainult valges videod)
    parser.add_argument('-t', '--time', type=str, nargs='?', default='0000:2359', help='Võimaldab määrata kellaajad mis vahemikus pildid valitakse. Vaikimisi 0000:2359. Video. Sobib aasta videoks või talviste pimeda aja asemel teha päevased klipid, mitte kogu päev.')

    args = parser.parse_args()
    return args

def days_between(d1, d2):
    d1 = datetime.strptime(d1, "%Y-%m-%d")
    d2 = datetime.strptime(d2, "%Y-%m-%d")
    return abs((d2 - d1).days)

def manageFolders():
    uniqueFilenames = set(getUniqueFilenames(srcPath))      # Eemaldab duplikaadid (ei ole kaustateed) set unordered
    result = list(uniqueFilenames)                          # Unikaalsed kuupäevad (ei ole kaustateed)
    result.sort()                                           # Sorteerimi tulemuse
    count = 0                                               # Loeme kopeeritud failid kokku
    # Käib kogu massiivi ükshaaval läbi
    for i in range(0, len(result)):
        # Teeme kausta, kui seda pole
        if srcPath + result[i] != srcPath + 'lastsnap.jpg':
            createNewFolder(srcPath + result[i])    # Teeme kausta kui seda pole
            count += moveFilesNewFolder(result[i])  # Tõsatme failid uude kausta ja loendame need samas kokku
    return count

def getUniqueFilenames(source):
    files = glob.glob(srcPath + '*.jpg')
    allFiles = list()
    for file in files:
        if file.endswith('.jpg'):
            (filepath, filename) = os.path.split(file)
            allFiles.append(filename.split('_')[0])
    return allFiles

# Uue kasuta tegemine
def createNewFolder(folderName): # Kasutanimi koos kasutateega
    if not os.path.exists(folderName):
        os.makedirs(folderName)

def moveFilesNewFolder(startFilename):
    files = glob.glob(srcPath + startFilename + '_*.jpg') # Kõik sobivad päeva failid
    count = 0
    for file in files:
        count += 1
        shutil.move(file, srcPath + startFilename)
    return count

# Kustutab failid dstPath kaustas, kui see pole tühi. Eelnevalt kontrollib,
# kas see on olemas või mitte. Kui pole, siis teeb selle
def DelFilesIfNecessarry():
    if not os.path.exists(dstPath):
        os.makedirs(dstPath)
        print(showTimeStamp() + " - tehti kaust: " + dstPath)
    else:
        # Failide kokku lugemiseks
        i = 0
        # Kas kaust, kuhu kopeerida uued failid on tühi
        if os.listdir(dstPath) != []:
            fileList = os.listdir(dstPath)
            for fileName in fileList:
                os.remove(dstPath + fileName)
                i += 1
            print(showTimeStamp() + ' - kaustas ' + GRN + dstPath + END + ' oli ' + str(i) + ' fail(i) ja need kustutati!')
        else:
            print(showTimeStamp() + ' - kaust ' + RED + dstPath + END + ' oli tühi!')

# Loetakse ainult minuti failid etteantud kuupäeva kaustast
def minutiFailid(files, kuupaev):
    global minutid, startDate, endDate
    for filename in files:
        fileDate = filename.split("_")[0] # Failinime osa
        fileTime = int((filename.split('_')[1])[0:4]) # Siit võetakse tunnid ja minutid failinimest ja tehakse integeriks
        if daysTotal == 2: # Arvestab kahe päeva puhul kellaaegasid õigesti minuti baasil
            if minMatch.match(filename) and fileDate == kuupaev and fileDate == startDate and fileTime >= int(startTime):
                minutid.append(srcPath + kuupaev + '/' + filename)
            elif minMatch.match(filename) and fileDate == kuupaev and fileDate == endDate and fileTime <= int(endTime):
                minutid.append(srcPath + kuupaev + '/' + filename)
        elif minMatch.match(filename) and fileDate == kuupaev and (fileTime >= int(startTime) and fileTime <= int(endTime)):
            """ Arvestab vaikimisi varianti """
            minutid.append(srcPath + kuupaev + '/' + filename)
    minutid.sort()

# Loetakse ainult movie failid
def movieFailid(files, kuupaev):
    global movies
    for filename in files:
        fileTime = int((filename.split('_')[1])[0:4])
        if movMatch.match(filename) and (fileTime >= int(startTime) and fileTime <= int(endTime)):
            movies.append(srcPath + kuupaev + '/' + filename)
    movies.sort()

# Otsib kõik minuti failid ülesse
def getNeededMinFiles():
    fileCounter = 0
    if endDate != '':
        start = datetime.strptime(startDate, '%Y-%m-%d')    # Kuupäev koos ajaga aga aeg on 0
        end = datetime.strptime(endDate, '%Y-%m-%d')        # Kuupäev koos ajaga aga aeg on 0
        step = timedelta(days=1)
        #sTime = int(startTime)  # Algus kellaaeg
        #eTime = int(endTime)    # Lõpu kellaaeg
        while start <= end:
            currentDate = start.date()
            start += step
            filePath = os.path.join(srcPath + str(currentDate) + '/')
            if os.path.isdir(filePath):
                files = os.listdir(filePath)
                minutiFailid(files, str(currentDate))
                result = CopySpecificFiles(minutid, str(currentDate))
                fileCounter += result
            else:
                print(showTimeStamp() + ' - kausta ' + RED + filePath + END + ' ei leitud!')
                #sys.exit()
        return fileCounter
    else:
        filePath = os.path.join(srcPath + startDate + '/')
        if os.path.isdir(filePath):
            files = os.listdir(filePath)
            minutiFailid(files, startDate)
            result = CopySpecificFiles(minutid, startDate)
            fileCounter += result
            return fileCounter
        else:
            print(showTimeStamp() + ' - kausta ' + RED + filePath + END + ' ei leitud!')
            #sys.exit()

def getNeededMovFiles():
    filesCounter = 0
    if endDate != '':
        start = datetime.strptime(startDate, '%Y-%m-%d')    # Kuupäev koos ajaga aga aeg on 0
        end = datetime.strptime(endDate, '%Y-%m-%d')        # Kuupäev koos ajaga aga aeg on 0
        step = timedelta(days=1)
        while start <= end:
            currentDate = start.date()
            start += step
            filePath = os.path.join(srcPath + str(currentDate) + '/')
            if os.path.isdir(filePath):
                files = os.listdir(filePath)
                movieFailid(files, str(currentDate))
                result = CopySpecificFiles(movies, str(currentDate))
                filesCounter += result
            else:
                print(showTimeStamp() + ' - kausta ' + RED + filePath + END + ' ei leitud!')
                #sys.exit()
        return filesCounter
    else:
        filePath = os.path.join(srcPath + startDate + '/')
        if os.path.isdir(filePath):
            files = os.listdir(filePath)
            movieFailid(files, startDate)
            result = CopySpecificFiles(movies, startDate)
            filesCounter += result
            return filesCounter
        else:
            print(showTimeStamp() + ' - kausta ' + RED + filePath + END + ' ei leitud!')
            #sys.exit()

# Kopeeritakse kõik etteantud failid uude kausta uue nimega
def CopySpecificFiles(files, kuupaev):
    filesCounter = 0
    filesTotal = 0
    # Milliste failidega on tegemist
    fromSrc = srcPath + kuupaev + '/*'
    # Käib kogu sorteeritud massiivi failikaupa läbi
    for file in sorted(files):
        # Näitab failinime ilma kaustata
        filename = os.path.basename(file)
        fileDate = filename.split("_")[0]
        if fileDate == kuupaev:
            newFileName = ChangeFileName(filename, kuupaev)
            dstPathWithFile = os.path.join(dstPath + newFileName)
            # Kontrolli kas on fail ja ja õige päevaga, siis kopeeri
            if os.path.isfile(file):
                shutil.copy2(file, dstPathWithFile)
                filesCounter += 1
    #print(showTimeStamp() + ' - kopeeritud ja ümbernimetatud ' + GRN + str(filesCounter) + END + ' faili. Kuupäev: ' + kuupaev)
    return filesCounter

# Failinime muutmine
def ChangeFileName(filename, kuupaev):
    global counter
    filenameparts = filename.split('_')
    # Vormindame numbri kuuekohaliseks ja tühik täidetakse nullidega 000000 kuni 999999
    newFileName = 'image_' + '{0:06d}'.format(counter) + '.jpg'
    counter += 1
    return newFileName

def showHeader():
    print('')
    print('  Kaust    Maht  Min   Mov')
    print('--------------------------')

# Arvutab kasuta mahu kokku
def du(path):
    """disk usage in human readable format (e.g. '2,1GB')"""
    return subprocess.check_output(['du','-sh', path]).split()[0].decode('utf-8')

# Loendame failid kokku ja mõõdame kasuta suurust
def countFilesAndSize():
    if endDate != '':   # Kui on mitu kausta
        start = datetime.strptime(startDate, '%Y-%m-%d')
        end = datetime.strptime(endDate, '%Y-%m-%d')
        step = timedelta(days=1)
        showHeader()
        while start <= end:
            currentDate = start.date()
            start += step
            thisPath = os.path.join(srcPath + str(currentDate) + '/')
            if os.path.isdir(thisPath):
                files = os.listdir(thisPath)
                mins = 0
                movs = 0
                for file in files:
                    if minMatch.match(file):
                        mins += 1
                    elif movMatch.match(file):
                        movs += 1
                print(str(currentDate) + ' ' + str(du(thisPath)).rjust(4) + ' ' + str(mins).zfill(4) + ' ' + str(movs).rjust(5))
            else:
                print(str(currentDate) + RED + ' kausta pole.' + END)

    else:               # Ühe kasuta kokku lugemine
        thisPath = os.path.join(srcPath + startDate + '/')
        if os.path.isdir(thisPath):
            showHeader()
            files = os.listdir(thisPath)
            mins = 0
            movs = 0
            for file in files:
                if minMatch.match(file):
                    mins += 1
                elif movMatch.match(file):
                    movs += 1
            print(startDate + ' ' + str(du(thisPath)) + ' ' + str(mins) + ' ' + str(movs))
        else:
            print(showTimeStamp() + ' - kausta ' + RED + thisPath + END + ' ei leitud.')
# MAIN
print(showTimeStamp() + ' - Skript käivitati.\n')
args = parseCommandLine()
#print(args)
# Omistame käsurealt saadud muutujatele väärtused
# Algus kuupäev
startDate = time.strftime('%Y-%m-%d', args.startDate)   # Algus Kuupäev kujule YYYY-MM-DD
fileMP4 += startDate + '_'

# Lõpu kuupäev
if args.endDate != None:
    endDate = time.strftime('%Y-%m-%d', args.endDate)
    if args.startDate > args.endDate: # Kui algus kuupäev on suurem kui lõpu kuupäev, vahetame päevad ringi
        tmp = startDate
        tmpFull = args.startDate
        args.startDate = args.endDate
        args.endDate = tmpFull
        startDate = endDate             # Mulle vajalik (str)
        endDate = tmp                   # Mulle vajalik (str)
    daysTotal = days_between(startDate, endDate) + 1
    fileMP4 += endDate + '_'
else:
    endDate = ''

# Lisame failinimele resolutsiooni ja FPSi
movie = args.movie.lower()      # Kas MOV või MIN (default MIN)
fps = args.fps          # FPS täisarvuna (default 60)
count = args.count      # Failide loendamine (default False)
year = args.year        # Aasta video True või False
fileMP4 += '1280x720_' + str(fps)+'fps_'

if not year:
    fileMP4 += movie + '_'
else:
    movie = 'year'
    fileMP4 += movie + '_'

# Kontrollime aastat ja sellega seotud kellaaega
time = args.time
if year:
    if args.time == '0000:2359':
        startTime = '1200'
        endTime = '1200'
    else:
        if args.time.split(':')[0] != args.time.split(':')[1]:  # Kui pole sama number, siis on asi katki
            warning = 'Aasta videol peab olema algus- ja lõpu kellaaeg sama.'
            scriptStop = True
            startTime = args.time.split(':')[0] # See ei lähe kasutusse
            endTime = args.time.split(':')[1]   # See ei lähe kasutusse
        else:
            startTime = args.time.split(':')[0]
            endTime = args.time.split(':')[1]
    if endDate == '': # Aasta videole on vaja lõpukuupäeva ka!
        warning = 'Aasta videol tuleb määrata nii algus kui lõpukuupäev.'
        scriptStop = True
else:
    # Kontrollime kellaaega
    if args.time != '0000:2359':
        startTime = args.time.split(':')[0]
        endTime = args.time.split(':')[1]
    else:
        startTime = '0000'
        endTime = '2359'

fileMP4 += startTime + '-' + endTime + '.mp4'

# Kontrollime aasta ja failide lugemise sõltuvust
if count and year:
    warning = 'Samaaegselt ei saa teha aasta videot ja loendada faile.'
    scriptStop = True

if count:
    fileMP4 = 'Pole'

# VÄLJASTAME ALGINFO
print('Algus kuupäev:    ' + startDate)
print('Lõpu kuupäev:     ' + endDate)
print('Päevi kokku:      ' + str(daysTotal))
print('Kellaajad:        ' + time)
print('Algusaeg:         ' + startTime)
print('Lõpuaeg:          ' + endTime)
print('Video tüüp:       ' + movie)
print('Video FPS:        ' + str(fps))
print('Aasta video:      ' + str(year))
print('Failide lugemine: ' + str(count))
print('Failinimi:        ' + fileMP4)
if scriptStop:
    print('Hoiatused:        ' + RED + warning + END + '\n')
else:
    print('Hoiatused:        ' + GRN + warning + END +'\n')

# Siin vastavalt valikutele tegevused
if not scriptStop:
    # Kui skript jääb tööle, siis esmalt teeme kindlad liigutused
    print(showTimeStamp() + ' - tõstame failid õigetesse kaustadesse.')
    result = manageFolders()    # Kui palju faile ümber tõsteti
    print(showTimeStamp() + ' - tõsteti ' + GRN + str(result) + END + ' fail(i) õigetesse kaustadesse.')
    DelFilesIfNecessarry()      # Kustutab dstPath kaustast failid kui on või teeb kasuta kui pole
    # Siit algab tegevus vastavalt käsurea parameetritele
    if count:   # Failide loendamine
        print(showTimeStamp() + ' - LOENDAME FAILE')
        countFilesAndSize()
    elif year:  # Aasta video. Nüüd nagu MIN video
        print(showTimeStamp() + ' - AASTA VIDEO')
        result = getNeededMinFiles() # Vajalikud failid on listis minutid
        print(showTimeStamp() + ' - kokku kopeeriti ja nimetati ümber ' + GRN + str(result) + END + ' faili.')
        print(showTimeStamp() + ' - Palun oota, teen MP4 faili...')
        #cmd = '/usr/bin/avconv -r ' + str(fps) + ' -i ' + dstPath + 'image_%06d.jpg -r ' + str(fps) + ' -vcodec libx264 -crf 20 -g 15 -vf scale=w=1280:h=720 -v quiet ' +  dstPath + fileMP4
        cmd = '/usr/bin/ffmpeg -loglevel quiet -framerate ' + str(fps) + ' -i ' + dstPath + 'image_%06d.jpg ' + dstPath + fileMP4
	subprocess.call(cmd, shell=True)
        print(showTimeStamp() + ' - Failiasukoht: ' + GRN + (dstPath + fileMP4) + END)
        fileSize = os.path.getsize(dstPath + fileMP4)
        print(showTimeStamp() + ' - Faili suurus baitides: ' + RED + '{:,}'.format(fileSize).replace(',',' ') + END) # iga tuhande vahel on tühik default ,
    elif movie == 'min':    # Minutite video
        print(showTimeStamp() + ' - MINUTITE VIDEO')
        result = getNeededMinFiles() # Vajalikud failid on listis minutid
        print(showTimeStamp() + ' - kokku kopeeriti ja nimetati ümber ' + GRN + str(result) + END + ' faili.')
        print(showTimeStamp() + ' - Palun oota, teen MP4 faili...')
        #cmd = '/usr/bin/avconv -r ' + str(fps) + ' -i ' + dstPath + 'image_%06d.jpg -r ' + str(fps) + ' -vcodec libx264 -crf 20 -g 15 -vf scale=w=1280:h=720 -v quiet ' +  dstPath + fileMP4
        cmd = '/usr/bin/ffmpeg -loglevel quiet -framerate ' + str(fps) + ' -i ' + dstPath + 'image_%06d.jpg ' + dstPath + fileMP4
	subprocess.call(cmd, shell=True)
        print(showTimeStamp() + ' - Failiasukoht: ' + GRN + (dstPath + fileMP4) + END)
        fileSize = os.path.getsize(dstPath + fileMP4)
        print(showTimeStamp() + ' - Faili suurus baitides: ' + RED + '{:,}'.format(fileSize).replace(',',' ') + END) # iga tuhande vahel on tühik default ,
    elif movie == 'mov':    # Liikumiste vide
        print(showTimeStamp() + ' - LIIKUMISTE VIDEO')
        result = getNeededMovFiles() # Vajalikud liikumiste failid
        print(showTimeStamp() + ' - kokku kopeeriti ja nimetati ümber ' + GRN + str(result) + END + ' faili.')
        print(showTimeStamp() + ' - Palun oota, teen MP4 faili...')
        #cmd = '/usr/bin/avconv -r ' + str(fps) + ' -i ' + dstPath + 'image_%06d.jpg -r ' + str(fps) + ' -vcodec libx264 -crf 20 -g 15 -vf scale=w=1280:h=720 -v quiet ' +  dstPath + fileMP4
	cmd = '/usr/bin/ffmpeg -loglevel quiet -framerate ' + str(fps) + ' -i ' + dstPath + 'image_%06d.jpg ' + dstPath + fileMP4
        subprocess.call(cmd, shell=True)
        print(showTimeStamp() + ' - Failiasukoht: ' + GRN + (dstPath + fileMP4) + END)
        fileSize = os.path.getsize(dstPath + fileMP4)
        print(showTimeStamp() + ' - Faili suurus baitides: ' + RED + '{:,}'.format(fileSize).replace(',',' ') + END) # iga tuhande vahel on tühik default ,
    else:
        print('Midagi ei tehta. Kuidas see juhtus?')
else:
    print(showTimeStamp() + ' - ' + RED + 'Leiti viga või mitu!' + END)

print(showTimeStamp() + ' - Skript lõpetas töö')
                        
                    

Skripti kirjutamise kohta saab lugeda siit. Lõpus on ka ekraanipilte käsureavõtmetest ja ühe "videoklipi tegemine". Tänu Raspberry Pi 4-le on video tegemine nüüd ikka oluliselt kiirem. Postituses olev näide on üldse Windowsi arvutis :) VIdeoid saab vaadata videote alt.

© 2016 - 2024 Marko Livental