[FFmpeg-trac] #9236(avformat:new): Appending new segments into old hls segment list is very slow for large m3u8 file
FFmpeg
trac at avcodec.org
Tue May 11 10:13:42 EEST 2021
#9236: Appending new segments into old hls segment list is very slow for large
m3u8 file
-------------------------------------+------------------------------------
Reporter: litzh | Owner: (none)
Type: enhancement | Status: new
Priority: normal | Component: avformat
Version: git-master | Resolution:
Keywords: HLS | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+------------------------------------
Description changed by litzh:
Old description:
> Summary of the bug:
>
> I am trying to record rtmp live stream into HLS with `append_list` flag.
> When the recording is interrupted and the m3u8 file is very large (see
> attached file), it would take several minutes to resume recording.
>
> With `append_list` enabled, `find_segment_by_filename` finds duplicate
> segment filenames by linearly traversing the singly linked list.
> `av_strcasecmp` is a simple loop and cannot be accelerated by SMID. The
> time complexity is O(n^3^), where n is the total bytes of the segment
> filenames.
>
> How to reproduce:
> {{{
> % ffmpeg -rw_timeout 10000000 -y -flv_ignore_prevtag 1 -i
> "rtmp://example.com/live/12544134-c2397sl2lrnb4obtt020" -vcodec copy
> -acodec copy -hls_time 4 -hls_flags append_list -hls_list_size 0
> -hls_segment_filename 12544134-c2397sl2lrnb4obtt020-0_540p-%04d.ts -f hls
> 12544134-c2397sl2lrnb4obtt020-0_540p.m3u8
> ffmpeg version N-102493-g7ce0f246f4 Copyright (c) 2000-2021 the FFmpeg
> developers
> built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
> configuration: --pkg-config-flags=--static --extra-ldflags='-ldl -lm
> -lpthread -lrt -lstdc++ -static' --enable-gpl --enable-nonfree --enable-
> version3 --extra-libs=-ldl --disable-programs --enable-ffmpeg --enable-
> ffprobe --enable-static
> libavutil 57. 0.100 / 57. 0.100
> libavcodec 59. 1.100 / 59. 1.100
> libavformat 59. 0.101 / 59. 0.101
> libavdevice 59. 0.100 / 59. 0.100
> libavfilter 8. 0.101 / 8. 0.101
> libswscale 6. 0.100 / 6. 0.100
> libswresample 4. 0.100 / 4. 0.100
> libpostproc 56. 0.100 / 56. 0.100
> Input #0, flv, from
> 'rtmp://example.com/live/12544134-c2397sl2lrnb4obtt020':
> Metadata:
> |RtmpSampleAccess: true
> encoder : DyEncoder58.40.100
> Duration: 00:00:00.00, start: 661322.354000, bitrate: N/A
> Stream #0:0: Data: none
> Stream #0:1: Subtitle: text
> Stream #0:2: Audio: aac (LC), 44100 Hz, stereo, fltp, 160 kb/s
> Stream #0:3: Video: h264 (Main), yuv420p(progressive), 1920x1080, 8001
> kb/s, 62.50 fps, 62 tbr, 1k tbn
> }}}
New description:
Summary of the bug:
I am trying to record rtmp live stream into HLS with `append_list` flag.
When the recording is interrupted and the m3u8 file is very large (see
attached file), it would take several minutes to resume recording.
With `append_list` enabled, `find_segment_by_filename` finds duplicate
segment filenames by linearly traversing the singly linked list.
`av_strcasecmp` is a simple loop and cannot be accelerated by SIMD. The
time complexity is O(n^3^), where n is the total bytes of the segment
filenames.
How to reproduce:
{{{
% ffmpeg -rw_timeout 10000000 -y -flv_ignore_prevtag 1 -i
"rtmp://example.com/live/12544134-c2397sl2lrnb4obtt020" -vcodec copy
-acodec copy -hls_time 4 -hls_flags append_list -hls_list_size 0
-hls_segment_filename 12544134-c2397sl2lrnb4obtt020-0_540p-%04d.ts -f hls
12544134-c2397sl2lrnb4obtt020-0_540p.m3u8
ffmpeg version N-102493-g7ce0f246f4 Copyright (c) 2000-2021 the FFmpeg
developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --pkg-config-flags=--static --extra-ldflags='-ldl -lm
-lpthread -lrt -lstdc++ -static' --enable-gpl --enable-nonfree --enable-
version3 --extra-libs=-ldl --disable-programs --enable-ffmpeg --enable-
ffprobe --enable-static
libavutil 57. 0.100 / 57. 0.100
libavcodec 59. 1.100 / 59. 1.100
libavformat 59. 0.101 / 59. 0.101
libavdevice 59. 0.100 / 59. 0.100
libavfilter 8. 0.101 / 8. 0.101
libswscale 6. 0.100 / 6. 0.100
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, flv, from
'rtmp://example.com/live/12544134-c2397sl2lrnb4obtt020':
Metadata:
|RtmpSampleAccess: true
encoder : DyEncoder58.40.100
Duration: 00:00:00.00, start: 661322.354000, bitrate: N/A
Stream #0:0: Data: none
Stream #0:1: Subtitle: text
Stream #0:2: Audio: aac (LC), 44100 Hz, stereo, fltp, 160 kb/s
Stream #0:3: Video: h264 (Main), yuv420p(progressive), 1920x1080, 8001
kb/s, 62.50 fps, 62 tbr, 1k tbn
}}}
--
--
Ticket URL: <https://trac.ffmpeg.org/ticket/9236#comment:1>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list