Как редактировать/добавлять текст в QVideoFramePython

Программы на Python
Ответить
Anonymous
 Как редактировать/добавлять текст в QVideoFrame

Сообщение Anonymous »

У меня есть демонстрационное приложение PyQt6, использующее библиотеку QtMultimedia для захвата живого видео с веб-камеры и записи его с помощью QCamera, QMediaCaptureSession, QVideoWidget и QMediaRecorder.
Я хочу добавить текст в рамки. Я считаю, что это возможно с помощью функций map() QVideoFrame.toImage() и unmap(). Я хочу, чтобы текст присутствовал в QVideoWidget, а также в экспортированном видеофайле.
Однако результирующий QImage, возвращаемый функцией QVideoFrame.toImage(), всегда имеет значение Null (при использовании QImage .isNull()).
Я пробовал разные форматы QCameraFormat, предлагаемые моей веб-камерой, YUYV, JPEG, NV12 и т. д., но это не имеет значения.
Я попробовал функцию QVideoFrame.addSubtitleText(), но она не встраивает текст в видеокадр, поэтому его нет в экспортированном видеофайле.
Как добавить текст в QVideoFrame?
Я использую Python3.10 и PyQt6.7.1.
import os

from PyQt6.QtCore import QUrl, pyqtSlot
from PyQt6.QtMultimedia import (
QCamera,
QCameraDevice,
QMediaCaptureSession,
QMediaDevices,
QMediaRecorder,
QVideoFrame,
)
from PyQt6.QtMultimediaWidgets import QVideoWidget
from PyQt6.QtWidgets import (
QApplication,
QComboBox,
QLabel,
QMainWindow,
QPushButton,
QVBoxLayout,
QWidget,
)

video_path = os.path.join(os.getcwd(), "my_video.mp4")

class Main(QMainWindow):
def __init__(self):
super().__init__()
widget = QWidget()
self.setCentralWidget(widget)
self.main_layout = QVBoxLayout(widget)

self.m_devices = QMediaDevices()
self.devices_list = QComboBox()
[
self.devices_list.addItem(str(d.description()), d)
for d in self.m_devices.videoInputs()
]
self.devices_list.setCurrentIndex(-1)
self.devices_list.activated.connect(
lambda idx: self.set_camera(self.devices_list.itemData(idx))
)
self.main_layout.addWidget(QLabel("Select Camera"))
self.main_layout.addWidget(self.devices_list)

self.start_btn = QPushButton("Start Recording")
self.start_btn.clicked.connect(self.start_recording)
self.main_layout.addWidget(self.start_btn)

self.stop_btn = QPushButton("Stop Recording")
self.stop_btn.clicked.connect(self.stop_recording)
self.main_layout.addWidget(self.stop_btn)

self.video_widget = QVideoWidget()
self.video_sink = self.video_widget.videoSink()
self.video_sink.videoFrameChanged.connect(self.on_video_frame)
self.main_layout.addWidget(self.video_widget, 1)

self.m_recorder = QMediaRecorder()
self.m_recorder.recorderStateChanged.connect(lambda state: print(state))
self.m_recorder.setOutputLocation(QUrl.fromLocalFile(video_path))
self.m_recorder.errorOccurred.connect(lambda error, error_str: print(error_str))

self.m_capture_session = QMediaCaptureSession()
self.m_capture_session.setVideoSink(self.video_sink)
self.m_capture_session.setRecorder(self.m_recorder)
# self.capture_session.setVideoOutput(self.video_widget)

self.camera = QCamera(QCameraDevice())

self.show()
self.resize(800, 600)

def set_camera(self, camera: QCameraDevice):
self.camera = QCamera(camera)
self.m_capture_session.setCamera(self.camera)
self.camera.start()

def start_recording(self):
self.m_recorder.record()

def stop_recording(self):
self.m_recorder.stop()

@pyqtSlot(QVideoFrame)
def on_video_frame(self, frame: QVideoFrame) -> None:
""" """
if not frame.isValid():
return

if not frame.map(QVideoFrame.MapMode.ReadOnly):
return

img = frame.toImage()

### edit QImage here ###

print(f"Frame received (null={img.isNull()})")

frame.unmap()

if __name__ == "__main__":
app = QApplication([])
main = Main()
app.exec()



Подробнее здесь: https://stackoverflow.com/questions/790 ... videoframe
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»