Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Скрипт конвертации из MP4 в AVI  (Прочитано 1737 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн egorchik007

  • Автор темы
  • Участник
  • *
  • Сообщений: 156
    • Просмотр профиля
Скрипт конвертации из MP4 в AVI
« : 27 Мая 2012, 17:57:21 »
Имеется папка, в ней куча подпапок, в них файлы .mp4.
Команда для конвертации - ffmpeg -i file.mp4 -vcodec mpeg4 -acodec ac3 -ar 48000 -ab 192k output.avi

Задача - шелл-скрипт, который в текущей папке все файлы сконвертит и положит в ./converted/[имя_файла].avi.
Как это сделать?
Понимаю, что нужны переменные. Но не знаю как пройтись по всем файлам.
Спасибо за помощь!

Пользователь решил продолжить мысль 27 Мая 2012, 18:11:42:
Пробовал:
#!/bin/bash

for fname in *.mp4
do
  ffmpeg -i $fname -vcodec mpeg4 -acodec ac3 -ar 48000 -ab 192k `printf "%s.mp4" $fname`
done

но:
01.: Invalid data found when processing input


Пользователь решил продолжить мысль 27 Мая 2012, 18:16:56:
ЗЫ: в именах файлов есть пробелы, что грустно  :-\

Пользователь решил продолжить мысль 27 Мая 2012, 19:03:06:
убрал пробелы:
ls | while read f; do mv "$f" "${f// /_}";done сконвертил:
for i in `ls`;do ffmpeg -i $i -vcodec mpeg4 -acodec ac3 -ar 48000 -ab 192k `printf "converted/%s.avi" $i`; done
всем спасибо!
« Последнее редактирование: 27 Мая 2012, 19:03:06 от egorchik007 »

Оффлайн Artif

  • Участник
  • *
  • Сообщений: 207
    • Просмотр профиля
Re: Скрипт конвертации из MP4 в AVI
« Ответ #1 : 28 Мая 2012, 13:58:12 »
Вот обходчик каталога, костяк нужного, достающий имена, в т.ч. имя для подкаталога с конвертированными:

#!/bin/bash

targetDir="${1}" # из командной строки, первый аргумент
extensionToBeProcessed="mp4" # или ${2}, второй аргумент ...

if [ ! -d "${targetDir}" ] ; then
    echo "Not found directory '${targetDir}'." >&2
    exit 1
fi

while read foundFileName ; do
    [ -z "${foundFileName}" ] && continue

    shortInFileName="$( basename "${foundFileName}" )"
    filePath="$( dirname "${foundFileName}" )"
       
    [ "${filePath}" == "." ] && filePath="$( pwd )"
    [ "${filePath}" == "~" ] && filePath="${HOME}"
   
    outFileNameId="$(sed "s/\.${extensionToBeProcessed}//" <<< "${shortInFileName}" )"
    # Более короткие, но более быстрые варианты:
    #outFileNameId="${foundFileName/\.${extensionToBeProcessed}/}"
    #outFileNameId="${foundFileName%\.*}"
    #outFileNameId="${foundFileName%\.mp4}"
    # При усложнении выражений может понадобится _предварительный_ вызов
    #shopt -s extglob

   
    echo "================================"
    echo "Found file:   ${foundFileName}"
    echo "Dir:          ${filePath}"
    echo "Short name:   ${shortInFileName}"
    echo "Striped name: ${outFileNameId}"
done <<< "$( find "${targetDir}" -mindepth 1 -maxdepth 1 -type f -name "*.${extensionToBeProcessed}" )"


Надо бы убрать зависимость от регистра в расширении имени файла.
В данном конкретном случае "лечение" имени каталога в filePath должно бы быть в самом начале, и за пределами цикла, что ускоряет выполнение скрипта.
« Последнее редактирование: 28 Мая 2012, 17:40:56 от Artif »

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.