import os
import datetime
import numpy as np
import cv2
import pyautogui
import pyaudio
import wave
import threading
import keyboard
import time
import subprocess
def find_device(p, target_name):
for i in range(p.get_device_count()):
dev_info = p.get_device_info_by_index(i)
if target_name.lower() in dev_info['name'].lower():
return i
return None
def record_screen():
# Ustawienie nazwy folderu
date_time_str = datetime.datetime.now().strftime("%d_%m_%Y_%H_%M")
folder_name = date_time_str
folder_path = os.path.abspath(folder_name)
if not os.path.exists(folder_path):
os.makedirs(folder_path)
# Generowanie nazw plików
video_file = "video.avi"
audio_file = "audio.wav"
output_file = "output.mp4"
video_path = os.path.join(folder_path, video_file)
audio_path = os.path.join(folder_path, audio_file)
output_path = os.path.join(folder_path, output_file)
# Wyprintuj wszystkie ścieżki do plików
print(f"Folder nagrywania: {folder_path}")
print(f"Ścieżka do pliku wideo: {video_path}")
print(f"Ścieżka do pliku audio: {audio_path}")
print(f"Ścieżka do pliku wyjściowego: {output_path}")
print(f"Rozpoczęcie nagrywania za 1 sekundę...")
time.sleep(1)
# Ustawienia nagrywania wideo
screen_size = pyautogui.size()
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter(video_path, fourcc, 20.0, screen_size)
# Ustawienia nagrywania audio
chunk = 1024
fmt = pyaudio.paInt16
channels = 2
rate = 48000
p = pyaudio.PyAudio()
device_index = find_device(p, "CABLE Output")
if device_index is None:
print("Nie znaleziono urządzenia 'CABLE Output'. Upewnij się, że jest włączone.")
return False
try:
stream = p.open(format=fmt, channels=channels, rate=rate, input=True, input_device_index=device_index, frames_per_buffer=chunk)
except Exception as e:
print(f"Nie udało się otworzyć urządzenia audio: {e}")
return False
frames = []
recording = True
def record_audio():
while recording:
try:
data = stream.read(chunk)
frames.append(data)
except Exception as e:
print(f"Błąd podczas nagrywania audio: {e}")
break
audio_thread = threading.Thread(target=record_audio)
audio_thread.start()
print("Rozpoczęto nagrywanie. Naciśnij 'q', aby zakończyć.")
while True:
img = pyautogui.screenshot()
frame = np.array(img)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
out.write(frame)
if keyboard.is_pressed('q'):
print("Przycisk 'q' naciśnięty, kończę nagrywanie.")
break
recording = False
audio_thread.join()
# Zakończenie nagrywania audio
stream.stop_stream()
stream.close()
p.terminate()
# Zapisz audio do pliku
save_audio(frames, p, audio_path, channels, fmt, rate)
# Zakończenie nagrywania wideo
out.release()
cv2.destroyAllWindows()
# Funkcja pomocnicza do sprawdzania istnienia plików
def check_files_exist(folder_path, video_file, audio_file):
video_path = os.path.join(folder_path, video_file)
audio_path = os.path.join(folder_path, audio_file)
if not os.path.exists(video_path):
print(f"Plik wideo nie istnieje: {video_path}")
return False
if not os.path.exists(audio_path):
print(f"Plik audio nie istnieje: {audio_path}")
return False
return True
if check_files_exist(folder_path, video_file, audio_file):
print("Wszystkie pliki istnieją. Można kontynuować.")
return True
else:
print("Niektóre pliki nie istnieją. Zatrzymuję.")
return False
def polacz(folder_path, video_file, audio_file, output_file):
ffmpeg_command = [
'ffmpeg', '-hide_banner',
'-i', os.path.join(folder_path, video_file),
'-i', os.path.join(folder_path, audio_file),
'-c:v', 'copy',
'-c:a', 'aac',
'-strict', 'experimental',
os.path.join(folder_path, output_file)
]
try:
result = subprocess.run(ffmpeg_command, capture_output=True, text=True, check=True)
print("Output:", result.stdout)
print("Errors:", result.stderr)
except subprocess.CalledProcessError as e:
print("Błąd podczas łączenia:", e)
print("Szczegóły błędu:", e.stderr)
def save_audio(frames, p, audio_path, channels, fmt, rate):
try:
with wave.open(audio_path, 'wb') as wf:
wf.setnchannels(channels)
wf.setsampwidth(p.get_sample_size(fmt))
wf.setframerate(rate)
wf.writeframes(b''.join(frames))
except Exception as e:
print(f"Błąd podczas zapisywania pliku audio: {e}")
if __name__ == "__main__":
# Uruchom nagrywanie
# if record_screen():
# # Jeśli nagrywanie zakończyło się sukcesem, połącz pliki
# polacz("20_08_2024_10_10", "video.avi", "audio.wav", "output.mp4")
# else:
# print("Nagrywanie nie powiodło się, pliki nie zostały połączone.")
# record_screen()
polacz("20_08_2024_10_10", "video.avi", "audio.wav", "output.mp4")
Dzień dobry mam taki kod jak powyżej.
Nie chodzi tu o sam kod główny tylko o jego działanie.
# record_screen()
polacz("20_08_2024_10_10", "video.avi", "audio.wav", "output.mp4")
Dane w połącz są wpisane z palca celem testowania .
Jeżeli go teraz uruchomię wszystko działa poprawnie.
Natomiast jeżeli od komentuje record_screen() polacz zwraca błąd Conversion failed! .
Plik jest tworzony ale nie da się go odtworzyć.
Nie rozumiem tego zachowania bo jedno nie ma nic wspólnego z drugim.