diff --git a/src/media/audio/resampler.cpp b/src/media/audio/resampler.cpp
index d61741a6780e14558caf76c327bf59909d2dd5f5..f7db0ea26171e870019a4887f63db32e7ff643ff 100644
--- a/src/media/audio/resampler.cpp
+++ b/src/media/audio/resampler.cpp
@@ -100,4 +100,33 @@ Resampler::resample(const AudioBuffer& dataIn, AudioBuffer& dataOut)
         output->nb_samples, output->channels);
 }
 
+std::unique_ptr<AudioFrame>
+Resampler::resample(std::unique_ptr<AudioFrame>&& in, const AudioFormat& format)
+{
+    if (in->pointer()->sample_rate == format.sample_rate &&
+        in->pointer()->channels == format.nb_channels &&
+        (AVSampleFormat)in->pointer()->format == format.sampleFormat)
+    {
+        return std::move(in);
+    }
+    auto output = std::make_unique<AudioFrame>(format);
+    resample(in->pointer(), output->pointer());
+    return output;
+}
+
+std::shared_ptr<AudioFrame>
+Resampler::resample(std::shared_ptr<AudioFrame>&& in, const AudioFormat& format)
+{
+    if (in->pointer()->sample_rate == format.sample_rate &&
+        in->pointer()->channels == format.nb_channels &&
+        (AVSampleFormat)in->pointer()->format == format.sampleFormat)
+    {
+        return std::move(in);
+    }
+    auto output = std::make_shared<AudioFrame>(format);
+    resample(in->pointer(), output->pointer());
+    return output;
+}
+
+
 } // namespace ring
diff --git a/src/media/audio/resampler.h b/src/media/audio/resampler.h
index 9ab237899edfeef19358b10937b7350495807939..8395fbb9d38a063afe3feefe4ec44afcd63ebc5f 100644
--- a/src/media/audio/resampler.h
+++ b/src/media/audio/resampler.h
@@ -51,6 +51,9 @@ class Resampler {
          */
         void resample(const AudioBuffer& dataIn, AudioBuffer& dataOut);
 
+        std::unique_ptr<AudioFrame> resample(std::unique_ptr<AudioFrame>&& in, const AudioFormat& out);
+        std::shared_ptr<AudioFrame> resample(std::shared_ptr<AudioFrame>&& in, const AudioFormat& out);
+
     private:
         NON_COPYABLE(Resampler);