fmpeg nie uruchamia się w skrypcie

fmpeg nie uruchamia się w skrypcie
sasiadstar
  • Rejestracja:prawie 10 lat
  • Ostatnio:9 miesięcy
  • Postów:44
0
Kopiuj
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.

Kopiuj
 # 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.


我討厭愚蠢的答案。
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:4 minuty
  • Postów:4941
0

A w której linii, rzuca Ci wyjątek? Ano może mieć coś wspólnego jeśli polacz i/lub record_audio mają "side effects"; sprawdź to pod debugerem.


JB
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 4 godziny
  • Lokalizacja:Holandia
  • Postów:851
0

Nie próbowałeś komentować fragmentów funkcji " record_screen() " - od takich rzeczy się zaczyna zwykle, żeby namierzyć błąd.


sasiadstar
  • Rejestracja:prawie 10 lat
  • Ostatnio:9 miesięcy
  • Postów:44
0
Kopiuj
Uruchamiam polecenie FFmpeg:
ffmpeg -loglevel debug -i 20_08_2024_10_10\video.avi -i 20_08_2024_10_10\audio.wav -c:v copy -c:a aac -strict experimental 20_08_2024_10_10\output.mp4
Błąd podczas łączenia: Command '['ffmpeg', '-loglevel', 'debug', '-i', '20_08_2024_10_10\\video.avi', '-i', '20_08_2024_10_10\\audio.wav', '-c:v', 'copy', '-c:a', 'aac', '-strict', 'experimental', '20_08_2024_10_10\\output.mp4']' returned non-zero exit status 4294967274.
Szczegóły błędu (stderr): ffmpeg version 2023-09-04-git-f8503b4c33-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca 
--enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp 
--enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 --enable-d3d11va --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      58. 19.100 / 58. 19.100
  libavcodec     60. 25.100 / 60. 25.100
  libavformat    60. 11.100 / 60. 11.100
  libavdevice    60.  2.101 / 60.  2.101
  libavfilter     9. 11.100 /  9. 11.100
  libswscale      7.  3.100 /  7.  3.100
  libswresample   4. 11.100 /  4. 11.100
  libpostproc    57.  2.100 / 57.  2.100
Splitting the commandline.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument 'debug'.
Reading option '-i' ... matched as output url with argument '20_08_2024_10_10\video.avi'.
Reading option '-i' ... matched as output url with argument '20_08_2024_10_10\audio.wav'.
Reading option '-c:v' ... matched as option 'c' (codec name) with argument 'copy'.
Reading option '-c:a' ... matched as option 'c' (codec name) with argument 'aac'.
Reading option '-strict' ...Routing option strict to both codec and muxer layer
 matched as AVOption 'strict' with argument 'experimental'.
Reading option '20_08_2024_10_10\output.mp4' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option loglevel (set logging level) with argument debug.
Successfully parsed a group of options.
Parsing a group of options: input url 20_08_2024_10_10\video.avi.
Successfully parsed a group of options.
Opening an input file: 20_08_2024_10_10\video.avi.
[AVFormatContext @ 00000162db1e4fc0] Opening '20_08_2024_10_10\video.avi' for reading
[file @ 00000162db1e5ec0] Setting default whitelist 'file,crypto,data'
[avi @ 00000162db1e4fc0] Format avi probed with size=2048 and score=100
[avi @ 00000162db1ee2c0] use odml:1
[avi @ 00000162db1e4fc0] Before avformat_find_stream_info() pos: 5854 bytes read:99528 seeks:4 nb_streams:1
[mpeg4 @ 00000162db1de400] Format yuv420p chosen by get_format().
[avi @ 00000162db1e4fc0] All info found
[avi @ 00000162db1e4fc0] After avformat_find_stream_info() pos: 119038 bytes read:179944 seeks:4 frames:1
Input #0, avi, from '20_08_2024_10_10\video.avi':
  Metadata:
    software        : Lavf58.76.100
  Duration: 00:00:01.90, start: 0.000000, bitrate: 3650 kb/s
  Stream #0:0, 1, 1/20: Video: mpeg4 (Simple Profile), 1 reference frame (XVID / 0x44495658), yuv420p(left), 1600x900 [SAR 1:1 DAR 16:9], 0/1, 3720 kb/s, 20 fps, 20 tbr, 20 tbn        
