FFmpeg in a bash script ( quotes ) -
i'm working on script open text file ffmpeg commands. ( 10 command generated other project ) each command working when copy paste terminal manually, when script run, simple commands work stuck on " no such filter : ..." error.
here command : -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -i 5.mp4 -i 6.mp4 -filter_complex '[0:0][0:1][1:0][1:1][2:0][2:1][3:0][3:1][4:0][4:1][5:0][5:1]concat=n=6:v=1:a=1:unsafe=1 [v] [a]' -map '[v]' -map '[a]' -aspect 16:9 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -y track_0.mp4
i think problem in " ' " try escape them " \' " ffmpeg telling me no such filter: '''
here script assuming variable args set dynamically ( example have set manually ) :
#!/bin/bash args="-i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -i 5.mp4 -i 6.mp4 -filter_complex '[0:0][0:1][1:0][1:1][2:0][2:1][3:0][3:1][4:0][4:1][5:0][5:1]concat=n=6:v=1:a=1:unsafe=1 [v] [a]' -map '[v]' -map '[a]' -aspect 16:9 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -y track_0.mp4" ffmpeg ${args} edit 1:
well forgot precise text file :
-loop 1 -f image2 -c:v png -i file_0.data -i sample.wav -map 0:v -map 1:a -t 20 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -pix_fmt yuv420p -y 4.mp4 -loop 1 -f image2 -c:v png -i black.png -i sample.wav -map 0:v -map 1:a -t 14 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -pix_fmt yuv420p -y 5.mp4 -loop 1 -f image2 -c:v png -i file_1.data -i sample.wav -map 0:v -map 1:a -t 20 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -pix_fmt yuv420p -y 6.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -i 5.mp4 -i 6.mp4 -filter_complex '[0:0][0:1][1:0][1:1][2:0][2:1][3:0][3:1][4:0][4:1][5:0][5:1]concat=n=6:v=1:a=1:unsafe=1 [v] [a]' -map '[v]' -map '[a]' -aspect 16:9 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -y track_0.mp4 and in file read each line , pass line ffmpeg process want
can me ?
well, let's have look:
$ shellcheck yourscript args="-i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -i 5.mp4 -i 6.mp4 -filter_complex '[0:0][0:1][1:0][1:1][2:0][2:1][3:0][3:1][4:0][4:1][5:0][5:1]concat=n=6:v=1:a=1:unsafe=1 [v] [a]' -map '[v]' -map '[a]' -aspect 16:9 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -y track_0.mp4" ^-- sc2089: quotes/backslashes treated literally. use array. in yourscript line 3: ffmpeg ${args} ^-- sc2090: quotes/backslashes in variable not respected. as suggested, let's use array:
#!/bin/bash args=( -i "1.mp4" -i "2.mp4" ... -filter_complex '[0:0][0:1][1:0][1:1][2:0][2:1][3:0][3:1][4:0][4:1][5:0][5:1]concat=n=6:v=1:a=1:unsafe=1 [v] [a]' -map '[v]' -map '[a]' -aspect 16:9 .... ) ffmpeg "${args[@]}" obviously works equally if build array dynamically, e.g.
args=() f in 1.mp4 2.mp4 args+=(-i "$f") done ... to explain why works, here's expected happen:
- bash sees
ffmpeg $args - bash substitutes variable, giving
ffmpeg -i 'my arg' bash interprets new command, giving argument list
ffmpeg,-i,my argbash runs
ffmpegthese 2 arguments
this happens:
- bash sees
ffmpeg $args bash interprets , splits arguments
ffmpeg$argsbash sees 1 of arguments unquoted variable, splits value of variable on spaces , puts each word separate argument:
ffmpeg,-i,'my,file'bash runs ffmpeg these three arguments, contain garbage single quotes.
Comments
Post a Comment