Opened 9 months ago

#10502 new defect

var_stream_map doesn't support optional entries

Reported by: alexey.rodionov Owned by:
Priority: normal Component: undetermined
Version: git-master Keywords: hls
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

I'm working on a service that takes a video file as input and generates HLS streams in various resolutions as output (like YouTube does).

If the input file has no audio, running the following command:

ffmpeg -i input.mp4 -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:a:0 -filter:v:0 scale=-2:360 -filter:v:1 scale=-2:480 -filter:v:2 scale=-2:720 -filter:v:3 scale=-2:1080 -f hls -hls_playlist_type vod -hls_flags independent_segments -master_pl_name master.m3u8 -hls_segment_filename stream_%v/chunk_%08d.ts -strftime_mkdir 1 -var_stream_map "v:0,name:360p,agroup:audio v:1,name:480p,agroup:audio v:2,name:720p,agroup:audio v:3,name:1080p,agroup:audio a:0,name:audio,agroup:audio" stream_%v.m3u8

causes the following error:

Stream map '0:a:0' matches no streams.
To ignore this, add a trailing '?' to the map.

This error can be fixed by changing -map 0:a:0 to -map 0:a:0?, but then another error occurs:

[hls @ 000002928260f640] Unable to map stream at a:0
[hls @ 000002928260f640] Variant stream info update failed with status ffffffea
[out#0/hls @ 000002928260f440] Could not write header (incorrect codec parameters ?): Invalid argument

Changing a:0,name:audio,agroup:audio to a:0,name:audio,agroup:audio? inside -var_stream_map doesn't help.

The problem is that I don't know if the input file the user can upload has audio or not.

I've found other mentions of this problem, e.g.:

https://stackoverflow.com/q/54008205/#comment94853363_54008205
https://stackoverflow.com/a/59220868/#comment104669510_59220868
https://stackoverflow.com/a/69623106

Notes:

The interesting thing is that there is another way to create an HLS streams using dash muxer with -hls_playlist true option instead of hls muxer:

ffmpeg -i input.mp4 -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:a:0 -filter:v:0 scale=-2:360 -filter:v:1 scale=-2:480 -filter:v:2 scale=-2:720 -filter:v:3 scale=-2:1080 -use_template 1 -use_timeline 1 -adaptation_sets "id=0,streams=v id=1,streams=a" -hls_playlist true -f dash manifest.mpd

In this case changing -map 0:a:0 to -map 0:a:0? is enough.

Change History (0)

Note: See TracTickets for help on using tickets.