diff --git a/src/media/libav_utils.cpp b/src/media/libav_utils.cpp
index 2ee286a90590d8552c065ab0b4306a2438925ea1..57955678209f8a47b313e9bb063a20951d250b95 100644
--- a/src/media/libav_utils.cpp
+++ b/src/media/libav_utils.cpp
@@ -199,4 +199,12 @@ is_yuv_planar(const AVPixFmtDescriptor& desc)
     return not used_bit_mask;
 }
 
+std::string
+getError(int err)
+{
+    std::string ret(AV_ERROR_MAX_STRING_SIZE, '\0');
+    av_strerror(err, (char*)ret.data(), ret.size());
+    return ret;
+}
+
 }} // namespace ring::libav_utils
diff --git a/src/media/libav_utils.h b/src/media/libav_utils.h
index 8b12308e2dcb140966e929b36225714637ed4dc6..c8f97d32f5aad2d3562a98cf8f9dd684a73c4640 100644
--- a/src/media/libav_utils.h
+++ b/src/media/libav_utils.h
@@ -40,6 +40,8 @@ namespace ring { namespace libav_utils {
                       char *hostname, size_t hostname_size, int *port,
                       char *path, size_t path_size);
 
-bool is_yuv_planar(const AVPixFmtDescriptor& desc);
+    bool is_yuv_planar(const AVPixFmtDescriptor& desc);
+
+    std::string getError(int err);
 
 }} // namespace ring::libav_utils
diff --git a/src/media/media_decoder.cpp b/src/media/media_decoder.cpp
index c29d6123084cb592fe1f76ad1aa9c9f2d5f61f29..0fd2e7de20e38f7b37a70a41e7361909365f5d27 100644
--- a/src/media/media_decoder.cpp
+++ b/src/media/media_decoder.cpp
@@ -123,9 +123,7 @@ int MediaDecoder::openInput(const DeviceParams& params)
         options_ ? &options_ : NULL);
 
     if (ret) {
-        char errbuf[64];
-        av_strerror(ret, errbuf, sizeof(errbuf));
-        RING_ERR("avformat_open_input failed: %s", errbuf);
+        RING_ERR("avformat_open_input failed: %s", libav_utils::getError(ret).c_str());
     } else {
         RING_DBG("Using format %s", params.format.c_str());
     }
@@ -170,11 +168,8 @@ MediaDecoder::setupStream(AVMediaType mediaType)
     if (!fallback_) {
         RING_DBG() << "Finding " << streamType << " stream info";
         if ((ret = avformat_find_stream_info(inputCtx_, nullptr)) < 0) {
-            char errBuf[64];
-            av_strerror(ret, errBuf, sizeof(errBuf));
-
             // Always fail here
-            RING_ERR() << "Could not find " << streamType << " stream info: " << errBuf;
+            RING_ERR() << "Could not find " << streamType << " stream info: " << libav_utils::getError(ret);
             return -1;
         }
     }
@@ -231,9 +226,7 @@ MediaDecoder::setupStream(AVMediaType mediaType)
 
     ret = avcodec_open2(decoderCtx_, inputDecoder_, nullptr);
     if (ret < 0) {
-        char errBuf[64];
-        av_strerror(ret, errBuf, sizeof(errBuf));
-        RING_ERR() << "Could not open codec: " << errBuf;
+        RING_ERR() << "Could not open codec: " << libav_utils::getError(ret);
         return -1;
     }
 
@@ -257,9 +250,7 @@ MediaDecoder::decode(VideoFrame& result)
     } else if (ret == AVERROR_EOF) {
         return Status::EOFError;
     } else if (ret < 0) {
-        char errbuf[64];
-        av_strerror(ret, errbuf, sizeof(errbuf));
-        RING_ERR("Couldn't read frame: %s\n", errbuf);
+        RING_ERR("Couldn't read frame: %s\n", libav_utils::getError(ret).c_str());
         return Status::ReadError;
     }
 
@@ -329,9 +320,7 @@ MediaDecoder::decode(const AudioFrame& decodedFrame)
     } else if (ret == AVERROR_EOF) {
         return Status::EOFError;
     } else if (ret < 0) {
-        char errbuf[64];
-        av_strerror(ret, errbuf, sizeof(errbuf));
-        RING_ERR("Couldn't read frame: %s\n", errbuf);
+        RING_ERR("Couldn't read frame: %s\n", libav_utils::getError(ret).c_str());
         return Status::ReadError;
     }
 
diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp
index ccbae447efd747f06fa16a62ef80eb17abd51a96..38de69e4ffd80dc49c4b825060a9d0603d5ca585 100644
--- a/src/media/media_encoder.cpp
+++ b/src/media/media_encoder.cpp
@@ -320,9 +320,7 @@ MediaEncoder::encode(VideoFrame& input, bool is_keyframe,
             // write the compressed frame
             ret = av_write_frame(outputCtx_, &pkt);
             if (ret < 0) {
-                char errbuf[64];
-                av_strerror(ret, errbuf, sizeof(errbuf));
-                RING_ERR("av_write_frame failed: %s", errbuf);
+                RING_ERR("av_write_frame failed: %s", libav_utils::getError(ret).c_str());
             } else
                 break;
         }
@@ -387,9 +385,7 @@ int MediaEncoder::encode_audio(const AudioBuffer &buffer)
                                            reinterpret_cast<const uint8_t *>(offset_ptr),
                                            buffer_size, 0);
         if (err < 0) {
-            char errbuf[128];
-            av_strerror(err, errbuf, sizeof(errbuf));
-            RING_ERR("Couldn't fill audio frame: %s: %d %d", errbuf,
+            RING_ERR("Couldn't fill audio frame: %s: %d %d", libav_utils::getError(err).c_str(),
                      frame->nb_samples, buffer_size);
             av_frame_free(&frame);
             return -1;
@@ -428,9 +424,7 @@ int MediaEncoder::encode_audio(const AudioBuffer &buffer)
                 // write the compressed frame
                 ret = av_write_frame(outputCtx_, &pkt);
                 if (ret < 0) {
-                    char errbuf[64];
-                    av_strerror(ret, errbuf, sizeof(errbuf));
-                    RING_ERR("av_write_frame failed: %s", errbuf);
+                    RING_ERR("av_write_frame failed: %s", libav_utils::getError(ret).c_str());
                 } else
                     break;
             }
@@ -474,9 +468,7 @@ int MediaEncoder::flush()
             // write the compressed frame
             ret = av_write_frame(outputCtx_, &pkt);
             if (ret < 0) {
-                char errbuf[64];
-                av_strerror(ret, errbuf, sizeof(errbuf));
-                RING_ERR("av_write_frame failed: %s", errbuf);
+                RING_ERR("av_write_frame failed: %s", libav_utils::getError(ret).c_str());
             } else
                 break;
         }