Successfully opened the file.
Parsing a group of options: input url 20_08_2024_10_10\audio.wav.
Successfully parsed a group of options.
Opening an input file: 20_08_2024_10_10\audio.wav.
[AVFormatContext @ 00000162db1ecb00] Opening '20_08_2024_10_10\audio.wav' for reading
[file @ 00000162db1ed800] Setting default whitelist 'file,crypto,data'
[wav @ 00000162db1ecb00] Format wav probed with size=2048 and score=99
[wav @ 00000162db1ecb00] Before avformat_find_stream_info() pos: 44 bytes read:65580 seeks:1 nb_streams:1
[wav @ 00000162db1ecb00] probing stream 0 pp:32
[wav @ 00000162db1ecb00] probing stream 0 pp:31
[wav @ 00000162db1ecb00] probing stream 0 pp:30
[wav @ 00000162db1ecb00] probing stream 0 pp:29
[wav @ 00000162db1ecb00] probing stream 0 pp:28
[wav @ 00000162db1ecb00] probing stream 0 pp:27
[wav @ 00000162db1ecb00] probing stream 0 pp:26
[wav @ 00000162db1ecb00] probing stream 0 pp:25
[wav @ 00000162db1ecb00] probing stream 0 pp:24
[wav @ 00000162db1ecb00] probing stream 0 pp:23
[wav @ 00000162db1ecb00] probing stream 0 pp:22
[wav @ 00000162db1ecb00] probing stream 0 pp:21
[wav @ 00000162db1ecb00] probing stream 0 pp:20
[wav @ 00000162db1ecb00] probing stream 0 pp:19
[wav @ 00000162db1ecb00] probing stream 0 pp:18
[wav @ 00000162db1ecb00] probing stream 0 pp:17
[wav @ 00000162db1ecb00] probing stream 0 pp:16
[wav @ 00000162db1ecb00] probing stream 0 pp:15
[wav @ 00000162db1ecb00] probing stream 0 pp:14
[wav @ 00000162db1ecb00] probing stream 0 pp:13
[wav @ 00000162db1ecb00] probing stream 0 pp:12
[wav @ 00000162db1ecb00] probing stream 0 pp:11
[wav @ 00000162db1ecb00] probing stream 0 pp:10
[wav @ 00000162db1ecb00] probing stream 0 pp:9
[wav @ 00000162db1ecb00] probing stream 0 pp:8
[wav @ 00000162db1ecb00] probing stream 0 pp:7
[wav @ 00000162db1ecb00] probing stream 0 pp:6
[wav @ 00000162db1ecb00] probing stream 0 pp:5
[wav @ 00000162db1ecb00] probing stream 0 pp:4
[wav @ 00000162db1ecb00] probing stream 0 pp:3
[wav @ 00000162db1ecb00] probing stream 0 pp:2
[wav @ 00000162db1ecb00] probing stream 0 pp:1
[wav @ 00000162db1ecb00] probed stream 0
[wav @ 00000162db1ecb00] parser not found for codec pcm_s16le, packets or times may be invalid.
[wav @ 00000162db1ecb00] All info found
[wav @ 00000162db1ecb00] After avformat_find_stream_info() pos: 204844 bytes read:294956 seeks:1 frames:50
[aist#1:0/pcm_s16le @ 00000162db22e880] Guessed Channel Layout: stereo
Input #1, wav, from '20_08_2024_10_10\audio.wav':
  Duration: 00:00:02.05, bitrate: 1536 kb/s
  Stream #1:0, 50, 1/48000: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, 2 channels, s16, 1536 kb/s
Successfully opened the file.
Parsing a group of options: output url 20_08_2024_10_10\output.mp4.
Applying option c:v (codec name) with argument copy.
Applying option c:a (codec name) with argument aac.
Successfully parsed a group of options.
Opening an output file: 20_08_2024_10_10\output.mp4.
[out#0/mp4 @ 00000162db213400] No explicit maps, mapping streams automatically...
[vost#0:0/copy @ 00000162db21d140] Created video stream from input stream 0:0
[aost#0:1/aac @ 00000162db610840] Created audio stream from input stream 1:0
[file @ 00000162db23b600] Setting default whitelist 'file,crypto,data'
Successfully opened the file.
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (pcm_s16le (native) -> aac (native))
Press [q] to stop, [?] for help


[q] command received. Exiting.

[aist#1:0/pcm_s16le @ 00000162db22e880] Decoder thread received EOF packet
[aist#1:0/pcm_s16le @ 00000162db22e880] Decoder returned EOF, finishing
[aist#1:0/pcm_s16le @ 00000162db22e880] Terminating decoder thread
detected 4 logical cores
[graph_0_in_1_0 @ 00000162db6dd700] Setting 'time_base' to value '1/48000'
[graph_0_in_1_0 @ 00000162db6dd700] Setting 'sample_rate' to value '48000'
[graph_0_in_1_0 @ 00000162db6dd700] Setting 'sample_fmt' to value 's16'
[graph_0_in_1_0 @ 00000162db6dd700] Setting 'channel_layout' to value 'stereo'
[graph_0_in_1_0 @ 00000162db6dd700] tb:1/48000 samplefmt:s16 samplerate:48000 chlayout:stereo
[format_out_0_1 @ 00000162db6dde80] Setting 'sample_fmts' to value 'fltp'
[format_out_0_1 @ 00000162db6dde80] Setting 'sample_rates' to value '96000|88200|64000|48000|44100|32000|24000|22050|16000|12000|11025|8000|7350'
[format_out_0_1 @ 00000162db6dde80] auto-inserting filter 'auto_aresample_0' between the filter 'Parsed_anull_0' and the filter 'format_out_0_1'
[AVFilterGraph @ 00000162db1e1440] query_formats: 4 queried, 4 merged, 6 already done, 0 delayed
[auto_aresample_0 @ 00000162db23ec00] [SWR @ 00000162db25d8c0] Using s16p internally between filters
[auto_aresample_0 @ 00000162db23ec00] ch:2 chl:stereo fmt:s16 r:48000Hz -> ch:2 chl:stereo fmt:fltp r:48000Hz
[out#0/mp4 @ 00000162db213400] sq: 0 EOF
[out#0/mp4 @ 00000162db213400] sq: finish 0; head ts NOPTS
[out#0/mp4 @ 00000162db213400] sq: finish queue
[out#0/mp4 @ 00000162db213400] Nothing was written into output file, because at least one of its streams received no packets.
frame=    0 fps=0.0 q=-1.0 Lsize=       0kB time=N/A bitrate=N/A speed=N/A
[AVIOContext @ 00000162db23aec0] Statistics: 0 bytes written, 0 seeks, 0 writeouts
[AVIOContext @ 00000162db1ee140] Statistics: 179944 bytes read, 4 seeks
[AVIOContext @ 00000162db1eda40] Statistics: 294956 bytes read, 1 seeks
Conversion failed!

Nic z tego nie rozumiem ale znalazłem takie info

Kopiuj
[wav @ 00000162db1ecb00] parser not found for codec pcm_s16le, packets or times may be invalid.

Siędzę nad tym już 10 godzin i wiem że tylko ktoś może mi pomóc bo ja nie dam rady.


我討厭愚蠢的答案。
JB
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 4 godziny
  • Lokalizacja:Holandia
  • Postów:851
0

No to rób dalej tak jak robiłeś, dawaj wyjątki w kolejnych linijkach record_screen();


edytowany 1x, ostatnio: johnny_Be_good
sasiadstar
  • Rejestracja:prawie 10 lat
  • Ostatnio:9 miesięcy
  • Postów:44
0
johnny_Be_good napisał(a):

No to rób dalej tak jak robiłeś, dawaj wyjątki w kolejnych linijkach record_screen();

W record screen nie ma zadnych błędów co mam ci pokazać . funkcja wszystko zapisuje poprawnie tworzy nowy katalog i zapisuje plik audio i video poprawnie.
Funkcja polacz tez bedzie działąć poprawnie jak podam dane do połączenia czyli nazwa katalogu itd, ale jest warunek nie może najpierw być uruchomiona funkcja record.
Jak podam katalog do połaczenia z przed dwóch dni to i tak wywali błąd a jak komentuje to zadziałą.


我討厭愚蠢的答案。
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:4 minuty
  • Postów:4941
0

Nic ci się nie nagrało, może to jest problem; i skąd to Conversion failed?


sasiadstar
  • Rejestracja:prawie 10 lat
  • Ostatnio:9 miesięcy
  • Postów:44
0
lion137 napisał(a):

Nic ci się nie nagrało, może to jest problem; i skąd to Conversion failed?

Wszystko się nagrało tak jak trzeba . Ja łączę pliki z innego katalogu nie obecnie nagrywany a i tak nie działa.


我討厭愚蠢的答案。
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:4 minuty
  • Postów:4941
0

W którym momencie jest Conversion failed?


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.