diff --git a/libavdevice/alsa-audio-common.c b/libavdevice/alsa-audio-common.c
index 1e945fc389effc1258202b6309624e1954f3b38d..126695f7542db676d3ebbfc9016ca708153eaccc 100644
--- a/libavdevice/alsa-audio-common.c
+++ b/libavdevice/alsa-audio-common.c
@@ -260,6 +260,7 @@ av_cold int ff_alsa_open(AVFormatContext *ctx, snd_pcm_stream_t mode,
     }
 
     snd_pcm_hw_params_get_buffer_size_max(hw_params, &buffer_size);
+    buffer_size = FFMIN(buffer_size, ALSA_BUFFER_SIZE_MAX);
     /* TODO: maybe use ctx->max_picture_buffer somehow */
     res = snd_pcm_hw_params_set_buffer_size_near(h, hw_params, &buffer_size);
     if (res < 0) {
diff --git a/libavdevice/alsa-audio.h b/libavdevice/alsa-audio.h
index 1e0be1cac78ca3ec4c7cdabc869a390df434aaa2..ee43463696210ac86dc76888124efed3eec9f591 100644
--- a/libavdevice/alsa-audio.h
+++ b/libavdevice/alsa-audio.h
@@ -40,6 +40,8 @@
         other formats */
 #define DEFAULT_CODEC_ID AV_NE(CODEC_ID_PCM_S16BE, CODEC_ID_PCM_S16LE)
 
+#define ALSA_BUFFER_SIZE_MAX 32768
+
 typedef struct {
     AVClass *class;
     snd_pcm_t *h;