[FFmpeg-trac] #10202(ffmpeg:new): FFMPEG freeze/hangs while downloading M3u8

FFmpeg trac at avcodec.org
Fri Feb 17 20:07:52 EET 2023


#10202: FFMPEG freeze/hangs while downloading M3u8
---------------------------------+-------------------------------------
             Reporter:  xeontwo  |                     Type:  defect
               Status:  new      |                 Priority:  important
            Component:  ffmpeg   |                  Version:  4.4.3
             Keywords:           |               Blocked By:
             Blocking:           |  Reproduced by developer:  0
Analyzed by developer:  0        |
---------------------------------+-------------------------------------
 Summary of the bug:

 The ffmpeg freezes/hangs while downloading a m3u8 stream

 How to reproduce:

 {{{
 %  /usr/bin/ffmpeg -stats -stats_period 1 -progress pipe:1 -loglevel panic
 -y -nostdin -hide_banner -dts_delta_threshold 3600 -dts_error_threshold
 3600 -probesize 10000000 -analyzeduration 10000000 -fflags
 +genpts+discardcorrupt -err_detect ignore_err -copyts -start_at_zero
 -correct_ts_overflow 0 -vsync 0 -avoid_negative_ts disabled
 -max_interleave_delta 0 -timeout 15000000 -reconnect 1
 -reconnect_on_network_error 1 -reconnect_streamed 1 -reconnect_delay_max
 15 -i http://any_input/local.m3u8 -map 0 -dn -ignore_unknown -vcodec copy
 -scodec copy -acodec copy -individual_header_trailer 0 -f segment
 -segment_format mpegts -segment_time 6 -segment_list_type m3u8
 -segment_list_flags +live -segment_wrap 35 -segment_list_size 20
 -segment_list /var/www/stream.m3u8 /var/www/stream_%d.ts
 }}}

 FFMPEG version/compilation details:

 {{{
 ffmpeg version 4.4.3-0ubuntu1~18.04.sav2 Copyright (c) 2000-2022 the
 FFmpeg developers
   built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
   configuration: --prefix=/usr --extra-version='0ubuntu1~18.04.sav2'
 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu
 --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl
 --disable-stripping --enable-amf --enable-gnutls --enable-ladspa --enable-
 libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-
 libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-
 libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi
 --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame
 --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-
 libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-
 librubberband --enable-libshine --enable-libsnappy --enable-libsoxr
 --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora
 --enable-libtwolame --enable-libvidstab --enable-libvmaf --enable-
 libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-
 libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi
 --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl
 --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-crystalhd
 --enable-libmfx --enable-libsvtav1 --enable-libdc1394 --enable-libdrm
 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264
 --enable-librav1e --enable-shared
 }}}

 This issue is happening since ffmpeg >3.4. I've made a strace on the
 ffmpge process, and it shows only a looping HTTP Request.

 {{{
 ~# strace -p 4135896
 strace: Process 4135896 attached
 restart_syscall(<... resuming interrupted nanosleep ...>) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 poll([{fd=10, events=POLLOUT}], 1, 100) = 1 ([{fd=10, revents=POLLOUT}])
 sendto(10, "GET /local.m3u8"..., 179, MSG_NOSIGNAL, NULL, 0) = 179
 poll([{fd=10, events=POLLIN}], 1, 100)  = 0 (Timeout)
 poll([{fd=10, events=POLLIN}], 1, 100)  = 1 ([{fd=10, revents=POLLIN}])
 recvfrom(10, "HTTP/1.1 206 Partial Content\r\nAc"..., 8192, 0, NULL, NULL)
 = 227
 poll([{fd=10, events=POLLIN}], 1, 100)  = 1 ([{fd=10, revents=POLLIN}])
 recvfrom(10, "#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-"..., 32768, 0, NULL,
 NULL) = 398
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 poll([{fd=10, events=POLLOUT}], 1, 100) = 1 ([{fd=10, revents=POLLOUT}])
 sendto(10, "GET /local.m3u8"..., 179, MSG_NOSIGNAL, NULL, 0) = 179
 poll([{fd=10, events=POLLIN}], 1, 100)  = 0 (Timeout)
 poll([{fd=10, events=POLLIN}], 1, 100)  = 1 ([{fd=10, revents=POLLIN}])
 recvfrom(10, "HTTP/1.1 206 Partial Content\r\nAc"..., 8192, 0, NULL, NULL)
 = 625
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7fff11f8f700) = 0
 poll([{fd=10, events=POLLOUT}], 1, 100) = 1 ([{fd=10, revents=POLLOUT}])
 }}}

 After killing ffmpeg via SIGKILL, the issue is solved.

 Is there a way to kill ffmpeg after X seconds without writing the output?
 (Output timeout, perhaps)? Or fix this issue?

 Thanks
-- 
Ticket URL: <https://trac.ffmpeg.org/ticket/10202>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list