[FFmpeg-user] ALSA buffer xrun. (ALSA_BUFFER_SIZE_MAX overflow)

Johann Rekowski johann.rekowski at googlemail.com
Sun Mar 17 22:00:34 CET 2013


On 03/17/2013 03:35 PM, Nicolas George wrote:
> Can you show the output of the following command:
>
> arecord -D hw:2,1 -f S16_LE -c 2 -r 44100 -v > /dev/null
------------------------------------------------------------------------------------------------------------
Recording WAVE 'stdin' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
Hardware PCM card 2 'Loopback' device 1 subdevice 0
Its setup is:
   stream       : CAPTURE
   access       : RW_INTERLEAVED
   format       : S16_LE
   subformat    : STD
   channels     : 2
   rate         : 44100
   exact rate   : 44100 (44100/1)
   msbits       : 16
   buffer_size  : 22052
   period_size  : 5513
   period_time  : 125011
   tstamp_mode  : NONE
   period_step  : 1
   avail_min    : 5513
   period_event : 0
   start_threshold  : 1
   stop_threshold   : 22052
   silence_threshold: 0
   silence_size : 0
   boundary     : 6207086186423386112
   appl_ptr     : 0
   hw_ptr       : 0
------------------------------------------------------------------------------------------------------------

Posting full output, just to have everything documented. I have to add 
that I am using a loopback *.asoundrc* script to record the sound that 
alsa produces. I wasn't able to record from hw:0,0 otherwise. Here's 
what *.asoundrc* contains:

------------------------------------------------------------------------------------------------------------
pcm.!default {
   type asym
   playback.pcm "LoopAndReal"
   #capture.pcm "looprec"
   capture.pcm "hw:0,0"
}

pcm.looprec {
     type hw
     card "Loopback"
     device 1
     subdevice 0
}


pcm.LoopAndReal {
   type plug
   slave.pcm mdev
   route_policy "duplicate"
}


pcm.mdev {
   type multi
   slaves.a.pcm pcm.MixReale
   slaves.a.channels 2
   slaves.b.pcm pcm.MixLoopback
   slaves.b.channels 2
   bindings.0.slave a
   bindings.0.channel 0
   bindings.1.slave a
   bindings.1.channel 1
   bindings.2.slave b
   bindings.2.channel 0
   bindings.3.slave b
   bindings.3.channel 1
}


pcm.MixReale {
   type dmix
   ipc_key 1024
   slave {
     pcm "hw:0,0"
     rate 48000
     #rate 44100
     periods 128
     period_time 0
     period_size *1024* # must be power of 2
     buffer_size *8192*
   }
}

pcm.MixLoopback {
   type dmix
   ipc_key 1025
   slave {
     pcm "hw:Loopback,0,0"
     rate 48000
     #rate 44100
     periods 128
     period_time 0
     period_size *1024* # must be power of 2
     buffer_size *8192*
   }
}
------------------------------------------------------------------------------------------------------------
I've been experementing for a long time (already a week) with the 
*period_size* and *buffer_size* numbers.
*period_size 32* and *buffer_size 640* were good values for a good audio 
playback with no noticable delay. Recording with those values though 
produced tons of ALSA buffer xruns and the outcome of the audio was 
screechy and totally disturbed. So I went up by the power of 2 on 
*period_size* (since higher values for buffer_size didn't work anymore) 
and came to a end on *1024* for *period_size* and *8192* for 
*buffer_size*. Higher values caused lag and screechy audio, lower values 
too *ON THE RECORDING*, the playback was normal from alsa, and the game 
I was playing was respoinding normally too, even on *32* and *640*.

arecord output kinda makes me wonder why it shows higher values than my 
values set in .asoundrc...
Why does it show different values?
> Also, the value of buffer_size inside alsa-audio-common.c may be
> interesting. You can get it by just adding:
>
> av_log(0, 16, "buffer_size = %d\n", buffer_size);
>
> at the proper place.

Sorry I am no C expert (yet) and have no idea where the proper place would be. All I know is that this line would log the bufsize number from alsa-audio-common.c.

> What does happen if you run two separate instances of ffmpeg: one for the
> audio, and one for the video, with the video one niced?
>
> Regards,
Recording with 2 seperate instances of ffmpeg seems to have passed my 
routine game run. No ALSA buffer xruns happened in that time. I ran this 
command:
/ffmpeg -f alsa -ac 2 -i hw:2,1 -acodec pcm_s16le -vn out.wav | ffmpeg 
-f x11grab -r 30 -s 1920x1080 -i :0.0 -vcodec huffyuv -an -threads 8 
out.avi/

Well I gotta say that my routine road was at max 5 min long and I 
reached a length of 4 min and 51 seconds. I usually did shorter routines 
since the buffer xruns came earlier than that. I haven't tested a longer 
play yet.
Recording with 2 instances is a bit annoying though, because the audio 
file is a bit out of sync. Matching the video with the audio after every 
part that I record could be a really annoying task that I'd like to 
avoid. Running 2 seperate instances of ffmpeg caused a delay of ~1 second.


More information about the ffmpeg-user mailing list