[FFmpeg-user] Generating multiple HLS renditions and a master playlist results in unpredictable behavior.

Dennis Mungai dmngaie at gmail.com
Fri Mar 9 00:52:38 EET 2018


Hello, and good morning.

I have ran into a problem with the HLS muxer, as shown below.

I want to generate three HLS renditions from a single input file, and
a master playlist pointing to the renditions.

Here's the command line used:

ffmpeg -loglevel debug -threads 4 -filter_complex_threads 4 -vsync 1
-i '/home/lin/Desktop/src/sowdtow.webm' -filter_complex \
"[v:0]split=3[s0][s1][s2]; \
 [s0]yadif[v0]; \
 [s1]yadif[v1]; \
 [s2]scale=w=1280:h=720:force_original_aspect_ratio=decrease:flags=lanczos,yadif[v2]"
\
-map "[v0]" -c:v libx264 -pix_fmt yuv420p -preset medium -profile:v
main -level 4.1 -b:v 5250k -maxrate:v 6375k -bufsize:v 12600k \
-map "[v1]" -c:v libx264 -pix_fmt yuv420p -preset medium -profile:v
main -level 4.1 -b:v 4200k -maxrate:v 4494k -bufsize:v 6300k \
-map "[v2]" -c:v libx264 -pix_fmt yuv420p -preset medium -profile:v
main -level 4.1 -b:v 2100k -maxrate:v 2247k -bufsize:v 3150k \
-map a:0 -map a:0 -map a:0 -c:a aac -ar 48000 -ab 256k -af
"aresample=async=1:min_hard_comp=0.100000:first_pts=0" \
-f hls \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" -hls_wrap 24 -hls_time 4
-master_pl_name master.m3u8 \
"/home/lin/Desktop/dest/vs%v/manifest.m3u8"


File information:

ffprobe -i sowdtow.webm
ffprobe version N-90268-g9fe61b6 Copyright (c) 2007-2018 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 20160609
  configuration: --prefix=/home/lin/ffmpeg_build
--pkg-config-flags=--static
--extra-cflags=-I/home/lin/ffmpeg_build/include
--extra-ldflags=-L/home/lin/ffmpeg_build/lib --bindir=/home/lin/bin
--enable-cuda-sdk --enable-cuvid --enable-libnpp
--extra-cflags=-I../nv_sdk --extra-ldflags=-L../nv_sdk
--extra-cflags=-I/usr/local/cuda/include/
--extra-ldflags=-L/usr/local/cuda/lib64/ --nvccflags='-gencode
arch=compute_61,code=sm_61 -O2' --enable-gpl --enable-libass
--enable-libfdk-aac --enable-libx264 --extra-libs=-lpthread
--enable-libx265 --enable-nvenc --enable-nonfree
  libavutil      56.  8.100 / 56.  8.100
  libavcodec     58. 14.100 / 58. 14.100
  libavformat    58. 10.100 / 58. 10.100
  libavdevice    58.  2.100 / 58.  2.100
  libavfilter     7. 12.100 /  7. 12.100
  libswscale      5.  0.102 /  5.  0.102
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
Input #0, matroska,webm, from 'sowdtow.webm':
  Metadata:
    ENCODER         : Lavf58.10.100
  Duration: 00:03:02.18, start: 0.000000, bitrate: 16906 kb/s
    Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv,
bt709/unknown/unknown), 3840x2160, SAR 1:1 DAR 16:9, 29.97 fps, 29.97
tbr, 1k tbn, 1k tbc (default)
    Metadata:
      DURATION        : 00:03:02.115000000
    Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp (default)
    Metadata:
      HANDLER_NAME    : SoundHandler
      DURATION        : 00:03:02.184000000




The command above is supposed to achieve the following goals:

1. Split the primary video stream into three, such that separate
outputs governed by the selected encoder (libx264) and separate
filters can be applied, including a re-scale for the third stream.

2. Encode the audio stream to three different renditions, and

3. Using the HLS muxer's -var_stream_map , generate appropriate
groupings for the renditions above and a master playlist pointing to
the renditions.

Here's where all goes to hell:

Only the first variable stream map pair (output under
~/Desktop/dest/vs1) has the correct HLS time set in the segments, as
shown below:


