prat67
prat67

Reputation: 3

Trying to change extension of filename on an ffmpeg script

(first time posting a question here)

So I'm looking to write a ffmmpeg script to automate encoding my files to VP9. The problem I'm having is when I try to strip the extension and add a new one.

For example Demo.mp4

Should change to Demo.webm

I'm running this on a Ubuntu-16.04 (Server Non-GI Version) I've tried a few different ways to accomplish this (using google and other posts on StackOverflow) but I can't seem to make it work

This is the error I keep getting..

line 31: Demo.mp4+.vp9: syntax error: invalid arithmetic operator (error token is ".mp4+.vp9")

I've also commented (in the code below) where the syntax error is pointing to..

#!/bin/bash

# Welcome Message

clear
printf "====================================\n"
printf "FFMPEG Encoder\n"
printf "(Using HDR-4k Profile)\n"
printf "====================================\n\n"
printf " Loading Files in Current Directory...\n\n"
sleep 3s


# Variables

i=1
ext=".webm"
vadd=4000000
vsub=2000000


# Iterate through files in current directory

for j in *.{mp4,mkv};
do
echo "$i.$j"
file[i]=$j
i=$(( i + 1 ))
done


# Select File & Bitrate

printf "Enter file number\n"
read fselect
printf "${file[$fselect]}: Selected for encoding\n\n"

printf "Enter Average Bitrate (Eg: 8000000)\n\n"
read bselect


# ***THIS IS WHERE THE PROBLEM IS***
# Prepare output file, strip trailing extension (eg .mkv) and add .webm

ftemp1="${file[$fselect]}"
ftemp2="${ftemp1::-4}"
fout="$(($ftemp2+$ext))"
printf "Output file will be: $fout"
printf "Preparing to encode..."
sleep 5s


# Encode with User-Defined Parameters

ffmpeg -y -report -i ${file[$fselect]} -b:v $bselect -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate "$(($bselect+$vadd))" -minrate "$(($bselect-$vsub))" \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
ffmpeg -y -report -i ${file[$fselect]} -b:v $bselect -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate "$(($bselect+$vadd))" -minrate "$(($bselect-$vsub))" \
  -profile:v 2 -vcodec libvpx-vp9 \
$fout

I'm certain there is a much cleaner way to do this - but I'm not expecting help with that :P

My suspicion is that I'm trying to add two different types of variables? But I thought I defined them as strings..I could be wrong

Please Help... lol

Upvotes: 0

Views: 135

Answers (1)

Poshi
Poshi

Reputation: 5762

You are trying to do arithmetic calculus ($((...))). But you just need to concatenate two strings:

fout="$ftemp2$ext"

BTW, you can simplify this transformation in three lines with a single line:

fout="${file[$fselect]/%.mp4/$ext}"

This works as a regular expression, where an .mp4 string found at the end (the % symbol) is repalced by the contents of $ext.

Upvotes: 1

Related Questions