I wrote a bash
script that is generating command to encode video and create HLS playlist.
Here is the script. To make it short and clear, i fill variables with hard-coded values.
#!/bin/bash
# below variables are generated from some other script
basic="-hide_banner -y -i Sample.mp4 -profile:v main -crf 20 -sc_threshold 0 -g 50 -keyint_min 50 -hls_time 6"
renditions="-c:v:0 h264 -filter:v:0 scale=w=426:h=240:force_original_aspect_ratio=decrease -b:v:0 128k -maxrate:v:0 136k -bufsize:v:0 192k -c:v:1 h264 -filter:v:1 scale=w=640:h=360:force_original_aspect_ratio=decrease -b:v:1 256k -maxrate:v:1 273k -bufsize:v:1 384k -b:a 128k -c:a aac -ar 48000 -ac 2"
mapping="-map 0:v -map 0:v -map 0:a"
stream_map="-var_stream_map \"v:0,agroup:audio v:1,agroup:audio a:0,agroup:audio\""
hls="-hls_list_size 0 -f hls -hls_playlist_type vod -hls_segment_type mpegts -master_pl_name master.m3u8 -y %v_seg.m3u8"
# show final command
echo "Command:"
echo "ffmpeg ${basic} ${renditions} ${mapping} ${stream_map} ${hls}"
# execute command
ffmpeg ${basic} ${renditions} ${mapping} ${stream_map} ${hls}
Here is complete output from the script, along with the error it is giving.
[samtech@SAM tmp]$ ./hls-debug.sh
Command:
ffmpeg -hide_banner -y -i Sample.mp4 -profile:v main -crf 20 -sc_threshold 0 -g 50 -keyint_min 50 -hls_time 10 -c:v:0 h264 -filter:v:0 scale=w=426:h=240:force_original_aspect_ratio=decrease -b:v:0 128k -maxrate:v:0 136k -bufsize:v:0 192k -c:v:1 h264 -filter:v:1 scale=w=640:h=360:force_original_aspect_ratio=decrease -b:v:1 256k -maxrate:v:1 273k -bufsize:v:1 384k -b:a 128k -c:a aac -ar 48000 -ac 2 -map 0:v -map 0:v -map 0:a -var_stream_map "v:0,agroup:audio v:1,agroup:audio a:0,agroup:audio" -hls_list_size 0 -f hls -hls_playlist_type vod -hls_segment_type mpegts -master_pl_name master.m3u8 -y %v_seg.m3u8
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x562fabc34480] Could not find codec parameters for stream 0 (Video: h264 (avc1 / 0x31637661), none, 640x480, 997 kb/s): unspecified pixel format
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Sample.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf60.3.100
Duration: 00:00:31.00, start: 0.002000, bitrate: 1146 kb/s
Stream #0:0[0x1](und): Video: h264 (avc1 / 0x31637661), none, 640x480, 997 kb/s, SAR 1:1 DAR 4:3, 25 fps, 25 tbr, 12800 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 383 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
[NULL @ 0x562fabc69680] Unable to find a suitable output format for 'v:1,agroup:audio'
v:1,agroup:audio: Invalid argument
And here is output when i copy command and run in terminal
[samtech@SAM tmp]$ ffmpeg -hide_banner -y -i Sample.mp4 -profile:v main -crf 20 -sc_threshold 0 -g 50 -keyint_min 50 -hls_time 10 -c:v:0 h264 -filter:v:0 scale=w=426:h=240:force_original_aspect_ratio=decrease -b:v:0 128k -maxrate:v:0 136k -bufsize:v:0 192k -c:v:1 h264 -filter:v:1 scale=w=640:h=360:force_original_aspect_ratio=decrease -b:v:1 256k -maxrate:v:1 273k -bufsize:v:1 384k -b:a 128k -c:a aac -ar 48000 -ac 2 -map 0:v -map 0:v -map 0:a -var_stream_map "v:0,agroup:audio v:1,agroup:audio a:0,agroup:audio" -hls_list_size 0 -f hls -hls_playlist_type vod -hls_segment_type mpegts -master_pl_name master.m3u8 -y %v_seg.m3u8
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55eeed0c7500] Could not find codec parameters for stream 0 (Video: h264 (avc1 / 0x31637661), none, 640x480, 997 kb/s): unspecified pixel format
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Sample.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf60.3.100
Duration: 00:00:31.00, start: 0.002000, bitrate: 1146 kb/s
Stream #0:0[0x1](und): Video: h264 (avc1 / 0x31637661), none, 640x480, 997 kb/s, SAR 1:1 DAR 4:3, 25 fps, 25 tbr, 12800 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 383 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Stream #0:0 -> #0:1 (h264 (native) -> h264 (libx264))
Stream #0:1 -> #0:2 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[libx264 @ 0x55eeed0ff5c0] using SAR=1/1
[libx264 @ 0x55eeed0ff5c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x55eeed0ff5c0] profile Main, level 1.3, 4:2:0, 8-bit
[libx264 @ 0x55eeed0ff5c0] 264 - core 164 r3095 baee400 - H.264/MPEG-4 AVC codec - Copyleft 2003-2022 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=7 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=50 keyint_min=26 scenecut=0 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=20.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=136 vbv_bufsize=192 crf_max=0.0 nal_hrd=none filler=0 ip_ratio=1.40 aq=1:1.00
[libx264 @ 0x55eeed106f40] using SAR=1/1
[libx264 @ 0x55eeed106f40] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x55eeed106f40] profile Main, level 2.1, 4:2:0, 8-bit
[libx264 @ 0x55eeed106f40] 264 - core 164 r3095 baee400 - H.264/MPEG-4 AVC codec - Copyleft 2003-2022 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=11 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=50 keyint_min=26 scenecut=0 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=20.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=273 vbv_bufsize=384 crf_max=0.0 nal_hrd=none filler=0 ip_ratio=1.40 aq=1:1.00
[mpegts @ 0x55eef094a180] frame size not set
Output #0, hls, to '%v_seg.m3u8':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf60.3.100
Stream #0:0(und): Video: h264, yuv420p(tv, progressive), 320x240 [SAR 1:1 DAR 4:3], q=2-31, 128 kb/s, 25 fps, 90k tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc60.3.100 libx264
Side data:
cpb: bitrate max/min/avg: 136000/0/128000 buffer size: 192000 vbv_delay: N/A
Stream #0:1(und): Video: h264, yuv420p(tv, progressive), 480x360 [SAR 1:1 DAR 4:3], q=2-31, 256 kb/s, 25 fps, 90k tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc60.3.100 libx264
Side data:
cpb: bitrate max/min/avg: 273000/0/256000 buffer size: 384000 vbv_delay: N/A
Stream #0:2(und): Audio: aac (LC), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
encoder : Lavc60.3.100 aac
[hls @ 0x55eeed0fc700] Opening '0_seg0.ts' for writing10.98 bitrate=N/A dup=370 drop=0 speed=11.2x
[hls @ 0x55eeed0fc700] Opening '1_seg0.ts' for writing
[hls @ 0x55eeed0fc700] Opening '2_seg0.ts' for writing
[hls @ 0x55eeed0fc700] Opening '0_seg1.ts' for writing17.53 bitrate=N/A dup=370 drop=0 speed=11.8x
[hls @ 0x55eeed0fc700] Opening '1_seg1.ts' for writing
[hls @ 0x55eeed0fc700] Opening '2_seg1.ts' for writing
[hls @ 0x55eeed0fc700] Opening '0_seg2.ts' for writing28.75 bitrate=N/A dup=370 drop=0 speed=11.6x
[hls @ 0x55eeed0fc700] Opening '1_seg2.ts' for writing
[hls @ 0x55eeed0fc700] Opening '2_seg2.ts' for writing
[hls @ 0x55eeed0fc700] Opening '0_seg3.ts' for writing
[hls @ 0x55eeed0fc700] Opening '0_seg.m3u8' for writing
[hls @ 0x55eeed0fc700] Opening '1_seg3.ts' for writing
[hls @ 0x55eeed0fc700] Opening '1_seg.m3u8' for writing
[hls @ 0x55eeed0fc700] Opening '2_seg3.ts' for writing
[hls @ 0x55eeed0fc700] Opening '2_seg.m3u8' for writing
[hls @ 0x55eeed0fc700] Opening 'master.m3u8' for writing
frame= 775 fps=264 q=-1.0 Lq=-1.0 size=N/A time=00:00:30.97 bitrate=N/A dup=370 drop=0 speed=10.6x
video:1227kB audio:489kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
[libx264 @ 0x55eeed0ff5c0] frame I:16 Avg QP:17.53 size: 9672
[libx264 @ 0x55eeed0ff5c0] frame P:328 Avg QP:20.42 size: 690
[libx264 @ 0x55eeed0ff5c0] frame B:431 Avg QP:18.51 size: 125
[libx264 @ 0x55eeed0ff5c0] consecutive B-frames: 20.6% 13.2% 7.4% 58.8%
[libx264 @ 0x55eeed0ff5c0] mb I I16..4: 33.1% 0.0% 66.9%
[libx264 @ 0x55eeed0ff5c0] mb P I16..4: 0.8% 0.0% 2.4% P16..4: 15.3% 7.5% 4.3% 0.0% 0.0% skip:69.7%
[libx264 @ 0x55eeed0ff5c0] mb B I16..4: 0.1% 0.0% 0.0% B16..8: 10.8% 1.7% 0.4% direct: 0.4% skip:86.6% L0:40.4% L1:51.0% BI: 8.7%
[libx264 @ 0x55eeed0ff5c0] coded y,uvDC,uvAC intra: 70.8% 80.4% 61.6% inter: 3.8% 4.7% 0.5%
[libx264 @ 0x55eeed0ff5c0] i16 v,h,dc,p: 17% 39% 23% 21%
[libx264 @ 0x55eeed0ff5c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 26% 18% 7% 7% 6% 7% 6% 7%
[libx264 @ 0x55eeed0ff5c0] i8c dc,h,v,p: 44% 31% 14% 11%
[libx264 @ 0x55eeed0ff5c0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x55eeed0ff5c0] ref P L0: 73.7% 16.3% 7.4% 2.6%
[libx264 @ 0x55eeed0ff5c0] ref B L0: 94.3% 4.9% 0.9%
[libx264 @ 0x55eeed0ff5c0] ref B L1: 98.3% 1.7%
[libx264 @ 0x55eeed0ff5c0] kb/s:112.27
[libx264 @ 0x55eeed106f40] frame I:16 Avg QP:15.14 size: 18394
[libx264 @ 0x55eeed106f40] frame P:260 Avg QP:19.00 size: 1507
[libx264 @ 0x55eeed106f40] frame B:499 Avg QP:18.80 size: 269
[libx264 @ 0x55eeed106f40] consecutive B-frames: 9.7% 11.4% 6.2% 72.8%
[libx264 @ 0x55eeed106f40] mb I I16..4: 36.5% 0.0% 63.5%
[libx264 @ 0x55eeed106f40] mb P I16..4: 1.2% 0.0% 3.1% P16..4: 15.5% 7.1% 3.2% 0.0% 0.0% skip:69.9%
[libx264 @ 0x55eeed106f40] mb B I16..4: 0.1% 0.0% 0.1% B16..8: 11.4% 1.6% 0.3% direct: 0.4% skip:86.2% L0:39.1% L1:53.5% BI: 7.4%
[libx264 @ 0x55eeed106f40] coded y,uvDC,uvAC intra: 65.1% 75.8% 54.1% inter: 3.1% 4.5% 0.3%
[libx264 @ 0x55eeed106f40] i16 v,h,dc,p: 35% 27% 12% 26%
[libx264 @ 0x55eeed106f40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 18% 25% 15% 7% 8% 7% 8% 6% 6%
[libx264 @ 0x55eeed106f40] i8c dc,h,v,p: 46% 29% 14% 11%
[libx264 @ 0x55eeed106f40] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x55eeed106f40] ref P L0: 71.6% 15.9% 8.6% 3.9%
[libx264 @ 0x55eeed106f40] ref B L0: 93.9% 4.6% 1.5%
[libx264 @ 0x55eeed106f40] ref B L1: 98.3% 1.7%
[libx264 @ 0x55eeed106f40] kb/s:211.68
[aac @ 0x55eeed1009c0] Qavg: 401.380
What the wrong is going with that script ?
I am pulling my hairs from last few hours because of it, anyone help please.
You should save arguments in arrays and then let the array contents expand inside double quotes rather than save the arguments in scalars and then use those scalars unquoted.
Try this:
#!/usr/bin/env bash
# below variables are generated from some other script
basic=( -hide_banner -y -i Sample.mp4 -profile:v main -crf 20 -sc_threshold 0 -g 50 -keyint_min 50 -hls_time 6 )
renditions=( -c:v:0 h264 -filter:v:0 scale=w=426:h=240:force_original_aspect_ratio=decrease -b:v:0 128k -maxrate:v:0 136k -bufsize:v:0 192k -c:v:1 h264 -filter:v:1 scale=w=640:h=360:force_original_aspect_ratio=decrease -b:v:1 256k -maxrate:v:1 273k -bufsize:v:1 384k -b:a 128k -c:a aac -ar 48000 -ac 2 )
mapping=( -map 0:v -map 0:v -map 0:a )
stream_map=( -var_stream_map 'v:0,agroup:audio v:1,agroup:audio a:0,agroup:audio' )
hls=( -hls_list_size 0 -f hls -hls_playlist_type vod -hls_segment_type mpegts -master_pl_name master.m3u8 -y %v_seg.m3u8 )
# show final command
echo "Command:"
echo ffmpeg "${basic[@]}" "${renditions[@]}" "${mapping[@]}" "${stream_map[@]}" "${hls[@]}"
# execute command
ffmpeg "${basic[@]}" "${renditions[@]}" "${mapping[@]}" "${stream_map[@]}" "${hls[@]}"