https://github.com/OpenMW/openmw/commit/61cb5b4da638d520c41a9d99b5850384b2e22679

Index: extern/osg-ffmpeg-videoplayer/audiodecoder.cpp
--- extern/osg-ffmpeg-videoplayer/audiodecoder.cpp.orig
+++ extern/osg-ffmpeg-videoplayer/audiodecoder.cpp
@@ -18,6 +18,10 @@ extern "C"
     #pragma warning (pop)
 #endif
 
+#if FFMPEG_5_OR_GREATER
+    #include <libavutil/channel_layout.h>
+#endif
+
 #include "videostate.hpp"
 
 namespace
@@ -53,7 +57,11 @@ MovieAudioDecoder::MovieAudioDecoder(VideoState* video
     : mVideoState(videoState)
     , mAVStream(*videoState->audio_st)
     , mOutputSampleFormat(AV_SAMPLE_FMT_NONE)
+    #if FFMPEG_5_OR_GREATER
+    , mOutputChannelLayout({})
+    #else
     , mOutputChannelLayout(0)
+    #endif
     , mOutputSampleRate(0)
     , mFramePos(0)
     , mFrameSize(0)
@@ -109,21 +117,49 @@ void MovieAudioDecoder::setupFormat()
 
     AVSampleFormat inputSampleFormat = mAudioContext->sample_fmt;
 
+#if FFMPEG_5_OR_GREATER
+    AVChannelLayout inputChannelLayout = mAudioContext->ch_layout;
+    if (inputChannelLayout.u.mask != 0)
+        mOutputChannelLayout = inputChannelLayout;
+    else
+        av_channel_layout_default(&mOutputChannelLayout, mAudioContext->ch_layout.nb_channels);
+#else
     uint64_t inputChannelLayout = mAudioContext->channel_layout;
     if (inputChannelLayout == 0)
         inputChannelLayout = av_get_default_channel_layout(mAudioContext->channels);
+#endif
 
     int inputSampleRate = mAudioContext->sample_rate;
 
     mOutputSampleRate = inputSampleRate;
     mOutputSampleFormat = inputSampleFormat;
+
+#if FFMPEG_5_OR_GREATER
+    adjustAudioSettings(mOutputSampleFormat, mOutputChannelLayout.u.mask, mOutputSampleRate);
+#else
     mOutputChannelLayout = inputChannelLayout;
     adjustAudioSettings(mOutputSampleFormat, mOutputChannelLayout, mOutputSampleRate);
+#endif
 
     if (inputSampleFormat != mOutputSampleFormat
+        #if FFMPEG_5_OR_GREATER
+            || inputChannelLayout.u.mask != mOutputChannelLayout.u.mask
+        #else
             || inputChannelLayout != mOutputChannelLayout
+        #endif
             || inputSampleRate != mOutputSampleRate)
     {
+    #if FFMPEG_5_OR_GREATER
+        swr_alloc_set_opts2(&mAudioResampler->mSwr,
+          &mOutputChannelLayout,
+          mOutputSampleFormat,
+          mOutputSampleRate,
+          &inputChannelLayout,
+          inputSampleFormat,
+          inputSampleRate,
+          0,                             // logging level offset
+          nullptr);                      // log context
+    #else
         mAudioResampler->mSwr = swr_alloc_set_opts(mAudioResampler->mSwr,
                           mOutputChannelLayout,
                           mOutputSampleFormat,
@@ -133,6 +169,8 @@ void MovieAudioDecoder::setupFormat()
                           inputSampleRate,
                           0,                             // logging level offset
                           nullptr);                      // log context
+    #endif
+
         if(!mAudioResampler->mSwr)
             fail(std::string("Couldn't allocate SwrContext"));
         if(swr_init(mAudioResampler->mSwr) < 0)
@@ -158,7 +196,11 @@ int MovieAudioDecoder::synchronize_audio()
         if(fabs(avg_diff) >= mAudioDiffThreshold)
         {
             int n = av_get_bytes_per_sample(mOutputSampleFormat) *
+        #if FFMPEG_5_OR_GREATER
+                    mOutputChannelLayout.nb_channels;
+        #else
                     av_get_channel_layout_nb_channels(mOutputChannelLayout);
+        #endif
             sample_skip = ((int)(diff * mAudioContext->sample_rate) * n);
         }
     }
@@ -204,7 +246,11 @@ int MovieAudioDecoder::audio_decode_frame(AVFrame *fra
                 if(!mDataBuf || mDataBufLen < frame->nb_samples)
                 {
                     av_freep(&mDataBuf);
+    #if FFMPEG_5_OR_GREATER
+                    if(av_samples_alloc(&mDataBuf, nullptr, mOutputChannelLayout.nb_channels,
+    #else
                     if(av_samples_alloc(&mDataBuf, nullptr, av_get_channel_layout_nb_channels(mOutputChannelLayout),
+    #endif
                                         frame->nb_samples, mOutputSampleFormat, 0) < 0)
                         break;
                     else
@@ -221,7 +267,11 @@ int MovieAudioDecoder::audio_decode_frame(AVFrame *fra
             else
                 mFrameData = &frame->data[0];
 
+    #if FFMPEG_5_OR_GREATER
+            int result = frame->nb_samples * mOutputChannelLayout.nb_channels *
+    #else
             int result = frame->nb_samples * av_get_channel_layout_nb_channels(mOutputChannelLayout) *
+    #endif
                     av_get_bytes_per_sample(mOutputSampleFormat);
 
             /* We have data, return it and come back for more later */
@@ -298,7 +348,11 @@ size_t MovieAudioDecoder::read(char *stream, size_t le
             len1 = std::min<size_t>(len1, -mFramePos);
 
             int n = av_get_bytes_per_sample(mOutputSampleFormat)
+    #if FFMPEG_5_OR_GREATER
+                    * mOutputChannelLayout.nb_channels;
+    #else
                     * av_get_channel_layout_nb_channels(mOutputChannelLayout);
+    #endif
 
             /* add samples by copying the first sample*/
             if(n == 1)
@@ -348,7 +402,11 @@ int MovieAudioDecoder::getOutputSampleRate() const
 
 uint64_t MovieAudioDecoder::getOutputChannelLayout() const
 {
+    #if FFMPEG_5_OR_GREATER
+    return mOutputChannelLayout.u.mask;
+    #else
     return mOutputChannelLayout;
+    #endif
 }
 
 AVSampleFormat MovieAudioDecoder::getOutputSampleFormat() const
