[FFmpeg-user] multiple HLS outputs with different stream maps

andrei ka andrei.k.gml at gmail.com
Mon Jul 22 15:38:44 EEST 2019


mmm, looks cool, mind sending a shell properly formatted ? ;-) i get errors
from it :

===========
ffmpeg -ignore_unknown -async 1 -probesize 1M -analyzeduration 1000000  \
-i $1 -t 00:00:10 -threads 0 -fflags +genpts \
-filter_complex
"[0:v]yadif=0:-1:0[deinterlaced];[deinterlaced]split=4[v1][v2][v3][v4];[v1]copy[v1out];[v2]scale=w=1280:h=720:\
force_original_aspect_ratio=disable[v2scale];[v2scale]pad=width=1280:height=720:x=(ow-iw)/2:y=0:color=black[v2out];\
[v3]scale=w=800:h=450:force_original_aspect_ratio=disable[v3scale];[v3scale]pad=width=800:height=450:x=(ow-iw)/2:\
y=0:color=black[v3out];[v4]scale=w=480:h=270:force_original_aspect_ratio=disable[v4scale];[v4scale]pad=width=480:height=270:x=(ow-iw)/2:y=0:color=black[v4out]"
\
-map [v1out] -x264opts:v:0 keyint=15:min-keyint=15:no-scenecut -flags:v:0
+cgop -c:v:0 libx264 -profile:v:0 high -level 4.0 -preset superfast -b:v:0
8000k -maxrate:v:0 10000k  -minrate:v:0 4000k \
-map [v2out] -x264opts:v:1 keyint=15:min-keyint=15:no-scenecut -flags:v:1
+cgop -c:v:1 libx264 -profile:v:1 high -level 4.0 -preset superfast -b:v:1
3000k -maxrate:v:1 3000k   -minrate:v:1 1350k \
-map [v3out] -x264opts:v:2 keyint=15:min-keyint=15:no-scenecut -flags:v:2
+cgop -c:v:2 libx264 -profile:v:2 main -level 3.1 -preset superfast -b:v:2
900k  -maxrate:v:2 900k    -minrate:v:2 450k \
-map [v4out] -x264opts:v:3 keyint=15:min-keyint=15:no-scenecut -flags:v:3
+cgop -c:v:3 libx264 -profile:v:3 baseline -level 3.0 -preset superfast
-b:v:3 450k -maxrate:v:3 450k -minrate:v:3 150k \
-map a:0 -c:a:0 libfdk_aac -b:a:0 128k -metadata:s:a:0 language=ron -map
a:0 -c:a:1 libfdk_aac -b:a:1 128k -metadata:s:a:1 language=ron \
-map a:0 -c:a:2 libfdk_aac -b:a:2 128k -metadata:s:a:2 language=ron \
-map a:0 -c:a:3 libfdk_aac -b:a:3 128k -metadata:s:a:3 language=ron \
"[select=\'v:0,v:1,v:2,v:3,a:0\':f=hls:onfail=ignore:\
var_stream_map=\'v:0,agroup:audiov:1,agroup:audio v:2,agroup:audio
v:3,agroup:audioa:0,agroup:audio,language:ron,default:yes\':use_localtime=1:\
hls_allow_cache=0:hls_flags=discont_start+delete_segments+omit_endlist+second_level_segment_index+second_level_segment_size+second_level_segment_duration+program_date_time:\
hls_start_number_source=datetime:hls_time=6:hls_list_size=10:hls_segment_filename=%v_stream_%%04d_%%08s_%%013t.ts:master_pl_name=playlist.m3u8]variant_%v_manifest.m3u8
| \
[select=\'v:0,v:1,v:2,v:3,a:0,a:1,a:2,a:3\':f=hls:var_stream_map=\'v:0,a:0v:1,a:1
v:2,a:2 v:3,a:3\':use_localtime=1:hls_allow_cache=0:\
hls_flags=discont_start+temp_file+delete_segments+omit_endlist+second_level_segment_index+second_level_segment_size+second_level_segment_duration+program_date_time:\
hls_start_number_source=datetime:hls_time=6:hls_list_size=10:hls_segment_filename=%v_stream2_%Y%m%d%H%M%S_%%04d_%%08s_%%013t.ts:master_pl_name=playlist2.m3u8]variant2_%v_manifest.m3u8"



On Mon, Jul 22, 2019 at 11:45 AM Viorel Dehelean <synologic at gmail.com>
wrote:

> For some strange reason, when using TEE with HLS output, in the master
> playlist, the codec information is missing.
>
> Anybody has any idea why ?
>
> I am using git version from 2 days ago ... ffmpeg version
> N-94345-g1123331f59
>
> Thanks
>
> On Sat, Jul 20, 2019 at 9:38 PM Viorel Dehelean <synologic at gmail.com>
> wrote:
>
> > So the final solution for this use case was to use:
> >
> > ./ffmpeg -ignore_unknown -async 1 -probesize 1M -analyzeduration 1000000
> \
> >     -i "udp://<udp stream>:1234?fifo_size=5000000&overrun_nonfatal=1"
> > -threads 0 -fflags +genpts \
> >     -filter_complex
> >
> "[0:v]yadif=0:-1:0[deinterlaced];[deinterlaced]split=4[v1][v2][v3][v4];[v1]copy[v1out];[v2]scale=w=1280:h=720:force_original_aspect_ratio=disable[v2scale];[v2scale]pad=width=1280:height=720:x=(ow-iw)/2:y=0:color=black[v2out];[v3]scale=w=800:h=450:force_original_aspect_ratio=disable[v3scale];[v3scale]pad=width=800:height=450:x=(ow-iw)/2:y=0:color=black[v3out];[v4]scale=w=480:h=270:force_original_aspect_ratio=disable[v4scale];[v4scale]pad=width=480:height=270:x=(ow-iw)/2:y=0:color=black[v4out]"
> > \
> >     -map [v1out] -x264opts:v:0 keyint=15:min-keyint=15:no-scenecut
> > -flags:v:0 +cgop -c:v:0 libx264 -profile:v:0 high -level 4.0 -preset
> > superfast -b:v:0 8000k -maxrate:v:0 10000k -minrate:v:0 4000k \
> >     -map [v2out] -x264opts:v:1 keyint=15:min-keyint=15:no-scenecut
> > -flags:v:1 +cgop -c:v:1 libx264 -profile:v:1 high -level 4.0 -preset
> > superfast -b:v:1 3000k -maxrate:v:1 3000k -minrate:v:1 1350k \
> >     -map [v3out] -x264opts:v:2 keyint=15:min-keyint=15:no-scenecut
> > -flags:v:2 +cgop -c:v:2 libx264 -profile:v:2 main -level 3.1 -preset
> > superfast -b:v:2 900k -maxrate:v:2 900k -minrate:v:2 450k \
> >     -map [v4out] -x264opts:v:3 keyint=15:min-keyint=15:no-scenecut
> > -flags:v:3 +cgop -c:v:3 libx264 -profile:v:3 baseline -level 3.0 -preset
> > superfast -b:v:3 450k -maxrate:v:3 450k -minrate:v:3 150k \
> >     -map a:0 -c:a:0 libfdk_aac -b:a:0 128k -metadata:s:a:0 language=ron \
> >     -map a:0 -c:a:1 libfdk_aac -b:a:1 128k -metadata:s:a:1 language=ron \
> >     -map a:0 -c:a:2 libfdk_aac -b:a:2 128k -metadata:s:a:2 language=ron \
> >     -map a:0 -c:a:3 libfdk_aac -b:a:3 128k -metadata:s:a:3 language=ron \
> >
> >
> "[select=\'v:0,v:1,v:2,v:3,a:0\':f=hls:onfail=ignore:var_stream_map=\'v:0,agroup:audio
> > v:1,agroup:audio v:2,agroup:audio v:3,agroup:audio
> >
> a:0,agroup:audio,language:ron,default:yes\':use_localtime=1:hls_allow_cache=0:hls_flags=discont_start+delete_segments+omit_endlist+second_level_segment_index+second_level_segment_size+second_level_segment_duration+program_date_time:\
> >
> >
> hls_start_number_source=datetime:hls_time=6:hls_list_size=10:hls_segment_filename=/origin/35f4574f4aed42d083de1087851f8712/%v_stream_%%04d_%%08s_%%013t.ts:master_pl_name=playlist.m3u8]/origin/35f4574f4aed42d083de1087851f8712/variant_%v_manifest.m3u8|\
> >
> >
> [select=\'v:0,v:1,v:2,v:3,a:0,a:1,a:2,a:3\':f=hls:var_stream_map=\'v:0,a:0
> > v:1,a:1 v:2,a:2
> >
> v:3,a:3\':use_localtime=1:hls_allow_cache=0:hls_flags=discont_start+temp_file+delete_segments+omit_endlist+second_level_segment_index+second_level_segment_size+second_level_segment_duration+program_date_time:\
> >
> >
> hls_start_number_source=datetime:hls_time=6:hls_list_size=10:hls_segment_filename=/origin/35f4574f4aed42d083de1087851f8712/mux/%v_stream2_%Y%m%d%H%M%S_%%04d_%%08s_%%013t.ts:master_pl_name=playlist2.m3u8]/origin/35f4574f4aed42d083de1087851f8712/mux/variant2_%v_manifest.m3u8"
> >
> > by adding select to the tee output, the first hls output is satisfied,
> and
> > the second just uses audio streams 0 thru 3
> >
> > Hope it helps somebody else too
> >
> > Thanks,
> > Viorel
> >
> > On Sat, Jul 20, 2019 at 12:20 AM Viorel Dehelean <synologic at gmail.com>
> > wrote:
> >
> >> Answering to myself, in my previous attempt, the second hls output
> >> expects a separate set of transcode process, hence the unable to map
> stream
> >> error.
> >>
> >> The better solution would be to use tee to send to multiple outputs,
> >> however the latest git seems to be suffering from this
> >> https://trac.ffmpeg.org/ticket/7907
> >>
> >> For my usecase, i need two ABR outputs, one with separate audio
> >> renditions (for the test case, just one) and one output with embedded
> audio.
> >> The problem i am facing now with the latest git is as follows, with one
> >> audio track encode process, the separate audio rendition output works
> well,
> >> however the second ABR which needs to embed audio onto 4 video variants,
> >> crashes with:
> >>
> >> [hls @ 0x55f35ecd1000] Same elementary stream found more than once in
> two
> >> different variant definitions #0 and #1
> >>
> >> which seems to indicate that it does not like to use the same audio
> >> stream into multiple variants, which led me to actually create 3 more
> audio
> >> encodes, as audio encoding is not that expensive CPU wise, but now the
> >> separate audio rendition output crashes with
> >>
> >> [hls @ 0x55b804de5300] Unable to find mapping variant stream
> >>
> >> which seems to indicate that the muxer has found some streams that are
> >> not used in that output. It would be nice to not crash here :)
> >>
> >> I will post a comment to 7907, however, maybe somebody has a better
> idea.
> >>
> >> Here's what i tried (with 4 audio encodes)
> >>
> >> ./ffmpeg -ignore_unknown -async 1 -probesize 1M -analyzeduration
> 1000000 \
> >>     -i "udp://<udp group>:1234?fifo_size=5000000&overrun_nonfatal=1"
> >> -threads 0 -fflags +genpts \
> >>     -filter_complex
> >>
> "[0:v]yadif=0:-1:0[deinterlaced];[deinterlaced]split=4[v1][v2][v3][v4];[v1]copy[v1out];[v2]scale=w=1280:h=720:force_original_aspect_ratio=disable[v2scale];[v2scale]pad=width=1280:height=720:x=(ow-iw)/2:y=0:color=black[v2out];[v3]scale=w=800:h=450:force_original_aspect_ratio=disable[v3scale];[v3scale]pad=width=800:height=450:x=(ow-iw)/2:y=0:color=black[v3out];[v4]scale=w=480:h=270:force_original_aspect_ratio=disable[v4scale];[v4scale]pad=width=480:height=270:x=(ow-iw)/2:y=0:color=black[v4out]"
> >> \
> >>     -map [v1out] -x264opts:v:0 keyint=15:min-keyint=15:no-scenecut
> >> -flags:v:0 +cgop -c:v:0 libx264 -profile:v:0 high -level 4.0 -preset
> >> superfast -b:v:0 8000k -maxrate:v:0 10000k -minrate:v:0 4000k \
> >>     -map [v2out] -x264opts:v:1 keyint=15:min-keyint=15:no-scenecut
> >> -flags:v:1 +cgop -c:v:1 libx264 -profile:v:1 high -level 4.0 -preset
> >> superfast -b:v:1 3000k -maxrate:v:1 3000k -minrate:v:1 1350k \
> >>     -map [v3out] -x264opts:v:2 keyint=15:min-keyint=15:no-scenecut
> >> -flags:v:2 +cgop -c:v:2 libx264 -profile:v:2 main -level 3.1 -preset
> >> superfast -b:v:2 900k -maxrate:v:2 900k -minrate:v:2 450k \
> >>     -map [v4out] -x264opts:v:3 keyint=15:min-keyint=15:no-scenecut
> >> -flags:v:3 +cgop -c:v:3 libx264 -profile:v:3 baseline -level 3.0 -preset
> >> superfast -b:v:3 450k -maxrate:v:3 450k -minrate:v:3 150k \
> >>     -map a:0 -c:a:0 libfdk_aac -b:a:0 128k -metadata:s:a:0 language=ron
> \
> >>     -map a:0 -c:a:1 libfdk_aac -b:a:1 128k -metadata:s:a:1 language=ron
> \
> >>     -map a:0 -c:a:2 libfdk_aac -b:a:2 128k -metadata:s:a:2 language=ron
> \
> >>     -map a:0 -c:a:3 libfdk_aac -b:a:3 128k -metadata:s:a:3 language=ron
> \
> >>     "[f=hls:onfail=ignore:var_stream_map=\'v:0,agroup:audio
> >> v:1,agroup:audio v:2,agroup:audio v:3,agroup:audio
> >>
> a:0,agroup:audio,language:ron,default:yes\':use_localtime=1:hls_allow_cache=0:hls_flags=discont_start+delete_segments+omit_endlist+second_level_segment_index+second_level_segment_size+second_level_segment_duration+program_date_time:\
> >>
> >>
> hls_start_number_source=datetime:hls_time=6:hls_list_size=10:hls_segment_filename=/origin/35f4574f4aed42d083de1087851f8712/%v_stream_%%04d_%%08s_%%013t.ts:master_pl_name=playlist.m3u8]/origin/35f4574f4aed42d083de1087851f8712/variant_%v_manifest.m3u8|\
> >>     [f=hls:var_stream_map=\'v:0,a:0 v:1,a:1 v:2,a:2
> >>
> v:3,a:3\':use_localtime=1:hls_allow_cache=0:hls_flags=discont_start+temp_file+delete_segments+omit_endlist+second_level_segment_index+second_level_segment_size+second_level_segment_duration+program_date_time:\
> >>
> >>
> hls_start_number_source=datetime:hls_time=6:hls_list_size=10:hls_segment_filename=/origin/35f4574f4aed42d083de1087851f8712/mux/%v_stream2_%Y%m%d%H%M%S_%%04d_%%08s_%%013t.ts:master_pl_name=playlist2.m3u8]/origin/35f4574f4aed42d083de1087851f8712/mux/variant2_%v_manifest.m3u8"
> >>
> >> Thanks,
> >> Viorel
> >>
> >>
> >> On Fri, Jul 19, 2019 at 9:50 PM Viorel Dehelean <synologic at gmail.com>
> >> wrote:
> >>
> >>> Slight different command line, i'm trying to produce 2 separate abr
> >>> streams with different stream map structures, as well as doing
> transcoding
> >>> but that should not be of any circumstance:
> >>>
> >>> ./ffmpeg -ignore_unknown -async 1 -probesize 1M -analyzeduration
> 1000000
> >>> \
> >>>     -i "udp://<udp group>:1234?fifo_size=5000000&overrun_nonfatal=1"
> >>> -threads 0 -fflags +genpts \
> >>>     -filter_complex
> >>>
> "[0:v]yadif=0:-1:0[deinterlaced];[deinterlaced]split=4[v1][v2][v3][v4];[v1]copy[v1out];[v2]scale=w=1280:h=720:force_original_aspect_ratio=disable[v2scale];[v2scale]pad=width=1280:height=720:x=(ow-iw)/2:y=0:color=black[v2out];[v3]scale=w=800:h=450:force_original_aspect_ratio=disable[v3scale];[v3scale]pad=width=800:height=450:x=(ow-iw)/2:y=0:color=black[v3out];[v4]scale=w=480:h=270:force_original_aspect_ratio=disable[v4scale];[v4scale]pad=width=480:height=270:x=(ow-iw)/2:y=0:color=black[v4out]"
> >>> \
> >>>     -map [v1out] -x264opts:v:0 keyint=15:min-keyint=15:no-scenecut
> >>> -flags:v:0 +cgop -c:v:0 libx264 -profile:v:0 high -level 4.0 -preset
> >>> superfast -b:v:0 8000k -maxrate:v:0 10000k -minrate:v:0 4000k \
> >>>     -map [v2out] -x264opts:v:1 keyint=15:min-keyint=15:no-scenecut
> >>> -flags:v:1 +cgop -c:v:1 libx264 -profile:v:1 high -level 4.0 -preset
> >>> superfast -b:v:1 3000k -maxrate:v:1 3000k -minrate:v:1 1350k \
> >>>     -map [v3out] -x264opts:v:2 keyint=15:min-keyint=15:no-scenecut
> >>> -flags:v:2 +cgop -c:v:2 libx264 -profile:v:2 main -level 3.1 -preset
> >>> superfast -b:v:2 900k -maxrate:v:2 900k -minrate:v:2 450k \
> >>>     -map [v4out] -x264opts:v:3 keyint=15:min-keyint=15:no-scenecut
> >>> -flags:v:3 +cgop -c:v:3 libx264 -profile:v:3 baseline -level 3.0
> -preset
> >>> superfast -b:v:3 450k -maxrate:v:3 450k -minrate:v:3 150k \
> >>>     -map a:0 -c:a:0 libfdk_aac -b:a:0 128k -metadata:s:a:0
> language=ron \
> >>>     -f hls \
> >>>     -var_stream_map "v:0,agroup:audio v:1,agroup:audio v:2,agroup:audio
> >>> v:3,agroup:audio
> a:0,agroup:audio,name:Romanian,language:ron,isdefault:yes"
> >>> \
> >>>     -use_localtime 1 -hls_allow_cache 0 -hls_flags
> >>>
> delete_segments+omit_endlist+second_level_segment_index+second_level_segment_size+second_level_segment_duration+program_date_time
> >>> \
> >>>     -hls_start_number_source datetime -hls_time 6 -hls_list_size 10
> >>> -hls_segment_filename
> >>>
> /origin/35f4574f4aed42d083de1087851f8712/%v_stream_%Y%m%d%H%M%S_%%04d_%%08s_%%013t.ts
> >>> \
> >>>     -master_pl_name playlist.m3u8
> >>> /origin/35f4574f4aed42d083de1087851f8712/variant_%v_manifest.m3u8 \
> >>>     -var_stream_map "v:0,a:0 v:1,a:0 v:2,a:0 v:3,a:0" \
> >>>     -use_localtime 1 -hls_allow_cache 0 -hls_flags
> >>>
> delete_segments+omit_endlist+second_level_segment_index+second_level_segment_size+second_level_segment_duration+program_date_time
> >>> \
> >>>     -hls_start_number_source datetime -hls_time 6 -hls_list_size 10
> >>> -hls_segment_filename
> >>>
> /origin/35f4574f4aed42d083de1087851f8712/mux/%v_stream2_%Y%m%d%H%M%S_%%04d_%%08s_%%013t.ts
> >>> \
> >>>     -master_pl_name playlist2.m3u8
> >>> /origin/35f4574f4aed42d083de1087851f8712/mux/variant2_%v_manifest.m3u8
> >>>
> >>>
> >>> and i'm getting:
> >>>
> >>>
> >>> [hls @ 0x561859fcf900] Unable to map stream at v:1
> >>> [hls @ 0x561859fcf900] Variant stream info update failed with status
> >>> ffffffea
> >>> Could not write header for output file #1 (incorrect codec parameters
> >>> ?): Invalid argument
> >>> Error initializing output stream 1:0 --
> >>>
> >>> On Fri, Jul 19, 2019 at 5:34 PM andrei ka <andrei.k.gml at gmail.com>
> >>> wrote:
> >>>
> >>>> oups, i had extra space in command line, actually it works fine with
> 2nd
> >>>> stream_map
> >>>> _______________________________________________
> >>>> ffmpeg-user mailing list
> >>>> ffmpeg-user at ffmpeg.org
> >>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-user
> >>>>
> >>>> To unsubscribe, visit link above, or email
> >>>> ffmpeg-user-request at ffmpeg.org with subject "unsubscribe".
> >>>
> >>>
> _______________________________________________
> ffmpeg-user mailing list
> ffmpeg-user at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-user
>
> To unsubscribe, visit link above, or email
> ffmpeg-user-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-user mailing list