Kirjoittaja Aihe: Kuvaruudun videokaappaus pythonilla  (Luettu 1005 kertaa)

ilkant

  • Käyttäjä
  • Viestejä: 1545
  • Kubuntu
    • Profiili
Kuvaruudun videokaappaus pythonilla
« : 04.07.25 - klo:21.00 »
Löysin FaceBookista python-koodin kuvaruudun videokaappaukselle. Asenin pipillä vaaditut paketit. Ja asensin Gnomen kuvaruudunkaappausohjelman. Ohjelman suorittaminen ilmoitti bugin. Ja tämä bugi tulee Genomen kuvaruudunkaappausohjelmasta? Ajoin ohjelman Kubuntu 25.04:ssä Waylandilla.  Taitaa jäädä epäonnistuneeksi kokeiluksi tuo sinänsä niin kätevä ja lyhyt ohjelma. Onko *"XVID" Windows-ympäristöön sopiva parametri cv2.VideoWriter_fourcc -funktiolle?

Koodia: [Valitse]
$ python screen_recorder.py
OpenCV: FFMPEG: tag 0x44495658/'XVID' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'
Recording... Press 'q' to stop.
Traceback (most recent call last):
  File "/mnt/sda1/Python/screen_recorder.py", line 19, in <module>
    screen = pyautogui.screenshot()
  File "/home/ilpo/.local/lib/python3.13/site-packages/pyscreeze/__init__.py", line 628, in _screenshot_linux
    raise Exception(
        'To take screenshots, you must install Pillow version 9.2.0 or greater and gnome-screenshot by running `sudo apt install gnome-screenshot`'  # noqa
    )
Exception: To take screenshots, you must install Pillow version 9.2.0 or greater and gnome-screenshot by running `sudo apt install gnome-screenshot`
$ sudo apt install gnome_screenshot
Error: Pakettia gnome_screenshot ei löydy   
$ sudo apt install gnome-screenshot
Installing:                                 
  gnome-screenshot

Installing dependencies:
  libhandy-1-0

Summary:
  Upgrading: 0, Installing: 2, Removing: 0, Not Upgrading: 12
  Download size: 432 kB
  Space needed: 1 957 kB / 374 GB available

Continue? [K/e]
Nouda:1 http://fi.archive.ubuntu.com/ubuntu plucky/main amd64 libhandy-1-0 amd64 1.8.3-2 [251 kB]
Nouda:2 http://fi.archive.ubuntu.com/ubuntu plucky/universe amd64 gnome-screenshot amd64 41.0-3 [182 kB]

$ python screen_recorder.py
OpenCV: FFMPEG: tag 0x44495658/'XVID' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'
Recording... Press 'q' to stop.
** Message: 18:57:54.329: Unable to use GNOME Shell's builtin screenshot interface, resorting to fallback X11.

(gnome-screenshot:14836): Gdk-CRITICAL **: 18:57:54.329: gdk_pixbuf_get_from_surface: assertion 'width > 0 && height > 0' failed

(gnome-screenshot:14836): GdkPixbuf-CRITICAL **: 18:57:54.329: gdk_pixbuf_get_width: assertion 'GDK_IS_PIXBUF (pixbuf)' failed

(gnome-screenshot:14836): GdkPixbuf-CRITICAL **: 18:57:54.329: gdk_pixbuf_get_height: assertion 'GDK_IS_PIXBUF (pixbuf)' failed
*** BUG ***
In pixman_region32_init_rect: Invalid rectangle passed
Set a breakpoint on '_pixman_log_error' to debug


(gnome-screenshot:14836): GdkPixbuf-CRITICAL **: 18:57:54.329: gdk_pixbuf_get_width: assertion 'GDK_IS_PIXBUF (pixbuf)' failed

(gnome-screenshot:14836): GdkPixbuf-CRITICAL **: 18:57:54.329: gdk_pixbuf_get_height: assertion 'GDK_IS_PIXBUF (pixbuf)' failed

(gnome-screenshot:14836): Gtk-CRITICAL **: 18:57:54.354: gtk_window_resize: assertion 'width > 0' failed

** (gnome-screenshot:14836): CRITICAL **: 18:57:54.355: Unable to capture a screenshot of any window
q
^CTraceback (most recent call last):
  File "/usr/lib/python3/dist-packages/PIL/ImageGrab.py", line 78, in grab
    size, data = Image.core.grabscreen_x11(display_name)
                 ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
