W swojej kolekcji posiadam sporo filmów nakręconych przy użyciu aparatu fotograficznego (jak pewnie prawie wszyscy :)). Filmy te łącznie ze zdjęciami udostępniam w formie albumu ze zdjęciami. I tutaj pojawia się mały kłopot: dobrze jakby filmy były zakodowane do formatu FLV, a do tego przydałaby się miniaturka zdjęcia.
W Internecie łatwo można znaleźć przepisy jak dokonać konwersji pojedynczy plik do formatu FLV przy użyciu ffmpeg
, a miniaturki można stworzyć używając aplikacji ffmpegthumbnailer
(więcej na ten temat w tym wpisie Generowanie miniaturek z plików wideo przy użyciu aplikacji ffmpegthumbnailer). Ja natomiast chciałem mieć rozwiązanie, które spełni takie warunki jak:
- automatyczne skanowanie wybranego katalogu i wyszukiwanie nowych plików z filmami
- konwersja nowych filmów do formatu FLV (ale nie należy ruszać już utworzonych plików)
- utworzenie miniaturki konwertowanego pliku
I oto skrypt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/bin/bash # katalog do skanowania IN_PATH="~/zdjecia" # rozszerzenie z filami brane pod uwagę EXTENSIONS=".*\.\(mp4\|mpeg\)" ( IFS=" " for PLIK in `find "${IN_PATH}" -iregex ${EXTENSIONS}`; do # generowanie miniatury [ -f "${PLIK}.thm" ] || (echo "Miniatura: ${PLIK}.thm"; ffmpegthumbnailer -i "${PLIK}" -o "${PLIK}.thm" -q10 -c jpeg -s 640) # jeżeli istnieje plik flv, to nic nie rób [ -f "${PLIK}.flv" ] && continue # konwersja pliku na format FLV echo "${PLIK} -> ${PLIK}.flv" ffmpeg -i "${PLIK}" -ar 22050 -ab 56 -r 25 -b 512k "${PLIK}.flv" # ustawienie takich samych czasów modyfikacji touch -r "${PLIK}" "${PLIK}.flv" done ) |
Na pewno każdy będzie musiał przynajmniej częściowo dostosować skrypt do własnych potrzeb. U mnie działa i robi to czego oczekuję. A oto co się w nim dzieje:
IN_PATH="~/zdjecia"
Katalog, w którym znajdują się pliki z filmami, tylko on (łącznie z podkatalogami) będzie skanowany.EXTENSIONS=".*\.\(mp4\|mpeg\)"
Definicja rozszerzeń, które będą brane pod uwagę (wielkość liter nie ma znaczenia). Jeżeli zajdzie potrzeba umieszczenia kolejnego na tej liście, należy dopisać je przed\)
i rozdzielić od poprzednie przy użyciu\|
(więcej na dokumentacji do poleceniafind
).IFS="
"
Zmienna o nazwie Internal Field Separator, pozwala na podział parametrów wg słów. Domyślnie zawiera znaki: spacja, tabulator, nowa linia. Należy przedefiniować tę zmienną, aby można obsłużyć poprawnie występowanie spacji w wynikach zwracanych przez poleceniefind
. Nowa postać powinna zawierać tylko dwa znaki: znak nowej linii (czyliEnter
) oraz znak tabulatora. Na pewno linię tę będzie trzeba wprowadzić ręcznie w edytorze, na stronie jest zapisana błędnie.find "${IN_PATH}" -iregex ${EXTENSIONS}
Odszukanie plików o podanych rozszerzeniach w wybranym katalogu.[ -f "${PLIK}.thm" ] ||
Sprawdzenie, czy istnieje miniatura. Jeżeli jej nie ma, to należy ją utworzyć.ffmpegthumbnailer -i "${PLIK}" -o "${PLIK}.thm" -q10 -c jpeg -s 640
Utworzenie miniatury na podstawie oryginalnego filmu.[ -f "${PLIK}.flv" ] && continue
Sprawdzenie, czy istnieje plik FLV. Jeżeli istnieje, to powrót do początku pętli i przetwarzanie kolejnego filmu (czyli nic więcej nie robimy).ffmpeg -i "${PLIK}" -ar 22050 -ab 56 -r 25 -b 512k "${PLIK}.flv"
Przetworzenie zadanego pliku do formatu FLV, przy zadanych parametrach.touch -r "${PLIK}" "${PLIK}.flv"
Ustawienie czasu modyfikacji nowo utworzonego pliki na taki sam oryginalny. Przydatne podczas przetwarzania zdjęć i filmów z więcej niż jednego aparatu (można wtedy sortować po czasie modyfikacji, niezależnie od nazwy pliku).