Что такое ошибка сегментирования и как ее исправить? simpleaudio + pyqt5
Когда я останавливаю музыку в simpleaudio, то сразу же терминал линукса выдает "Ошибка сегментирования (образ памяти сброшен на диск)" и программа вылетает.
Моя программа:
from PyQt5.QtWidgets import QApplication, QMainWindow, QSlider, QPushButton, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt, QTimer
import sys
from threading import Thread
from time import sleep as wait
import simpleaudio as sa
from pydub import AudioSegment
class Program():
def __init__(self):
self.playing = False
self.pos = 0
self.length = 100000 # пока что оставим длину 100 секунд
self.audio_file_path = "/home/nikkonst/Музыка/F-777 - Cosmic Blaster - 05 Hey Man.mp3"
def play_level(self):
self.playing = True
Thread(target=self.play_level_thread, daemon=True).start()
def play_level_thread(self):
self.play_audio(self.audio_file_path)
while self.playing and self.pos < self.length:
self.pos += 10
editor.update_timeline()
wait(0.1)
def play_audio(self, path):
audio = AudioSegment.from_file(path)
wav_file_path = "temp.wav"
audio.export(wav_file_path, format="wav")
wave_obj = sa.WaveObject.from_wave_file(wav_file_path)
play_obj = wave_obj.play()
def stop_audio(self):
self.playing = False
sa.stop_all() # ошибка здесь
class LevelEditor(QMainWindow):
def __init__(self):
super().__init__()
self.program = Program()
self.setWindowTitle("2D Level Editor")
self.setGeometry(100, 100, 800, 600)
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
layout = QVBoxLayout()
self.timeline_slider = QSlider(Qt.Horizontal)
self.timeline_slider.setMaximum(1000)
layout.addWidget(self.timeline_slider)
self.play_button = QPushButton("Играть")
self.play_button.clicked.connect(self.toggle_playback)
layout.addWidget(self.play_button)
self.stop_button = QPushButton("Остановить")
self.stop_button.clicked.connect(self.stop_playback)
layout.addWidget(self.stop_button)
self.central_widget.setLayout(layout)
def toggle_playback(self):
self.timeline_slider.setMaximum(self.program.length)
if not self.program.playing:
print("playing")
self.program.play_level()
self.play_button.setText("Пауза")
else:
print("pause")
self.program.stop_audio() # stop_audio будет стоять здесь недолго. вместо нее потом будет функция для паузы превью уровня
self.play_button.setText("Играть")
def stop_playback(self):
print("stopping")
if self.program.playing:
self.program.stop_audio() # stop_audio будет стоять здесь недолго. вместо нее потом будет функция для остановки превью уровня
self.timeline_slider.setValue(0)
self.play_button.setText("Играть")
def update_timeline(self):
self.timeline_slider.setValue(self.program.pos)
if __name__ == "__main__":
app = QApplication(sys.argv)
editor = LevelEditor()
editor.show()
sys.exit(app.exec_())
Ответы (1 шт):
Средствами python невозможно вызвать ошибку сегментирования. Ошибка в одной из подключаемых вами библиотек., написанных на C или C++. Можно загрузить в отладчик,сброшенный на диск образ памяти приложения в момент падения и выяснить какой модуль виноват. Потом найти для этого модуля исходные тексты и отладочную информацию ... и прислать автору модуля предложение об исправлении ошибки.. Но вам придется выучить язык, на котором написан модуль, содержащий ошибку.
В качестве временного обхода, попробуйте использовать Qt и для воспроизведения звука, она кажется надежной. https://doc.qt.io/qtforpython-5/overviews/multimediaoverview.html Пример: https://github.com/baoboa/pyqt5/blob/master/examples/multimediawidgets/player.py