diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2022-08-25 14:08:15 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-09-01 17:59:01 +0000 |
commit | 1e4efd5d139c2c8ef2f02bd438936820f2359707 (patch) | |
tree | 1f1fa9d928f1f6cb74291bab282da41d26853ace | |
parent | b66ef371b0883ffc0d02adcf4259cd742a9466bf (diff) | |
download | qtmultimedia-1e4efd5d139c2c8ef2f02bd438936820f2359707.tar.gz |
Fix audio and video synchronization with ffmpeg backend
Set a correct output playback rate to the audio resampler.
The functionality will be tested after implementation mocks of audio output.
Task-number: QTBUG-105617
Change-Id: Iaed95ac12e5e75b55b2c09245aad45c32a885fdf
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
(cherry picked from commit 5393dae58ed62ec765abfb846dcd33a7b2aaaac6)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp | 17 | ||||
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h | 1 |
2 files changed, 15 insertions, 3 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp b/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp index 66e2c28c3..f37a10174 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp +++ b/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp @@ -775,24 +775,35 @@ void AudioRenderer::updateOutput(const Codec *codec) format = QFFmpegMediaFormatInfo::audioFormatFromCodecParameters(audioStream->codecpar); format.setChannelConfig(dev.channelConfiguration()); + initResempler(codec); + audioSink = new QAudioSink(dev, format); audioSink->setVolume(output->volume()); audioSink->setBufferSize(format.bytesForDuration(100000)); audioDevice = audioSink->start(); + latencyUSecs = format.durationForBytes(audioSink->bufferSize()); // ### ideally get full latency qCDebug(qLcAudioRenderer) << " -> have an audio sink" << audioDevice; +} +void AudioRenderer::initResempler(const Codec *codec) +{ // init resampler. It's ok to always do this, as the resampler will be a no-op if // formats agree. AVSampleFormat requiredFormat = QFFmpegMediaFormatInfo::avSampleFormat(format.sampleFormat()); #if QT_FFMPEG_OLD_CHANNEL_LAYOUT - qCDebug(qLcAudioRenderer) << "init resampler" << requiredFormat << audioStream->codecpar->channels; + qCDebug(qLcAudioRenderer) << "init resampler" << requiredFormat + << codec->stream()->codecpar->channels; #else - qCDebug(qLcAudioRenderer) << "init resampler" << requiredFormat << audioStream->codecpar->ch_layout.nb_channels; + qCDebug(qLcAudioRenderer) << "init resampler" << requiredFormat + << codec->stream()->codecpar->ch_layout.nb_channels; #endif - resampler.reset(new Resampler(codec, format)); + + auto resamplerFormat = format; + resamplerFormat.setSampleRate(qRound(format.sampleRate() / playbackRate())); + resampler.reset(new Resampler(codec, resamplerFormat)); } void AudioRenderer::freeOutput() diff --git a/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h b/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h index 0ca069105..01763911d 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h +++ b/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h @@ -474,6 +474,7 @@ private slots: private: void updateOutput(const Codec *codec); + void initResempler(const Codec *codec); void freeOutput(); void init() override; |