20 _mediaPlayer(new QMediaPlayer(this)),
21 _captureSession(new QMediaCaptureSession(this)),
22 _mediaRecorder(new QMediaRecorder(this))
26 _captureSession->setRecorder(_mediaRecorder);
30 (void) connect(_mediaPlayer, &QMediaPlayer::playbackStateChanged,
this,
31 [
this](QMediaPlayer::PlaybackState newState) {
32 if (newState == QMediaPlayer::PlaybackState::PlayingState) {
34 }
else if (newState == QMediaPlayer::PlaybackState::StoppedState) {
38 (void) connect(_mediaPlayer, &QMediaPlayer::mediaStatusChanged,
this, [
this](QMediaPlayer::MediaStatus status) {
40 case QMediaPlayer::MediaStatus::LoadingMedia:
41 _streamDevice = _mediaPlayer->sourceDevice();
47 (void) connect(_mediaPlayer, &QMediaPlayer::metaDataChanged,
this, []() {
52 (void) connect(_mediaPlayer, &QMediaPlayer::bufferProgressChanged,
this, [](
float filled) {
53 qCDebug(QtMultimediaReceiverLog) << Q_FUNC_INFO <<
"Buffer Progress:" << filled;
55 (void) connect(_mediaPlayer, &QMediaPlayer::errorOccurred,
this,
58 case QMediaPlayer::Error::NetworkError:
64 qCDebug(QtMultimediaReceiverLog) << Q_FUNC_INFO <<
errorString;
70 _mediaRecorder->setVideoFrameRate(0);
71 _mediaRecorder->setVideoResolution(QSize());
73 _mediaRecorder, &QMediaRecorder::recorderStateChanged,
this, [
this](QMediaRecorder::RecorderState state) {
74 if (state == QMediaRecorder::RecorderState::RecordingState) {
75 emit recordingStarted(_mediaRecorder->actualLocation().toString());
77 emit recordingChanged(_mediaRecorder->recorderState() == QMediaRecorder::RecorderState::RecordingState);
79 (void) connect(_mediaRecorder, &QMediaRecorder::errorOccurred,
this,
82 case QMediaRecorder::Error::OutOfSpaceError:
88 qCDebug(QtMultimediaReceiverLog) << Q_FUNC_INFO <<
errorString;
91 _frameTimer.setSingleShot(
true);
92 _frameTimer.setTimerType(Qt::PreciseTimer);
187 qCDebug(QtMultimediaReceiverLog) << Q_FUNC_INFO;
190 qCCritical(QtMultimediaReceiverLog) <<
"VideoSink is NULL";
196 qCWarning(QtMultimediaReceiverLog) <<
"VideoSink is already set";
200 qCWarning(QtMultimediaReceiverLog) <<
"VideoSizeConnection is already set";
207 if (frame.isValid()) {
216 qCDebug(QtMultimediaReceiverLog) <<
"Decoding";
242 qCDebug(QtMultimediaReceiverLog) << Q_FUNC_INFO;
245 qCWarning(QtMultimediaReceiverLog) <<
"Recording Unavailable";
252 _mediaRecorder->setMediaFormat(QMediaFormat::FileFormat::Matroska);
255 _mediaRecorder->setMediaFormat(QMediaFormat::FileFormat::QuickTime);
262 _mediaRecorder->setMediaFormat(QMediaFormat::FileFormat::UnspecifiedFormat);
266 _mediaRecorder->setOutputLocation(QUrl::fromLocalFile(videoFile));
270 qCDebug(QtMultimediaReceiverLog) <<
"Recording";
288 qCDebug(QtMultimediaReceiverLog) << Q_FUNC_INFO;
291 qCWarning(QtMultimediaReceiverLog) <<
"Video Sink is NULL";
296 const QVideoFrame frame =
_videoSink->videoFrame();
297 if (!frame.isValid() || !frame.isReadable()) {
298 qCWarning(QtMultimediaReceiverLog) <<
"Screenshot Frame is Invalid";
305 const QImage image = frame.toImage();
306 if (!image.isNull()) {
307 if (!image.save(imageFile)) {
308 qCWarning(QtMultimediaReceiverLog) <<
"Screenshot save failed:" << imageFile;
312 qCDebug(QtMultimediaReceiverLog) <<
"Screenshot saved:" << imageFile;
320 if (frame.handleType() == QVideoFrame::RhiTextureHandle) {
321 qCWarning(QtMultimediaReceiverLog) <<
"Screenshot: GPU frame readback unavailable (toImage returned null)";
323 qCWarning(QtMultimediaReceiverLog) <<
"Screenshot: frame.toImage() returned null";