Попытка изменить расширение имени файла в сценарии ffmpeg - PullRequest
0 голосов
/ 22 января 2019

(первый вопрос здесь)

Итак, я хочу написать скрипт ffmmpeg для автоматизации кодирования моих файлов в VP9. У меня проблема, когда я пытаюсь удалить расширение и добавить новое.

Например Demo.mp4

Должен измениться на Demo.webm

Я запускаю это на Ubuntu-16.04 (версия сервера без GI) Я пробовал несколько разных способов сделать это (используя Google и другие сообщения в StackOverflow), но я не могу заставить его работать

Это ошибка, которую я продолжаю получать ..

строка 31: Demo.mp4 + .vp9: синтаксическая ошибка: недопустимый арифметический оператор (маркер ошибки ".mp4 + .vp9")

Я также прокомментировал (в коде ниже), где синтаксическая ошибка указывает на ..

#!/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

Я уверен, что есть намного более чистый способ сделать это, но я не ожидаю помощи с этим: P

Я подозреваю, что я пытаюсь добавить два разных типа переменных? Но я думал, что определил их как строки .. Я могу ошибаться

Пожалуйста, помогите ... LOL

1 Ответ

0 голосов
/ 22 января 2019

Вы пытаетесь сделать арифметическое исчисление ($((...))). Но вам просто нужно объединить две строки:

fout="$ftemp2$ext"

Кстати, вы можете упростить это преобразование в три строки одной строкой:

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

Это работает как регулярное выражение, где строка .mp4, найденная в конце (символ %), заменяется содержимым $ext.

...