1

I am building an an application using ffmpeg. In which I need to subtract start time of two files(there are only two files as input). following is my code.

#!/bin/bash
mkvarray=()
mkvarray_name=()
for video_name in *.mkv; do
output=$(ffprobe -v error -show_entries format=start_time -of default=noprint_wrappers=1:nokey=1 "$video_name")
mkvarray+=($output)
mkvarray_name+=("$video_name")
done 

arraylength=${#mkvarray[@]}
for (( i=0; i<${arraylength}; i++ ));
do
  echo ${mkvarray_name[$i-1]} "------>  " ${mkvarray[$i-1]}
done

max_number=0
if [[ ${mkvarray[0]} < ${mkvarray[1]} ]]; then
  echo "first-------------"

  max_number = ${mkvarray[0]} - ${mkvarray[1]}
  echo "first " $max_number
else
   echo "second-------------"
   max_number = ${mkvarray[0]} - ${mkvarray[1]}
   echo "second " $max_number
fi

echo $max_number

OUTPUT

$ ./ffmpeg_updated.bash RTda01986c816052106c00f417387a83ff.mkv ------> 2.040000 cc.mkv ------> 2.040000 RT4bafb05e1b36885c75d7d67a16f5e3b2.mkv ------> 4.086000 first------------- ./ffmpeg_updated.bash: line 24: max_number: command not found first 0 0

from this I understood that, floating point arithmetic is not possible. So Is there any suggestion to proceed from this. I am pretty much new to bash. Or is there any alternative way to get things done in ffmpeg?

arjuncc
  • 3,227
  • 5
  • 42
  • 77
  • 2
    As mentioned in the top answer in the question you linked to you could always use `bc` to perform the calculations. – llogan Oct 02 '17 at 18:55
  • Yes, You are correct there is no other way. I have used bc – arjuncc Nov 14 '17 at 08:33
  • A better answer can be found in the following link https://stackoverflow.com/questions/46770820/merge-conference-video-and-audio-call-output-using-hstack-ffmpeg – arjuncc Jan 30 '18 at 06:53

1 Answers1

1

UPDATE a better answer can be found in the following link Merge Conference Video and Audio call output using hstack ffmpeg


As mentioned in the linked question. There is no way to do floating point arithmetic via bash directly. we have to use bc. Updated code is given below.

VIDEO MERGER

    #!/bin/bash
    echo "VIDEO MERGER"
    echo "------------"
    echo "VIDEO MERGER: started"
    mkvarray=()
    mkvarray_name=()
    #ASSIGN VIDEO START TIME TO VARIBALES
    for video_name in *.mkv; do
    start_time=$(ffprobe -v error -show_entries format=start_time -of default=noprint_wrappers=1:nokey=1 "$video_name")
    mkvarray+=($start_time)
    mkvarray_name+=("$video_name")
    done 
    #PRINT START TIME OF VIDEO FILES (FOR DEBUG)
    #arraylength=${#mkvarray[@]}
    #for (( i=0; i<${arraylength}; i++ ));
    #do
    #  echo $i ${mkvarray_name[$i]} "------>  " ${mkvarray[$i]}
    #done

    #echo "----->" ${mkvarray_name[0]} ${mkvarray[0]}
    #echo "----->" ${mkvarray_name[1]} ${mkvarray[1]}

    #GETTING THE START TIME 
    RESULT=$(echo "scale=5; (${mkvarray[0]} - ${mkvarray[1]})" | tr -d $'\r' | bc -l)
    updated_result=0
    #check which file is  
    if (( $(echo "$RESULT < 0" |bc -l) )); then
    updated_result=$(echo "$RESULT * -1" |bc -l)
    else 
    updated_result=$RESULT
    fi

    #IDENTIFY THE FIRST FILE AND SECOND FILE IN ORDER OF START TIME
    if (( $(echo "(${mkvarray[0]} > ${mkvarray[1]})" | tr -d $'\r' |bc -l) )); then #do
    second_file=${mkvarray_name[0]}
    first_file=${mkvarray_name[1]}
    echo "FIRST FILE : " ${mkvarray_name[1]} ", TIME :" ${mkvarray[1]}
    echo "SECOND FILE : " ${mkvarray_name[0]} ", TIME :" ${mkvarray[0]}
    else
    second_file=${mkvarray_name[1]}
    first_file=${mkvarray_name[0]}
    echo "FIRST FILE : " ${mkvarray_name[0]} ", TIME :" ${mkvarray[0]}
    echo "SECOND FILE : " ${mkvarray_name[1]} ", TIME :" ${mkvarray[1]}
    fi
    echo "TIME DIFERENCE :" $updated_result

    ffmpeg -i $first_file -itsoffset $updated_result -i $second_file -filter_complex "[0]pad=iw*2:ih[int]; [int][1]overlay=W/2:0[vid]" -map [vid] -c:v libvpx -crf 23 -quality good -cpu-used 3 -an output_video.webm
    echo "VIDEO MERGER: finished"
 AUDIO MERGER
#!/bin/bash
echo "AUDIO MERGER"
echo "------------"
echo "AUDIO MERGER : started"
mkvarray=()
mkvarray_name=()
#ASSIGN VIDEO START TIME TO VARIBALES
for video_name in *.mka; do
start_time=$(ffprobe -v error -show_entries format=start_time -of default=noprint_wrappers=1:nokey=1 "$video_name")
mkvarray+=($start_time)
mkvarray_name+=("$video_name")
done 
#PRINT START TIME OF VIDEO FILES (FOR DEBUG)
#arraylength=${#mkvarray[@]}
#for (( i=0; i<${arraylength}; i++ ));
#do
#  echo $i ${mkvarray_name[$i]} "------>  " ${mkvarray[$i]}
#done

#echo "----->" ${mkvarray_name[0]} ${mkvarray[0]}
#echo "----->" ${mkvarray_name[1]} ${mkvarray[1]}

#GETTING THE START TIME 
RESULT=$(echo "scale=5; (${mkvarray[0]} - ${mkvarray[1]})" | tr -d $'\r' | bc -l)
updated_result=0
#check which file is  
if (( $(echo "$RESULT < 0" |bc -l) )); then
updated_result=$(echo "$RESULT * -1 * 1000" |bc -l)
else 
updated_result=$(echo "$RESULT * 1000" |bc -l)
fi

#IDENTIFY THE FIRST FILE AND SECOND FILE IN ORDER OF START TIME
if (( $(echo "(${mkvarray[0]} > ${mkvarray[1]})" | tr -d $'\r' |bc -l) )); then #do
second_file=${mkvarray_name[0]}
first_file=${mkvarray_name[1]}
echo "FIRST FILE : " ${mkvarray_name[1]} ", TIME :" ${mkvarray[1]}
echo "SECOND FILE : " ${mkvarray_name[0]} ", TIME :" ${mkvarray[0]}
else
second_file=${mkvarray_name[1]}
first_file=${mkvarray_name[0]}
echo "FIRST FILE : " ${mkvarray_name[0]} ", TIME :" ${mkvarray[0]}
echo "SECOND FILE : " ${mkvarray_name[1]} ", TIME :" ${mkvarray[1]}
fi
echo "TIME DIFERENCE :" $updated_result

ffmpeg -i $first_file -i $second_file -filter_complex "[1]adelay="$updated_result"|"$updated_result"[d];[0][d]amix=inputs=2" -strict -2 output_audio.webm
echo "AUDIO MERGER : finished"
MERGE AUDIO & VIDEO
#!/bin/bash
echo "AUDIO/VIDEO OUTPUT MERGER"
echo "-------------------------"
echo "AUDIO/VIDEO OUTPUT MERGER : started merging audio and video"
ffmpeg -i output_video.webm -i output_audio.webm -c:v copy -c:a copy full.webm
echo "AUDIO/VIDEO OUTPUT MERGER : finished merging audio and video"
arjuncc
  • 3,227
  • 5
  • 42
  • 77