OSError: X get_image failed: error 8 (73, 0, 890)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/mnt/sda1/Python/screen_recorder.py", line 19, in <module>
    screen = pyautogui.screenshot()
  File "/home/ilpo/.local/lib/python3.13/site-packages/pyscreeze/__init__.py", line 603, in _screenshot_linux
    im = ImageGrab.grab()  # use Pillow's grab() for Pillow 9.2.0 and later.
  File "/usr/lib/python3/dist-packages/PIL/ImageGrab.py", line 87, in grab
    subprocess.call(["gnome-screenshot", "-f", filepath])
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/subprocess.py", line 397, in call
    return p.wait(timeout=timeout)
           ~~~~~~^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/subprocess.py", line 1277, in wait
    return self._wait(timeout=timeout)
           ~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/subprocess.py", line 2063, in _wait
    (pid, sts) = self._try_wait(0)
                 ~~~~~~~~~~~~~~^^^
  File "/usr/lib/python3.13/subprocess.py", line 2021, in _try_wait
    (pid, sts) = os.waitpid(self.pid, wait_flags)
                 ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
KeyboardInterrupt

$

pkill

  • Käyttäjä
  • Viestejä: 291
    • Profiili
Vs: Kuvaruudun videokaappaus pythonilla
« Vastaus #1 : 05.07.25 - klo:11.08 »
Tekoälyn kautta on kätevä pyöräyttää nuo ohjelmat tai pyytää niitä tekemään kokonaan uusi. Varsinkin jostain epämääräisiltä sivuilta löytyvät koodipätkät kannattaa tarkastuttaa ennenkuin niitä lähtee suorittamaan. Wayland on yhä niin rikkinäinen ja huonosti tuettu, ettei monikaan videokaappari siinä toimi.

Grokkiin voi lähettää koodin suoraan tutkittavaksi.

https://grok.com/

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11533
    • Profiili
    • Tomin kotisivut
Vs: Kuvaruudun videokaappaus pythonilla
« Vastaus #2 : 05.07.25 - klo:13.47 »
GNOMEn kuvaruudun kaappaus tukee vain GNOMEa (Mutteria). Sillä ei siis kannata yrittää kaapata KDE:ssa. Videon kaappaukseen muutenkin oikea tapa olisi Pipewire. Toimii X:ssä ja Waylandissä.
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

ilkant

  • Käyttäjä
  • Viestejä: 1545
  • Kubuntu
    • Profiili
Vs: Kuvaruudun videokaappaus pythonilla
« Vastaus #3 : 05.07.25 - klo:23.30 »
Grokkiin voi lähettää koodin suoraan tutkittavaksi.

Kiitos tuosta Grok-linkistä. Uusi tuttavuus minulle. Se antoikin heti kaksi korjausehdotusta.

Muistan KDE:n kehitysjutuista, että Spectaclessakin on ainkin yritetty saada aikaan myös videointimahdollisuutta. En ole sitä ohjelmaa tutkinut, onko sellainen jo olemassa. Tässä on tullut kokeiltua erinäisiä python-koodinpätkiä eri asioista ja opittukin jotain pientä.

Olin 2000-luvun alukupuolella tekemisissä Java J2EE:n kanssa pintapuolisesti. Nyt kun etsiskelin tietoa, onko niitä olemassa Python-maailmassa, törmäsin Enterprise Edition 5:een. Java on siis kehittynyt ilmeisesti kolme major-luokan versionpäivitystä Enternprise Editionissa. Alkaa nuo asiat olla niin pitkälle kehittyneitä, että kun ei ole pakkoa oppia niitä enää, niin jää harrastustasolle.
« Viimeksi muokattu: 05.07.25 - klo:23.33 kirjoittanut ilkant »

ilkant

  • Käyttäjä
  • Viestejä: 1545
  • Kubuntu
    • Profiili
Vs: Kuvaruudun videokaappaus pythonilla
« Vastaus #4 : 06.07.25 - klo:00.00 »
Löytyi tietoa, että KDE Spectacle voi kaapata kuvaruutuvideon Wayland-ympäristössä. Joten tuo aiempi koodi jää nyt vain koodausharjoitukseksi.  :)

ilkant

  • Käyttäjä
  • Viestejä: 1545
  • Kubuntu
    • Profiili
Vs: Kuvaruudun videokaappaus pythonilla
« Vastaus #5 : 10.07.25 - klo:13.41 »
Kokeilin Grokia tehtävään: Hae LibreOffice-taulukosta rivien 2-200 ensimmäisien sarakkeiden arvot. Niille piti sitten tehdä jotain. Grok sai aikaan toimivan ohjelman, mutta se teki kummallista. Löysi taulukosta arvoja, joita ei siellä ollut. Lopulta tajusin, että se hakee niitä ihan muusta taulukosta, kuin siitä, mikä on avattu käyttöön. Ilmeisesti tuo tapa ottaa kaikki ODF-taulukot käyttöön muistakin hakemistoista? Ja jopa tekstinkäsittelyasiakirjat? Eli meni ainakin tunti hukkaan kun setvin asiaa.  :D Nyt turvaudun kirjaan Beyond the basic stuff with python. Vielä tarvitaan ihmisen älyä koodaukseen. Tuossa Grokin koodissa saattaa olla pari riviä testauksiani, mutta tällaista se antoi:

Koodia: [Valitse]
from odf import opendocument, table
from odf.table import Table, TableRow, TableCell
from odf.text import P

