43 if (!m_session || state() != QMediaRecorder::StoppedState)
46 auto videoSources = m_session->activeVideoSources();
47 auto audioInputs = m_session->activeAudioInputs();
48 const auto hasVideo = !videoSources.empty();
49 const auto hasAudio = !audioInputs.empty();
51 if (!hasVideo && !hasAudio) {
52 updateError(QMediaRecorder::ResourceError, QMediaRecorder::tr(
"No video or audio input"));
56 if (outputDevice() && !outputLocation().isEmpty())
57 qCWarning(qLcMediaEncoder)
58 <<
"Both outputDevice and outputLocation has been set to QMediaRecorder";
60 if (outputDevice() && !outputDevice()->isWritable())
61 qCWarning(qLcMediaEncoder) <<
"Output device has been set but not it's not writable";
63 QString actualLocation;
64 auto formatContext = std::make_unique<QFFmpeg::EncodingFormatContext>(settings.fileFormat());
66 bool isAVIOOpen =
false;
67 if (outputDevice() && outputDevice()->isWritable()) {
68 isAVIOOpen = formatContext->openAVIO(outputDevice());
70 actualLocation = findActualLocation(settings);
71 isAVIOOpen = formatContext->openAVIO(actualLocation);
74 qCInfo(qLcMediaEncoder).nospace()
75 <<
"Recording new media with muxer "
76 << formatContext->avFormatContext()->oformat->long_name <<
" to "
77 << (actualLocation.isNull() ? u"IO device"_s : actualLocation)
78 <<
" with format: " << settings.fileFormat() <<
", " << settings.audioCodec() <<
", "
79 << settings.videoCodec();
82 updateError(QMediaRecorder::LocationNotWritable,
83 QMediaRecorder::tr(
"Cannot open the output location for writing"));
87 m_recordingEngine.reset(
new RecordingEngine(settings, std::move(formatContext)));
88 m_recordingEngine->setMetaData(m_metaData);
90 connect(m_recordingEngine.get(), &QFFmpeg::RecordingEngine::durationChanged,
this,
91 &QFFmpegMediaRecorder::newDuration);
93 &QFFmpegMediaRecorder::finalizationDone);
94 connect(m_recordingEngine.get(), &QFFmpeg::RecordingEngine::sessionError,
this,
95 &QFFmpegMediaRecorder::handleSessionError);
99 auto handleStreamInitializationError = [
this](QMediaRecorder::Error code,
100 const QString &description) {
101 qCWarning(qLcMediaEncoder) <<
"Stream initialization error:" << description;
102 updateError(code, description);
105 connect(m_recordingEngine.get(), &QFFmpeg::RecordingEngine::streamInitializationError,
this,
106 handleStreamInitializationError);
109 actualLocationChanged(QUrl::fromLocalFile(actualLocation));
111 qCDebug(qLcMediaEncoder) <<
"Starting recording engine";
112 if (m_recordingEngine->initialize(audioInputs, videoSources)) {
113 stateChanged(QMediaRecorder::RecordingState);
114 qCDebug(qLcMediaEncoder) <<
"Recording engine started";
117 qCWarning(qLcMediaEncoder) <<
"Failed to start recording engine";