less vs0/manifest.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:41
#EXTINF:3.937267,
manifest17.ts
#EXTINF:4.004000,
manifest18.ts
#EXTINF:4.070733,
manifest19.ts
#EXTINF:3.903900,
manifest20.ts
#EXTINF:2.202200,
manifest21.ts
#EXT-X-ENDLIST


And now, on to the other broken manifests rendered unplayable:

less vs1/manifest.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:0
#EXT-X-MEDIA-SEQUENCE:41
#EXTINF:0.000000,
manifest17.ts
#EXTINF:0.000000,
manifest18.ts
#EXTINF:0.000000,
manifest19.ts
#EXTINF:0.000000,
manifest20.ts
#EXTINF:0.000000,
manifest21.ts
#EXT-X-ENDLIST


And vs2/manifest.m3u8:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:0
#EXT-X-MEDIA-SEQUENCE:41
#EXTINF:0.000000,
manifest17.ts
#EXTINF:0.000000,
manifest18.ts
#EXTINF:0.000000,
manifest19.ts
#EXTINF:0.000000,
manifest20.ts
#EXTINF:0.000000,
manifest21.ts
#EXT-X-ENDLIST


Note the anomaly in the #EXTINF: period field on vs1 and 2's manifest,
zeroed out, and compare it to the functioning vs0's manifest.

The second anomaly arises in the main manifest:

less master.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=2591600,RESOLUTION=3840x2160,CODECS="avc1.4d4029,mp4a.40.2"
vs0/manifest.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=2591600,RESOLUTION=3840x2160,CODECS="avc1.4d4029,mp4a.40.2"
vs1/manifest.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=2591600,RESOLUTION=1280x720,CODECS="avc1.4d4029,mp4a.40.2"
vs2/manifest.m3u8


Note that according to the master manifest, all three renditions have
the same BANDWIDTH value, despite having separate encoder settings.

How can I fix this?

Testing with other muxers, such as fifo and tee also result in the same issue.

Platform information:

ffmpeg -buildconf
ffmpeg version N-90268-g9fe61b6 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 20160609
  configuration: --prefix=/home/lin/ffmpeg_build
--pkg-config-flags=--static
--extra-cflags=-I/home/lin/ffmpeg_build/include
--extra-ldflags=-L/home/lin/ffmpeg_build/lib --bindir=/home/lin/bin
--enable-cuda-sdk --enable-cuvid --enable-libnpp
--extra-cflags=-I../nv_sdk --extra-ldflags=-L../nv_sdk
--extra-cflags=-I/usr/local/cuda/include/
--extra-ldflags=-L/usr/local/cuda/lib64/ --nvccflags='-gencode
arch=compute_61,code=sm_61 -O2' --enable-gpl --enable-libass
--enable-libfdk-aac --enable-libx264 --extra-libs=-lpthread
--enable-libx265 --enable-nvenc --enable-nonfree
  libavutil      56.  8.100 / 56.  8.100
  libavcodec     58. 14.100 / 58. 14.100
  libavformat    58. 10.100 / 58. 10.100
  libavdevice    58.  2.100 / 58.  2.100
  libavfilter     7. 12.100 /  7. 12.100
  libswscale      5.  0.102 /  5.  0.102
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100

  configuration:
    --prefix=/home/lin/ffmpeg_build
    --pkg-config-flags=--static
    --extra-cflags=-I/home/lin/ffmpeg_build/include
    --extra-ldflags=-L/home/lin/ffmpeg_build/lib
    --bindir=/home/lin/bin
    --enable-cuda-sdk
    --enable-cuvid
    --enable-libnpp
    --extra-cflags=-I../nv_sdk
    --extra-ldflags=-L../nv_sdk
    --extra-cflags=-I/usr/local/cuda/include/
    --extra-ldflags=-L/usr/local/cuda/lib64/
    --nvccflags='-gencode arch=compute_61,code=sm_61 -O2'
    --enable-gpl
    --enable-libass
    --enable-libfdk-aac
    --enable-libx264
    --extra-libs=-lpthread
    --enable-libx265
    --enable-nvenc
    --enable-nonfree


Warm regards,

Dennis.


More information about the ffmpeg-user mailing list