tiedosto = 'taulukko.ods'                                                                 # Avaa LibreOffice-taulukko
dok = opendocument.load(tiedosto)
arvot = []                                                                                         # Lista arvojen tallentamiseen

print("For-silmukkaan mennään")
for taulukko in dok.spreadsheet.getElementsByType(Table):       # Käy läpi taulukot
    rivit = taulukko.getElementsByType(TableRow)
    for rivi in rivit[2:200]:                                                                  # Rajoita 200 ensimmäiseen riviin
        solut = rivi.getElementsByType(TableCell)

        if solut[0] != None:  # Varmista, että rivillä on soluja
            # Hae solun tekstisisältö
            teksti = solu.getElementsByType(P)
            if teksti:
               arvo = str(teksti[0])
            else:
               # Jos solussa ei ole tekstielementtiä, hae arvo suoraan
               arvo = str(solu)
            arvot.append(arvo)

pkill

  • Käyttäjä
  • Viestejä: 291
    • Profiili
Vs: Kuvaruudun videokaappaus pythonilla
« Vastaus #6 : 10.07.25 - klo:14.53 »
Kokeilin Grokia tehtävään: Hae LibreOffice-taulukosta rivien 2-200 ensimmäisien sarakkeiden arvot. Niille piti sitten tehdä jotain. Grok sai aikaan toimivan ohjelman, mutta se teki kummallista. Löysi taulukosta arvoja, joita ei siellä ollut. Lopulta tajusin, että se hakee niitä ihan muusta taulukosta, kuin siitä, mikä on avattu käyttöön. Ilmeisesti tuo tapa ottaa kaikki ODF-taulukot käyttöön muistakin hakemistoista? Ja jopa tekstinkäsittelyasiakirjat? Eli meni ainakin tunti hukkaan kun setvin asiaa.  :D Nyt turvaudun kirjaan Beyond the basic stuff with python. Vielä tarvitaan ihmisen älyä koodaukseen. Tuossa Grokin koodissa saattaa olla pari riviä testauksiani, mutta tällaista se antoi:

Koodia: [Valitse]
from odf import opendocument, table
from odf.table import Table, TableRow, TableCell
from odf.text import P

tiedosto = 'taulukko.ods'                                                                 # Avaa LibreOffice-taulukko
dok = opendocument.load(tiedosto)
arvot = []                                                                                         # Lista arvojen tallentamiseen

print("For-silmukkaan mennään")
for taulukko in dok.spreadsheet.getElementsByType(Table):       # Käy läpi taulukot
    rivit = taulukko.getElementsByType(TableRow)
    for rivi in rivit[2:200]:                                                                  # Rajoita 200 ensimmäiseen riviin
        solut = rivi.getElementsByType(TableCell)

        if solut[0] != None:  # Varmista, että rivillä on soluja
            # Hae solun tekstisisältö
            teksti = solu.getElementsByType(P)
            if teksti:
               arvo = str(teksti[0])
            else:
               # Jos solussa ei ole tekstielementtiä, hae arvo suoraan
               arvo = str(solu)
            arvot.append(arvo)

Se noissa tekoälyissä on ihmeellistä, että ne harvemmin ekalla kerralla saa mitään toimivaa aikaan, vaan aina vaatii useamman korjausyrityksen ja usein seuraava korjausyritys rikkoo jo aiemmin korjatun.

Onhan niitä maksullisia koodaukseen painottuvia tekoälyjä, jotka varmaan toimisi paljon paremmin.

ilkant

  • Käyttäjä
  • Viestejä: 1545
  • Kubuntu
    • Profiili
Vs: Kuvaruudun videokaappaus pythonilla
« Vastaus #7 : 11.07.25 - klo:17.51 »
Nyt kokeilin tekoälyä graafin piirtämiseksi painokäyrästä, verenpaineista. Dataa on vuodelta 2017 asti kohtalaisen paljon melkein joka päivältä. Kopioin tietoja käsin kolmesta eri taulukosta. Ehkä tekoäly olisi osannut tehdä senkin kun sanoo, minkäniminen sarake pitää sijoittaa mihinkin. Ja ehkä se olisi osannut tarkistaa päiväykset, jotta tulee kronologiseen järjestykseen. Tein sen kuitenkin käsin.

Sitten huomasin siitä tehdyssä CSV-tiedostossa, että desimaalipilkut sotkevat pythonin Pandas lukemista. Tekoälyä kehiin formatointiohjelmaan. Ja kas kummaa, sepä osasi vaihtaa desimaalipilkut desimaalipisteiksi keskeltä riviä ja vain halutuista sarakkeista. Melkein tunsi itsensä fiksuksi kun osasi kertoa tuon Grokille.

Mutta sitten sain sen piirtämään graafin. Ja siitäpä nauru repesi. Painokäyrä tuli tähdenmuotoiseksi sakaroineen. Nyt juon kahvit ja jatkan sitten korjaamista.