Search code examples
bashshellffmpeg

ffmpeg command not working from bash script but working from command line


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.


Solution

  • 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[@]}"