Versuchen Sie, mit Python (1) eine Erfassungssoftware zu erstellen, die so genau wie möglich ist.

Einführung

OS:windows10 64bit python:3.7

Es gibt Unmengen von Software, die aufzeichnen können. Aufzeichnen des Bildschirms einer bestimmten Website zu einem bestimmten Zeitpunkt Weil es keine Software gab, die den super persönlichen Bedarf decken konnte Ich werde es in Python schreiben, als wäre es ein spielerisches Gehirntraining.

Es ist nicht so schwierig, Artikel separat zu schreiben. Aus zeitlichen Gründen werde ich in verschiedenen Teilen schreiben.

Darüber hinaus verschiedene Probleme, die während der Arbeit aufgetreten sind, Es ist sehr überflüssig, weil ich darüber schreibe, wie ich damit umgehen soll. Bitte beachten Sie.

Politik

Nehmen wir insgesamt den folgenden Ablauf an.

    1. Befehlsausführung zum angegebenen Zeitpunkt
  1. Starten Sie den Browser mit der voreingestellten URL
    1. Nehmen Sie Browser-Screenshots und Audio auf
  2. Videoausgabe durch Zusammenführen von Browser-Screenshots und Audio

Diese Seite berücksichtigt 3. Es fühlt sich an wie eine schnelle Überprüfung der berühmten Bibliotheken von Python Ich konnte nichts finden, das gleichzeitig Bild und Ton aufnehmen kann. (Vielleicht, wenn du nach Git suchst. Ich würde es begrüßen, wenn du es mir sagen könntest.)

Ich denke, es ist einfach, alles mit ffmpeg zu machen. Dieses Mal werde ich es unter der bedeutungslosen Bindung versuchen, es auf Python-Code auszuführen.

Audioaufnahme

Ich werde versuchen, das berühmte Pyaudio zu verwenden.

Installieren Sie pyaudio

Je nach Person kann meine Hand anhalten, daher schreibe ich sie als Memo. Bei der Installation von pyaudio ist in meiner Umgebung der folgende Fehler aufgetreten.

src/_portaudiomodule.c(29): fatal error C1083: include
Datei kann nicht geöffnet werden.'portaudio.h':No such file or directory

Es scheint, dass das Build-Tool fehlschlägt. https://minato86.hatenablog.com/entry/2019/04/04/005929#portaudiohNo-such-file-or-directory Klicken Sie auf den obigen Link und installieren Sie ihn aus der WhL-Datei, die Ihrem PC entspricht.

pip install PyAudio-0.2.11-cp37-cp37m-win_amd64.whl

Meine Ausführungsumgebung ist Pycham. Ich laufe in einer virtuellen Umgebung von Python. Selbst wenn Sie den obigen Befehl ausführen, befindet er sich auf dem Laufwerk C. Es wird nur auf dem installierten Python installiert.

D:\~(Unterlassung)~\venv\Scripts\activate.bat

Nach dem Aktivieren der virtuellen Umgebung durch Drücken von enable.bat an der Eingabeaufforderung In diesem Zustand habe ich den obigen Befehl gedrückt, um es zu installieren.

Implementiert mit pyaudio

Nachdem die Installation abgeschlossen ist, zeichnen wir sie auf.

Ein Programm, das mit Python 3 aufzeichnet und in eine WAV-Datei schreibt
https://ai-trend.jp/programming/python/voice-record/

Ich weiß nicht, um welche Art von Bibliothek es sich handelt, daher habe ich vorerst kein Mikrofon angeschlossen Lassen Sie uns die Aufnahmebeispielquelle auf dieser Site so ausführen, wie sie ist.

OSError: [Errno -9998] Invalid number of channels

Es hörte mit einem Fehler auf. Dieser Fehler ist auf das Fehlen eines Aufzeichnungseingabegeräts zurückzuführen. „Was versuchst du ohne Mikrofon aufzunehmen?“ Ich bin wütend. Der in audio.open angegebene input_device_index scheint falsch zu sein. Lassen Sie uns das Audiogerät in Ihrem Computer überprüfen

import pyaudio
audio = pyaudio.PyAudio()
for i in range(audio.get_device_count()):
    dev = audio.get_device_info_by_index(i)
    print('name', dev['name'])
    print('index', dev['index'])
0 Microsoft Sound Mapper- Output, MME (0 in, 2 out)
<  1 BenQ GL2460 (NVIDIA High Defini, MME (0 in, 2 out)
   2 Realtek Digital Output (Realtek, MME (0 in, 2 out)
   5 Realtek Digital Output (Realtek High Definition Audio), Windows
DirectSound (0 in, 2 out)
   6 Realtek Digital Output (Realtek High Definition Audio), Windows WASAPI
(0 in, 2 out)
   ...
   ...
   ...
10 Stereomischer(Realtek HD Audio Stereo input), Windows WDM-KS (2 in, 0 out)
12 Mike(Realtek HD Audio Mic input), Windows WDM-KS (2 in, 0 out)

Ich war schon viel dort. Dies ist nicht der Fall, da BenQ und Realtek Digital Output Ausgabegeräte oder Lautsprecher sind. Ich kann ein Mikrofon als Eingabegerät sehen, Dadurch wird wahrscheinlich die Außenstimme aufgezeichnet.

Welches gibt wahrscheinlich den Ton in den Computer ein?

10 Stereomischer(Realtek HD Audio Stereo input), Windows WDM-KS (2 in, 0 out)

Der Stereomischer ist eine Funktion, die den Ton im Computer als Eingangston gibt. Hier wählen wir "Stereo Mixer" und führen es aus. (Es scheint, dass Sie es mit WASAPI tun können, aber ignorieren Sie es hier) Geben Sie die Nummer des Stereomischers in den Geräteindex ein und versuchen Sie es.

[Errno -9999] Unanticipated host error

Auch ein Fehler. Ich habe das Gefühl, dass es sich auch auf die Einstellungen auf der Betriebssystemseite bezieht. Lassen Sie uns die Einstellungen auf der Betriebssystemseite überprüfen

https://ahiru8usagi.hatenablog.com/entry/Windows10_Recording Sound Control Panel-> Aufnahme-Registerkarte-> Stereo-Mixer aktivieren, Wählen Sie in den Fenstern "Sound" -> "Input" für den Stereomischer.

So konnte ich sicher aufnehmen. (Der Code befindet sich im nächsten Kapitel)

Bildschirmaufnahme

Machen wir einen Screenshot mit ImageGrab.

pip install Pillow

Gleichzeitige Aufnahme und Audioaufnahme

Endlich der Code (Prototyp). Dieser Code hat einige Probleme, aber ich werde ihn als Fortschritt veröffentlichen.

import cv2
import numpy as np
from PIL import ImageGrab
import ctypes
import time
import pyaudio
import wave

#Startzeit sparen

# parentTime = time.time()
# for i in range(10):
#     img_cv = np.asarray(ImageGrab.grab())
# current = time.time()
# diff = (current - parentTime)
# print("fps:" + str(float(10)/diff))


user32 = ctypes.windll.user32
capSize = (user32.GetSystemMetrics(0), user32.GetSystemMetrics(1))

fourcc = cv2.VideoWriter_fourcc(*"DIVX")
writer = cv2.VideoWriter("test.mov", fourcc, 30, capSize)
count = 0
FirstFlag = True

WAVE_OUTPUT_FILENAME = "test.wav"
RECORD_SECONDS = 40

FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 2 ** 11
audio = pyaudio.PyAudio()
stream = audio.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    input_device_index=0,
                    frames_per_buffer=CHUNK)

frames = []

# #Startzeit sparen
# sTime = time.time()
# count = 0

print ("start")
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    # count+=1
    # if count == 30 :
    #     current = time.time()
    #     diff = (current - sTime)
    #     print("fps:" +  str(float(count)/diff))
    #     sTime = time.time()
    #     count = 0

    #Bilderfassung
    img_cv = np.asarray(ImageGrab.grab())
    img = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)
    writer.write(img)

    #Sprachaufnahme
    data = stream.read(CHUNK)
    frames.append(data)
