Как воспроизводить аудио в фоновом режиме при срабатывании, но при этом продолжать выполнение кода

Вопрос или проблема

Таким образом, код отправляет аудио-уведомление каждый раз, когда выполняется условие if. Однако код будет приостанавливаться примерно на 3 секунды (длина аудиофайла) и будет приостанавливать цикл While, заставляя видео OpenCV остановиться. Кстати, я разворачиваю это на Flask. Вот код:

while True:
            ret, frame = self.video.read()
            results = self.model.track(frame)
            frame_result = results[0].plot()

            for r in results:
        
                boxes = r.boxes
                for box in boxes:
            
                    c = box.cls
                    if model.names[int(c)] == 'cell phone':
                        playsound('audio.mp3') # я хочу, чтобы это воспроизводилось в фоне, пока код все еще выполняется
            ret, jpeg = cv2.imencode('.jpg', frame_result)
            frame = jpeg.tobytes()
            yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

Я просматривал и увидел threading и asyncio? Увы, я все еще не знаком с тем, как их использовать в этом сценарии.

Можно воспроизводить аудио в фоновом режиме, не останавливая главный цикл, вы можете использовать многопоточность с следующими условиями:

import threading
from playsound import playsound
import cv2

def play_audio():
playsound('audio.mp3')

  while True:
   ret, frame = self.video.read()
   results = self.model.track(frame)
   frame_result = results[0].plot()

  for r in results:
    boxes = r.boxes
    for box in boxes:
        c = box.cls
        if model.names[int(c)] == 'cell phone':
            audio_thread = threading.Thread(target=play_audio)
            audio_thread.start()

  ret, jpeg = cv2.imencode('.jpg', frame_result)
  frame = jpeg.tobytes()
  yield (b'--frame\r\n'
         b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')'

На мой взгляд, используя многопоточность, функция play_audio будет работать в отдельном потоке, поэтому главный цикл не остановится, пока звук воспроизводится.

Ответ или решение

Для того чтобы воспроизводить аудиофайл в фоновом режиме, не прерывая выполнение основного кода, мы можем воспользоваться многопоточностью. Это поможет избежать задержки во время выполнения цикла, связанной с воспроизведением звука. Давайте подробно рассмотрим решение этой задачи с использованием Python и библиотеки playsound.

Как это работает

Когда в вашем коде срабатывает определённое условие, требующее воспроизведения звукового сигнала (например, обнаружение телефона), мы можем создать новый поток, который будет заниматься воспроизведением аудио, в то время как основной поток продолжит выполнение цикла обработки видео без задержек.

Импорт необходимых модулей

Нам понадобятся следующие библиотеки:

  • threading — для создания отдельного потока для воспроизведения звука.
  • playsound — для воспроизведения аудиофайла.
  • cv2 — для работы с видеопотоком.

Пример кода

import threading
from playsound import playsound
import cv2

def play_audio():
    playsound('audio.mp3')

while True:
    ret, frame = self.video.read()
    results = self.model.track(frame)
    frame_result = results[0].plot()

    for r in results:
        boxes = r.boxes
        for box in boxes:
            c = box.cls
            if model.names[int(c)] == 'cell phone':
                # Создаем новый поток для воспроизведения звука
                audio_thread = threading.Thread(target=play_audio)
                audio_thread.start()

    ret, jpeg = cv2.imencode('.jpg', frame_result)
    frame = jpeg.tobytes()
    yield (b'--frame\r\n'
           b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

Пояснение кода

  1. Функция play_audio: Эта функция отвечает за воспроизведение звукового файла. Она вызывается в отдельном потоке при срабатывании условия.

  2. Цикл обработки изображения: В основном цикле происходит захват видеокадра и его обработка. Когда обнаруживается объект с классом ‘cell phone’, создается новый поток, который запускает функцию play_audio.

  3. Отправка изображений: После обработки каждого кадра он кодируется в JPEG и отправляется на клиент.

Преимущества использования потоков

  • Отсутствие задержек: Основной цикл не приостанавливается, что позволяет вашему приложению работать без задержек.
  • Параллельное выполнение: Запуск дополнительного потока для воспроизведения аудио позволяет задействовать ресурсы системы более эффективно.

Заключение

Использование многопоточности — это мощный инструмент для решения задачи воспроизведения звука в фоновом режиме. Это позволяет вашему приложению оставаться отзывчивым и не терять производительность при выполнении длительных операций, таких как потоковая обработка видео. Вы можете адаптировать приведённый пример под свои нужды и продолжать развивать ваше приложение на Flask.

Оцените материал
Добавить комментарий

Капча загружается...