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.
Nehmen wir insgesamt den folgenden Ablauf an.
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.
Ich werde versuchen, das berühmte Pyaudio zu verwenden.
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.
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)
Machen wir einen Screenshot mit ImageGrab.
pip install Pillow
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