print ("finish")


writer.release()
stream.stop_stream()
stream.close()
audio.terminate()

waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()

Code zum separaten Speichern von Video (mov) und Audio (wav). Die Aufnahmezeit beträgt 40 Sekunden, da dies die in RECORD_SECONDS angegebene Anzahl von Sekunden ist. Nun, wenn ich das versuche, ist das Ergebnis. .. ..

Die Audiodatei ist 39 Sekunden lang
Die Videodatei ist 28 Sekunden lang

Abgesehen von Audiodateien Die Videodatei ergab ein sehr verdächtiges Ergebnis.

writer = cv2.VideoWriter("test.mov", fourcc, 30, capSize)

Ich habe die Einstellung beim Speichern des Videos auf 30 eingestellt, aber Dieser Wert scheint unangemessen zu sein. Berechnen wir grob, wie viele fps sind.

    if count == 30 :
        current = time.time()
        diff = (current - sTime)
        print("fps:" +  str(float(count)/diff))
        sTime = time.time()
        count = 0

Das Ergebnis ist ungefähr fps14-19. Berechnung, dass 14 bis 19 Bilder pro Sekunde ausgegeben werden. Was Sie sich als die im Inhalt vorgenommene Verarbeitung vorstellen können, ist: Für Einzelbilder mit Intervallen von 0,06 Sekunden Da das Video so ausgegeben wurde, als ob es in Intervallen von 0,03 Sekunden kam, Es scheint, dass das Video schnell vorgespult wurde und die Zeit kurz war.

writer = cv2.VideoWriter("test.mov", fourcc, 15, capSize)

Wechseln Sie zu fps15 und Frames, die zu spät oder zu früh sind Möglicherweise können Sie das Problem der Zeit lösen, indem Sie überspringen und schreiben.

Aber vorher ... ist es langsam. Selbst wenn es aufgenommen werden kann, scheint es zu rasseln.

Was ist die Ursache des Prozesses? Versuchen wir, jeden Prozess zu beschleunigen.

#ImageGrab alleine
parentTime = time.time()
for i in range(40):
    img = ImageGrab.grab()
current = time.time()
diff = (current - parentTime)
print("fps:" + str(float(40)/diff))

#ImageGrab+numpy
parentTime = time.time()
for i in range(40):
    img_cv = np.asarray(ImageGrab.grab())
current = time.time()
diff = (current - parentTime)
print("fps:" + str(float(40)/diff))

Als Ergebnis

ImageGrab.grab()27fps alleine,
ImageGrab.grab()20fps beim Konvertieren von in numpy.
ImageGrab.grab()18fps mit Konvertierung von Numpy und RGB-Konvertierung.

Ich sage nicht, dass ImageGrab.grab () langsam ist, aber es ist ein kleines Problem, wenn man über eine Nachbearbeitung nachdenkt.

Sie können jeden Konvertierungsprozess verbessern. Versuchen Sie, etwas schneller als ImageGrab.grab () zu finden, das das Bild erfasst.

https://stackoverrun.com/ja/q/3379877

Beziehen Sie sich auf die obige Site und versuchen Sie, mit Windows API auszugeben.

# windows_api
import win32gui, win32ui, win32con, win32api
hwin = win32gui.GetDesktopWindow()
width = 1920
height = 1080
left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
hwindc = win32gui.GetWindowDC(hwin)
srcdc = win32ui.CreateDCFromHandle(hwindc)
memdc = srcdc.CreateCompatibleDC()
bmp = win32ui.CreateBitmap()
bmp.CreateCompatibleBitmap(srcdc, 1920, 1080)
memdc.SelectObject(bmp)

