Вопрос или проблема
Таким образом, код отправляет аудио-уведомление каждый раз, когда выполняется условие 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')
Пояснение кода
-
Функция play_audio: Эта функция отвечает за воспроизведение звукового файла. Она вызывается в отдельном потоке при срабатывании условия.
-
Цикл обработки изображения: В основном цикле происходит захват видеокадра и его обработка. Когда обнаруживается объект с классом ‘cell phone’, создается новый поток, который запускает функцию play_audio.
-
Отправка изображений: После обработки каждого кадра он кодируется в JPEG и отправляется на клиент.
Преимущества использования потоков
- Отсутствие задержек: Основной цикл не приостанавливается, что позволяет вашему приложению работать без задержек.
- Параллельное выполнение: Запуск дополнительного потока для воспроизведения аудио позволяет задействовать ресурсы системы более эффективно.
Заключение
Использование многопоточности — это мощный инструмент для решения задачи воспроизведения звука в фоновом режиме. Это позволяет вашему приложению оставаться отзывчивым и не терять производительность при выполнении длительных операций, таких как потоковая обработка видео. Вы можете адаптировать приведённый пример под свои нужды и продолжать развивать ваше приложение на Flask.