#11330: When recording, audio duration is shorter by the time it takes to spin 
up
the video
----------------------------------------+----------------------------------
             Reporter:  chuckwoodchuck  |                    Owner:  (none)
                 Type:  defect          |                   Status:  new
             Priority:  important       |                Component:  ffmpeg
              Version:  unspecified     |               Resolution:
             Keywords:  pulseaudio      |               Blocked By:
             Blocking:                  |  Reproduced by developer:  0
Analyzed by developer:  0               |
----------------------------------------+----------------------------------
Changes (by chuckwoodchuck):

 * summary:  -f pulse cuts last 2 secodns of audio =>
     When recording, audio duration is shorter by the time it takes to spin
     up the video


Old description:

> Summary of the bug:
> -f pulse cuts last 2-3 seconds of audio when stopped by hitting "q"
> How to reproduce:
> I observed the behavior by recording screen with x11grab for video and
> pulse for audio. Last 2 seconds of audio are missing in every file.
> {{{
> $ ffmpeg -y -f x11grab -i "$DISPLAY" -f pulse -i alsa_output.pci-
> 0000_05_00.6.analog-stereo.monitor /tmp/recording.mp4
> }}}
> I decided to split video and audio with -map to separate files to measure
> the stream length, and indeed audio is shorter:
> {{{
> $ ffmpeg -y -f x11grab -i "$DISPLAY" -f pulse -i alsa_output.pci-
> 0000_05_00.6.analog-stereo.monitor -map 0:v /tmp/foo.mp4 -map 1:a
> /tmp/foo_audio.mp4
> $ ffprobe /tmp/foo_audio.mp4 |& grep Duration
>   Duration: 00:00:02.08, start: 0.000000, bitrate: 135 kb/s
> $ ffprobe /tmp/foo.mp4 |& grep Duration
>   Duration: 00:00:04.37, start: 0.000000, bitrate: 912 kb/s
> }}}
> It's not an issue with x11grab. Passing an arbitrary file in its place
> (-i something/mp4) produces the same effect with the audio being 2-3
> seconds shorter.
>
> The audio is not cut when total recording length is specified beforehand,
> with -t 15. It happens only when "q" is hit.
>
> The issue occurs on ffmpeg versions 5.1, 7.1 (Debian stable/sid) and
> recent builds, too. There's no difference between the pulseaudio or
> pipewire-pulse as the backend.

New description:

 Summary of the bug:
 When recording video+audio in a single ffmpeg instance, depending on the
 video codec used, the audio is trimmed at the end by exactly the duration
 it took for the video (codec?) to initialize.

 I observed the behavior by recording screen with x11grab for video and
 pulse for audio. Last 2 seconds of audio are missing in every file.
 {{{
 $ ffmpeg -y -f x11grab -i "$DISPLAY" -f pulse -i alsa_output.pci-
 0000_05_00.6.analog-stereo.monitor -c:v libx264 /tmp/recording.mp4
 }}}
 I decided to split video and audio with -map to separate files to measure
 the stream length, and indeed audio is shorter:
 {{{
 $ ffmpeg -y -f x11grab -i "$DISPLAY" -f pulse -i alsa_output.pci-
 0000_05_00.6.analog-stereo.monitor -c:v libx264 -map 0:v /tmp/foo.mp4 -map
 1:a /tmp/foo_audio.mp4
 $ ffprobe /tmp/foo_audio.mp4 |& grep Duration
   Duration: 00:00:02.08, start: 0.000000, bitrate: 135 kb/s
 $ ffprobe /tmp/foo.mp4 |& grep Duration
   Duration: 00:00:04.37, start: 0.000000, bitrate: 912 kb/s
 }}}
 It's not an issue with x11grab. Passing an arbitrary file in its place (-i
 something/mp4) produces the same effect with the audio being 2-3 seconds
 shorter.

 The audio is not cut when total recording length is specified beforehand,
 with -t 15. It happens only when "q" is hit.

 Examples:
 With libx264 -preset ultrafast the audio is 800 ms shorter
 {{{
 $ ffmpeg -y -f lavfi -i sine -f x11grab -i $DISPLAY -map 0:a
 /tmp/foo_audio.mp4 -c:v libx264 -preset ultrafast -map 1:v /tmp/foo.mp4

 $ ffprobe /tmp/foo.mp4 |& grep Duration; ffprobe /tmp/foo_audio.mp4 |&
 grep Duration
   Duration: 00:00:02.84, start: 0.000000, bitrate: 6460 kb/s
   Duration: 00:00:02.04, start: 0.000000, bitrate: 75 kb/s
 }}}

 With libx264 -preset veryslow the audio is 3200 ms shorter
 {{{
 $ ffmpeg -y -f lavfi -i sine -f x11grab -i $DISPLAY -map 0:a
 /tmp/foo_audio.mp4 -c:v libx264 -preset veryslow -map 1:v /tmp/foo.mp4

 $ ffprobe /tmp/foo.mp4 |& grep Duration; ffprobe /tmp/foo_audio.mp4 |&
 grep Duration
   Duration: 00:00:04.81, start: 0.000000, bitrate: 1202 kb/s
   Duration: 00:00:01.67, start: 0.000000, bitrate: 75 kb/s
 }}}

 libx265 with default settings, exactly 1 second
 {{{
 $ ffmpeg -y -f lavfi -i sine -f x11grab -i $DISPLAY -map 0:a
 /tmp/foo_audio.mp4 -c:v libx265 -map 1:v /tmp/foo.mp4
 $ ffprobe /tmp/foo.mp4 |& grep Duration; ffprobe /tmp/foo_audio.mp4 |&
 grep Duration
   Duration: 00:00:03.64, start: 0.000000, bitrate: 1854 kb/s
   Duration: 00:00:02.62, start: 0.000000, bitrate: 73 kb/s
 }}}

 And lastly, mpeg4, the streams are of equal length
 {{{
 $ ffmpeg -y -f lavfi -i sine -f x11grab -i $DISPLAY -map 0:a
 /tmp/foo_audio.mp4 -c:v mpeg4 -map 1:v /tmp/foo.mp4
 $ ffprobe /tmp/foo.mp4 |& grep Duration; ffprobe /tmp/foo_audio.mp4 |&
 grep Duration
   Duration: 00:00:02.57, start: 0.000000, bitrate: 7464 kb/s
   Duration: 00:00:02.62, start: 0.000000, bitrate: 73 kb/s
 }}}

 A behavior I'd expect, is that irrespective of the video codec used, since
 both audio and video capture is started in the same time, the streams
 should be of equal length. What's strange is that the audio is cut from
 the end, not the beginning (that is, the audio that is played while codec
 is starting is NOT lost - the lost part is the tail).

--
-- 
Ticket URL: <https://trac.ffmpeg.org/ticket/11330#comment:1>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
_______________________________________________
FFmpeg-trac mailing list
FFmpeg-trac@avcodec.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-trac

To unsubscribe, visit link above, or email
ffmpeg-trac-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to