parentTime = time.time()
arr = []
for i in range(30):
    memdc.BitBlt((0, 0), (width, height), srcdc, (left, top),
win32con.SRCCOPY)
    arr.append(memdc)
current = time.time()
diff = (current - parentTime)
print("fps:" + str(float(30)/diff))
fps:48.752326144998015

fps48. Es ist explosiv. Es scheint interessant zu sein, daher werde ich es mit der Richtlinie zur Verwendung dieser API beheben.

Ich habe das nächste Mal keine Zeit mehr

Recommended Posts

Versuchen Sie, mit Python (1) eine Erfassungssoftware zu erstellen, die so genau wie möglich ist.
Versuchen Sie, mit Python (2) eine Erfassungssoftware zu erstellen, die so genau wie möglich ist.
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Versuchen Sie, Facebook mit Python zu betreiben
Wie man Selen so leicht wie möglich macht
Versuchen Sie, sich mit Python bei qiita anzumelden
Fraktal zum Erstellen und Spielen mit Python
Versuchen Sie, Foldl und Foldr mit Python: Lambda zu machen. Auch Zeitmessung
Versuchen Sie, ein festgelegtes Problem der High-School-Mathematik mit Python zu lösen
Versuchen Sie, Ihr eigenes AWS-SDK mit bash zu erstellen
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
Ich möchte ein Spiel mit Python machen
Versuchen Sie, Python-Dokumente automatisch mit Sphinx zu generieren
Versuchen Sie, Client-FTP mit Pythonista am schnellsten zu machen
Versuchen Sie, Fische mit Python + OpenCV2.4 (unvollendet) zu erkennen.
Ich habe versucht, die Zusammenführungssortierung in Python mit möglichst wenigen Zeilen zu implementieren
WEB Scraping mit Python und versuchen, aus Bewertungen eine Wortwolke zu machen
Versuchen Sie es mit Python.
Versuchen Sie, das Programmier-Herausforderungsbuch mit Python3 zu lösen
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
Probieren Sie die DB-Operation mit Python aus und visualisieren Sie sie mit d3
Versuchen Sie, mit MVC eine RESTful-API mit Flask 1.0.2 zu erstellen
Versuchen Sie, hochfrequente Wörter mit NLTK (Python) zu extrahieren.
Versuchen Sie es mit GUI, PyQt in Python
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
[AWS] Versuchen Sie, die Python-Bibliothek mit SAM + Lambda (Python) zur Ebene hinzuzufügen.
Experimentieren Sie mit Python, um ein PDF für Selbstversorger für Kindle zu erstellen
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
So einfach wie möglich eine GUI mit Python erstellen [tkinter edition]
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Es ist Halloween, also werde ich versuchen, es mit Python zu verstecken
Versuchen Sie, die verstümmelten Zeichen im angehängten Dateinamen mit Python zu entschlüsseln
Versuchen Sie, den Boden durch Rekursion herauszufordern
Stellen Sie mit Python eine Verbindung zu BigQuery her
Kameraerfassung mit Python + OpenCV
Versuchen Sie, Python selbst zu verstehen
Probieren Sie die Python-Ausgabe mit Haxe 3.2 aus
Stellen Sie mit Python eine Verbindung zu Wikipedia her
Post to Slack mit Python 3
Machen Sie es mit der Syntax einfach
Erstelle Puyopuyo AI mit Python
Versuchen Sie, Python mit Try Jupyter auszuführen
Schalten Sie Python mit Alternativen auf 2.7 um
Schreiben Sie mit Python in csv
Versuchen Sie die Gesichtserkennung mit Python
Ich habe versucht, mein eigenes High-School-Mädchen BOT im Rinna-Stil mit LINE BOT (Python & Heroku) zu machen.
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Aktiviert, um PNG mit Pillow of Python in JPG zu konvertieren
Rubyist hat versucht, eine einfache API mit Python + Flasche + MySQL zu erstellen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen