diff --git a/libavformat/pcm.c b/libavformat/pcm.c
index 9741f73667..b7728dd15e 100644
--- a/libavformat/pcm.c
+++ b/libavformat/pcm.c
@@ -19,32 +19,48 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavcodec/codec_par.h"
 #include "libavutil/mathematics.h"
 #include "avformat.h"
 #include "internal.h"
 #include "pcm.h"
 
-#define RAW_SAMPLES     1024
+#define PCM_DEMUX_TARGET_FPS  25
 
-int ff_pcm_read_packet(AVFormatContext *s, AVPacket *pkt)
+int ff_pcm_default_packet_size(AVCodecParameters *par)
 {
-    AVCodecParameters *par = s->streams[0]->codecpar;
-    int ret, size;
+    int nb_samples, max_samples, target_duration;
 
     if (par->block_align <= 0)
         return AVERROR(EINVAL);
 
-    /*
-     * Compute read size to complete a read every 62ms.
-     * Clamp to RAW_SAMPLES if larger.
-     */
-    size = FFMAX(par->sample_rate/25, 1);
-    if (par->block_align <= INT_MAX / RAW_SAMPLES) {
-        size = FFMIN(size, RAW_SAMPLES) * par->block_align;
-    } else {
-        size = par->block_align;
+    max_samples = INT_MAX / par->block_align;
+    target_duration = FFMAX(1, par->sample_rate / PCM_DEMUX_TARGET_FPS);
+    nb_samples = 1 << av_log2(FFMIN(target_duration, max_samples));
+
+    while (nb_samples > 1) {
+        int duration = av_get_audio_frame_duration2(par, par->block_align * nb_samples);
+        if (!duration) {
+            /* Fallback to a size based method for a likely non-pcm codec */
+            nb_samples = av_clip(4096 / par->block_align, 1, max_samples);
+            break;
+        }
+        if (duration <= target_duration)
+            break;
+        nb_samples >>= 1;
     }
 
+    return par->block_align * nb_samples;
+}
+
+int ff_pcm_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    int ret, size;
+
+    size = ff_pcm_default_packet_size(s->streams[0]->codecpar);
+    if (size < 0)
+        return size;
+
     ret = av_get_packet(s->pb, pkt, size);
 
     pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
diff --git a/libavformat/pcm.h b/libavformat/pcm.h
index 9af36d5a2e..1928497eed 100644
--- a/libavformat/pcm.h
+++ b/libavformat/pcm.h
@@ -24,6 +24,7 @@
 
 #include "avformat.h"
 
+int ff_pcm_default_packet_size(AVCodecParameters *par);
 int ff_pcm_read_packet(AVFormatContext *s, AVPacket *pkt);
 int ff_pcm_read_seek(AVFormatContext *s,
                      int stream_index, int64_t timestamp, int flags);
diff --git a/tests/ref/seek/lavf-al b/tests/ref/seek/lavf-al
index 5a4085af4e..ebf7993425 100644
--- a/tests/ref/seek/lavf-al
+++ b/tests/ref/seek/lavf-al
@@ -1,50 +1,50 @@
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret: 0         st:-1 flags:0  ts:-1.000000
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret: 0         st:-1 flags:1  ts: 1.894167
-ret: 0         st: 0 flags:1 dts: 1.894150 pts: 1.894150 pos:  41766 size:   882
+ret: 0         st: 0 flags:1 dts: 1.894150 pts: 1.894150 pos:  41766 size:   512
 ret: 0         st: 0 flags:0  ts: 0.788345
-ret: 0         st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos:  17383 size:   882
+ret: 0         st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos:  17383 size:   512
 ret: 0         st: 0 flags:1  ts:-0.317506
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret:-1         st:-1 flags:0  ts: 2.576668
 ret: 0         st:-1 flags:1  ts: 1.470835
-ret: 0         st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos:  32432 size:   882
+ret: 0         st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos:  32432 size:   512
 ret: 0         st: 0 flags:0  ts: 0.364989
-ret: 0         st: 0 flags:1 dts: 0.364989 pts: 0.364989 pos:   8048 size:   882
+ret: 0         st: 0 flags:1 dts: 0.364989 pts: 0.364989 pos:   8048 size:   512
 ret: 0         st: 0 flags:1  ts:-0.740816
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret:-1         st:-1 flags:0  ts: 2.153336
 ret: 0         st:-1 flags:1  ts: 1.047503
-ret: 0         st: 0 flags:1 dts: 1.047483 pts: 1.047483 pos:  23097 size:   882
+ret: 0         st: 0 flags:1 dts: 1.047483 pts: 1.047483 pos:  23097 size:   512
 ret: 0         st: 0 flags:0  ts:-0.058322
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret: 0         st: 0 flags:1  ts: 2.835828
-ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:  43218 size:   882
+ret: 0         st: 0 flags:1 dts: 1.987029 pts: 1.987029 pos:  43814 size:   286
 ret: 0         st:-1 flags:0  ts: 1.730004
-ret: 0         st: 0 flags:1 dts: 1.730023 pts: 1.730023 pos:  38147 size:   882
+ret: 0         st: 0 flags:1 dts: 1.730023 pts: 1.730023 pos:  38147 size:   512
 ret: 0         st:-1 flags:1  ts: 0.624171
-ret: 0         st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos:  13763 size:   882
+ret: 0         st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos:  13763 size:   512
 ret: 0         st: 0 flags:0  ts:-0.481678
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret: 0         st: 0 flags:1  ts: 2.412517
-ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:  43218 size:   882
+ret: 0         st: 0 flags:1 dts: 1.987029 pts: 1.987029 pos:  43814 size:   286
 ret: 0         st:-1 flags:0  ts: 1.306672
-ret: 0         st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos:  28812 size:   882
+ret: 0         st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos:  28812 size:   512
 ret: 0         st:-1 flags:1  ts: 0.200839
-ret: 0         st: 0 flags:1 dts: 0.200816 pts: 0.200816 pos:   4428 size:   882
+ret: 0         st: 0 flags:1 dts: 0.200816 pts: 0.200816 pos:   4428 size:   512
 ret: 0         st: 0 flags:0  ts:-0.904989
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret: 0         st: 0 flags:1  ts: 1.989161
 ret: 0         st: 0 flags:1 dts: 1.989161 pts: 1.989161 pos:  43861 size:   239
 ret: 0         st:-1 flags:0  ts: 0.883340
-ret: 0         st: 0 flags:1 dts: 0.883356 pts: 0.883356 pos:  19478 size:   882
+ret: 0         st: 0 flags:1 dts: 0.883356 pts: 0.883356 pos:  19478 size:   512
 ret: 0         st:-1 flags:1  ts:-0.222493
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret:-1         st: 0 flags:0  ts: 2.671655
 ret: 0         st: 0 flags:1  ts: 1.565850
-ret: 0         st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos:  34527 size:   882
+ret: 0         st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos:  34527 size:   512
 ret: 0         st:-1 flags:0  ts: 0.460008
-ret: 0         st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos:  10143 size:   882
+ret: 0         st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos:  10143 size:   512
 ret: 0         st:-1 flags:1  ts:-0.645825
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
diff --git a/tests/ref/seek/lavf-ul b/tests/ref/seek/lavf-ul
index 5a4085af4e..ebf7993425 100644
--- a/tests/ref/seek/lavf-ul
+++ b/tests/ref/seek/lavf-ul
@@ -1,50 +1,50 @@
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret: 0         st:-1 flags:0  ts:-1.000000
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret: 0         st:-1 flags:1  ts: 1.894167
-ret: 0         st: 0 flags:1 dts: 1.894150 pts: 1.894150 pos:  41766 size:   882
+ret: 0         st: 0 flags:1 dts: 1.894150 pts: 1.894150 pos:  41766 size:   512
 ret: 0         st: 0 flags:0  ts: 0.788345
-ret: 0         st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos:  17383 size:   882
+ret: 0         st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos:  17383 size:   512
 ret: 0         st: 0 flags:1  ts:-0.317506
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret:-1         st:-1 flags:0  ts: 2.576668
 ret: 0         st:-1 flags:1  ts: 1.470835
-ret: 0         st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos:  32432 size:   882
+ret: 0         st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos:  32432 size:   512
 ret: 0         st: 0 flags:0  ts: 0.364989
-ret: 0         st: 0 flags:1 dts: 0.364989 pts: 0.364989 pos:   8048 size:   882
+ret: 0         st: 0 flags:1 dts: 0.364989 pts: 0.364989 pos:   8048 size:   512
 ret: 0         st: 0 flags:1  ts:-0.740816
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret:-1         st:-1 flags:0  ts: 2.153336
 ret: 0         st:-1 flags:1  ts: 1.047503
-ret: 0         st: 0 flags:1 dts: 1.047483 pts: 1.047483 pos:  23097 size:   882
+ret: 0         st: 0 flags:1 dts: 1.047483 pts: 1.047483 pos:  23097 size:   512
 ret: 0         st: 0 flags:0  ts:-0.058322
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret: 0         st: 0 flags:1  ts: 2.835828
-ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:  43218 size:   882
+ret: 0         st: 0 flags:1 dts: 1.987029 pts: 1.987029 pos:  43814 size:   286
 ret: 0         st:-1 flags:0  ts: 1.730004
-ret: 0         st: 0 flags:1 dts: 1.730023 pts: 1.730023 pos:  38147 size:   882
+ret: 0         st: 0 flags:1 dts: 1.730023 pts: 1.730023 pos:  38147 size:   512
 ret: 0         st:-1 flags:1  ts: 0.624171
-ret: 0         st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos:  13763 size:   882
+ret: 0         st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos:  13763 size:   512
 ret: 0         st: 0 flags:0  ts:-0.481678
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret: 0         st: 0 flags:1  ts: 2.412517
-ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:  43218 size:   882
+ret: 0         st: 0 flags:1 dts: 1.987029 pts: 1.987029 pos:  43814 size:   286
 ret: 0         st:-1 flags:0  ts: 1.306672
-ret: 0         st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos:  28812 size:   882
+ret: 0         st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos:  28812 size:   512
 ret: 0         st:-1 flags:1  ts: 0.200839
-ret: 0         st: 0 flags:1 dts: 0.200816 pts: 0.200816 pos:   4428 size:   882
+ret: 0         st: 0 flags:1 dts: 0.200816 pts: 0.200816 pos:   4428 size:   512
 ret: 0         st: 0 flags:0  ts:-0.904989
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret: 0         st: 0 flags:1  ts: 1.989161
 ret: 0         st: 0 flags:1 dts: 1.989161 pts: 1.989161 pos:  43861 size:   239
 ret: 0         st:-1 flags:0  ts: 0.883340
-ret: 0         st: 0 flags:1 dts: 0.883356 pts: 0.883356 pos:  19478 size:   882
+ret: 0         st: 0 flags:1 dts: 0.883356 pts: 0.883356 pos:  19478 size:   512
 ret: 0         st:-1 flags:1  ts:-0.222493
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
 ret:-1         st: 0 flags:0  ts: 2.671655
 ret: 0         st: 0 flags:1  ts: 1.565850
-ret: 0         st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos:  34527 size:   882
+ret: 0         st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos:  34527 size:   512
 ret: 0         st:-1 flags:0  ts: 0.460008
-ret: 0         st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos:  10143 size:   882
+ret: 0         st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos:  10143 size:   512
 ret: 0         st:-1 flags:1  ts:-0.645825
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
+ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   512
