Markus Feußner
Markus Feußner

Reputation: 1

ffmpeg: No such file error when building command from arrays via bash

I am trying to integrate all my srt files into the mkv containers.

For that I wrote a script, which gets an mkv file (from another script) as $1, looks for srt files in the same directory (with the same basename as the videofile) and then builds an ffmpeg command.

The script (I know there is no security - for now I need to get it working...):

filename="$1"
medianame=${filename//'.mkv'/}
searchpattern=${medianame}\*
directory="$(dirname "${filename}")"
regex=".*\.(\w{2})(\.srt)$"

declare -A langcode
langcode[de]=ger
langcode[en]=eng
langcode[nl]=nld
langcode[ro]=ron

mapcount=0
args_subfiles=()
args_map=()
args_meta=()

while read line 
do
  if [[ $line =~ $regex ]]
  then
    mapcount=$((mapcount+1))
    args_map+=("-map ${mapcount}:s" )
    medianame=${filename//'.mkv'/}
    args_subfiles+=( ' -i '"$line" )
    lang=${BASH_REMATCH[1]}
    echo $lang
    args_meta+=('-metadata:s:s:'$mapcount' language='${langcode[$lang]} )
  fi

done <<< "$(find "$directory" -wholename "$searchpattern")"
echo "${args_subfiles[@]}"
echo "${args_map[@]}"
echo "${args_meta[@]}"

# subarg=$(echo "${args_subfiles[@]}")
ffmpeg -i "$filename" "${args_subfiles[@]}" -map 0 ${args_map[@]} -c copy ${args_meta[@]} "$out"

The ffmpeg output:

    ffmpeg version 5.0 Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 11 (GCC)
  configuration: --prefix=/root/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/root/ffmpeg_build/include --extra-ldflags=-L/root/ffmpeg_build/lib --extra-libs=-lpthread --extra-libs=-lm --bindir=/root/bin --enable-gpl --enable-libfdk_aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libx264 --enable-cuda-nvcc --enable-cuvid --enable-nvenc --enable-libass --enable-opencl --cpu=native --enable-openssl --extra-libs='-lpthread -lm -lz' --enable-nonfree
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Input #0, matroska,webm, from '/media/tv/La Brea/Season 1/La.Brea.S01E05.mkv':
  Metadata:
    encoder         : libebml v1.4.2 + libmatroska v1.6.4
    creation_time   : 2021-10-27T04:01:38.000000Z
  Duration: 00:43:02.59, start: 0.000000, bitrate: 7750 kb/s
  Stream #0:0(eng): Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn (default)
    Metadata:
      BPS             : 7107896
      DURATION        : 00:43:02.580000000
      NUMBER_OF_FRAMES: 61920
      NUMBER_OF_BYTES : 2294588959
      _STATISTICS_WRITING_APP: mkvmerge v62.0.0 ('Apollo') 64-bit
      _STATISTICS_WRITING_DATE_UTC: 2021-10-27 04:01:38
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:1(eng): Audio: eac3, 48000 Hz, 5.1(side), fltp, 640 kb/s (default)
    Metadata:
      BPS             : 640000
      DURATION        : 00:43:02.592000000
      NUMBER_OF_FRAMES: 80706
      NUMBER_OF_BYTES : 206607360
      _STATISTICS_WRITING_APP: mkvmerge v62.0.0 ('Apollo') 64-bit
      _STATISTICS_WRITING_DATE_UTC: 2021-10-27 04:01:38
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:2(eng): Subtitle: subrip
    Metadata:
      title           : English
      BPS             : 72
      DURATION        : 00:42:33.899000000
      NUMBER_OF_FRAMES: 800
      NUMBER_OF_BYTES : 23018
      _STATISTICS_WRITING_APP: mkvmerge v62.0.0 ('Apollo') 64-bit
      _STATISTICS_WRITING_DATE_UTC: 2021-10-27 04:01:38
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 -i /media/tv/La Brea/Season 1/La.Brea.S01E05.nl.srt: No such file or directory

Upvotes: 0

Views: 141

Answers (1)

tshiono
tshiono

Reputation: 22012

In the line:

args_subfiles+=( ' -i '"$line" )

it appends an array element which looks something like: ' -i file.srt'. Then the element is passed to ffmpeg as a single string -i file.srt, not the -i option followed by file.srt. Instead please modify the line as:

args_subfiles+=( '-i' "$line" )

then the commad line options are passed to ffmpeg properly. (Please note the whitespace in between. Two individual elements are appended to the array.)

Upvotes: 1

Related Questions