Участники прошу помощи и совета.
Я новичок. Делаю первые шаги.
Вопрос вот в чем:
Автоматизирую сортировку и перегонку видеофайлов со своей зеркалки.
Фотоаппарат видео пишет в формате MTS(AVCHD)
Сделал при подключении автоматическое монтирование и копирование файлов с SD карты в каталог /home/user/tmp при этом файлы .*MTS копируются в /home/user/tmp/video
Файлы имеют имена 00000.MTS 00001.MTS ...... и т.д.
Нужен скрипт который ищет *.MTS в директории /home/user/tmp/video, преобразует файлы в avi, склеивает их по дате создания (за день), полученный avi файл должен иметь имя типа 14июнь2012.avi и храниться в папке /home/user/video
Скрипт думается мне не сложный
Посмотрел как люди сортируют фотки переделать под свои нужды
получилось вот что:
text
#!/bin/bash
SOURCE=/home/user/tmp # исходная папка
TARGET=/home/user/video # папка для копирования
find $SOURCE -iname "*.MTS" | while read FILE ; do
DIR=$(ls -lR "$FILE" | awk '{print $7"-"$6"-"$8}') ;
test -d $TARGET/$DIR ||
mkdir $TARGET/$DIR ;
Результат скрипта создается одна директория например /home/user/video/17мая2012 и туда ложатся перекодированные файлы вида 17мая2012-00001.avi
Я так понимаю у меня в цикле где-то косяк и он считывает дату с первого файла и всем ее подставляет. Склейки тут нет.
Еще посмотрел как люди в одной папке сразу преобразуют в avi а затем их склеивают одной командой
Вот команда:
for invideo in `find -name ‘*.MTS’`; do ffmpeg -i $invideo -deinterlace -target pal-dvd Converted/${invideo%%.MTS}.avi; done; mencoder -ovc copy -oac copy -o Converted/outvideo.avi Converted/*.avi
Несколько дней мытарств ни к чему меня не привели. Никак ума не приложу как как это все объединить в один скрипт.
ключ -R тут излишен.
+ как вариант, можно state и date'ом отформатировать дату - красивее будет.
"neonii" написал:
test -d $TARGET/$DIR ||
mkdir $TARGET/$DIR ;
вместо этого лучше просто mkdir -p $TARGET/$DIR
"neonii" написал:
Результат скрипта создается одна директория например /home/user/video/17мая2012 и туда ложатся перекодированные файлы вида 17мая2012-00001.avi
проверьте сами, ручками, какое время стоит на файлах в ls -l /home/user/tmp
и ещё не хватает done после первого цикла... может я его случайно подтёр, когда малость отформатировал код.
да и второй цикл вообще не нужен...
в итоге должно получиться что-то вроде этого:
text
#!/bin/bash
SOURCE=/home/user/tmp # исходная папка
TARGET=/home/user/video # папка для копирования
for invideo in `find -name ‘*.MTS’`; do ffmpeg -i $invideo -deinterlace -target pal-dvd Converted/${invideo%%.MTS}.avi; done; mencoder -ovc copy -oac copy -o Converted/outvideo.avi Converted/*.avi
Эта строка содержит несколько идущих подряд команд:
1) for invideo in `find -name ‘*.MTS’`; (находим в папке все файлы с расширением MTS)
2) do ffmpeg -i $invideo -deinterlace -target pal-dvd Converted/${invideo%%.MTS}.avi; (поочердно, конвертируем найденые файлы в формат “avi” и сохраняем в папкe “Converted” с прежним названием но с расширением “avi”)
3) done; (завершаем цикл конвертирования файлов из “MTS” (”AVCHD”) в “AVI”)
4) mencoder -ovc copy -oac copy -o Converted/outvideo.avi Converted/*.avi (исользуя “mencoder” в папке “Converted” склеиваем все файлы с расширением “avi” в новый файл “outvideo.avi”)
то есть объединить все видео файлы созданные в один день в один фильм.avi
ls для людей делался, а не для машин... если год текущий, то указывается время...
"neonii" написал:
как можно этим воспользоваться?
как-то так: date -d "$(stat -c=%z 1.c)" "+%Y-%m-%d" man date для того как форматная строка записывается...
ещё можно было бы выдрать из метаданных самого видео информацию, но это уже другая история...
остальное - попозже... там надо /dev/brain включать...
[added]
"neonii" написал:
И далее как заменить в скрипте вот это
ну собственно первая часть - просто перекодировка... тоже самое, что и в первом случае... только параметры другие, но в видео и кодеках я уже не разбираюсь...
а вторая часть - слияние. т.е. в конец просто ещё один цикл добавить надо:
text
find "$TARGET" -maxdepth 1 | while read DIR ; do
mencoder -ovc copy -oac copy -o "$TARGET/$DIR.avi" $TARGET/$DIR/*.avi)
done
Exiting...
MEncoder SVN-r34707-4.6.1 (C) 2000-2012 MPlayer Team
File not found: '/home/user/video//home/user/video/17-мая-2011/*.avi'
Failed to open /home/user/video//home/user/video/17-мая-2011/*.avi.
Cannot open file/device.
, а то сегодняшним днем дату пробивало (может при копировании меняется, хотя в начале вроде нормально было, потом косяк вылез - покурил man stat, внес изменение, но так и не понял где собака порылась).
Еще сделал вместо копирования перенос, чтоб не засорять и удаление временных файлов и директорий используемых для обработки.
Проверил на нескольких файлах с разной датой. Пока вроде все корректно.
Закинул скрипт в cron.
Настроил на ежедневное выполнение в 01:00 пусть ночью крутится.
За автоматическое монтирование по udev и копирование с SD у меня другой скрипт отвечает.
Теперь лафа. Карточку вставил. Фото и видео слилось beep(нуло 3 раза) чтоб вынут после umount.
Затем фотки по папкам с датами распихались на том и остались (юзал exiftool), а видео обрабатывается этим скриптом.
конечный вариант скрипта
text
#!/bin/bash
SOURCE=/home/user/tmp/video # исходная папка сюда сливается *.MTS с SD карты
TARGET=/home/user/tmp/videoavi # папка для преобразованных MTS в avi (тоже временная) потом чистится
# начало первого цикла ищем файлы MTS возвращаем даты модификации, создаем директории имя - дата жмем в avi
find $SOURCE -iname "*.MTS" | while read FILE ; do
DIR=$(date -d "$(stat -c%y "$FILE")" "+%Y-%m-%d") ;
mkdir -p $TARGET/$DIR ; #создаем каталог
fname="${DIR}-$(basename $FILE)"
ffmpeg -i $FILE -r 30 -s 1280x720 -vcodec libxvid -b 18300k -acodec libmp3lame -ab 192k -ac 2 -ar 48000 ./${fname%MTS}avi
mv ./${fname%MTS}avi $TARGET/$DIR;
done
#второй цикл ищем только-что преобразованные avi уже распиханные в директории по датам и сцепляем в один файл, называем файл по дате.
find "$TARGET" -maxdepth 1 | while read DIR ; do
mencoder -ovc copy -oac copy -o "/$DIR.avi" $DIR/*.avi
mv "$DIR.avi" /home/user/video; # папка должна существовать!
done
# почистим
rm -rf /home/user/tmp/videoavi/*
rm -rf /home/user/tmp/video/*