@r1mple

Почему программа прекращает свое исполнение?

import reqs
import config
reqs.checkReqs()
from AudioCapture import AudioCapturer
from ScreenCapture import ScreenCapturer
import Combine
import threading
import Files
import sys      
import flag

lock = threading.Lock()

stopFlag = flag.Flag()

def onClose():
    while stopFlag.getFlag() == False:
        input('Do you want to stop?')
        stopFlag.changeFlag()
        ac.stop_and_save()

def onReapet():
    while stopFlag.getFlag() == False:
        global ac, sc
        ac = AudioCapturer(recordTime=5)
        sc = ScreenCapturer(recordTime=5)  
        videoThread = threading.Thread(target=sc.record)       
        audioStartThread = threading.Thread(target=ac.start)
        videoThread.start()
        audioStartThread.start()
        videoThread.join()
        audioStartThread.join() 

if __name__ == '__main__':  
    print('To start recording press "R".')
    print('To stop recording press "S".')
    print('Do you want to start? (y/n)', end=' ')
    ans = input()
    if ans == 'y':
        print('Starting...')
        listener = threading.Thread(target=onClose)
        listener.start()
        onReapet()
        print('Done.')
        listener.join()
        Combine.Combiner.combine()
        Combine.Combiner.compress()
        Files.Files.deleteFiles([config.AUDIOPATH, config.OUTPUTPATH, config.VIDEOPATH])
        print(config.SPLITTER)
        print('Output file location: ', config.FINALPATH)
    elif ans == 'n':
        sys.exit()

import pyaudio
import wave
import Files
import config

class AudioCapturer(object):
    def __init__(self, recordTime = config.DEFAULTRECORDTIME):
        self.p = pyaudio.PyAudio()
        
        self.checkConfig(config.SPLITTER)

        self.recordTime = recordTime
        self.CHUNK = 1024
        self.FORMAT = pyaudio.paInt16
        self.INDEXOFINPUTDEVICE = int(Files.Files.getDataFromJson(config.DEVICECONFIGPATH)['indexOfInputDevice'])
        self.CHANNELS = int(Files.Files.getDataFromJson(config.DEVICECONFIGPATH)['numberOfChannels'])
        self.RATE = round(float(Files.Files.getDataFromJson(config.DEVICECONFIGPATH)['rate']))
        
        self.WAVE_OUTPUT_FILENAME = config.AUDIOPATH

        self.frames = []

        self.stream = self.p.open(format=self.FORMAT,
                            channels=self.CHANNELS,
                            rate=self.RATE,
                            input_device_index=self.INDEXOFINPUTDEVICE,
                            frames_per_buffer=self.CHUNK,
                            input=True)

        self.recordFlag = True

    def checkConfig(self, splitter):
        data = Files.Files.getDataFromJson(config.DEVICECONFIGPATH)
        if data['indexOfInputDevice'] == '' or data['numberOfChannels'] == '' or data['rate'] == '':
            for i in range(self.p.get_device_count()):
                print(i, ' - ', self.p.get_device_info_by_index(i)['name'])
            print('\nSelect the device from you want to record the audio:', end=' ')
            id = input()
            device = self.p.get_device_info_by_index(int(id))
            data['indexOfInputDevice'] = str(device['index'])
            data['rate'] = str(device['defaultSampleRate'])
            data['numberOfChannels'] = str(device['maxInputChannels'])
            Files.Files.writeDataToJson(config.DEVICECONFIGPATH, data)
            print(splitter)

    def start(self):   
        for i in range(0, int(self.RATE / self.CHUNK * self.recordTime)):
            data = self.stream.read(self.CHUNK)
            self.frames.append(data)

        self.stop_and_save()

    def stop_and_save(self):
        self.stream.stop_stream()
        self.stream.close()
        self.p.terminate()  
        wf = wave.open(self.WAVE_OUTPUT_FILENAME, 'wb')
        wf.setnchannels(self.CHANNELS)
        wf.setsampwidth(self.p.get_sample_size(self.FORMAT))
        wf.setframerate(self.RATE)
        wf.writeframes(b''.join(self.frames))
        wf.close()

В функции onClose есть смена флага и остановка записи звука, но когда я по итогу меняю флаг, по идее должен закрываться поток аудио и программа должна продолжаться, а на деле получается, что после смены флага программа не доходит до print('Done.') и просто заканчивает свое исполнение, почему так происходит?
  • Вопрос задан
  • 79 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы