Posts Tagged video

Masowa konwersja filmów przy użyciu ffmpeg + generowanie miniaturki

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 polecenia find).
  • 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 polecenie find. Nowa postać powinna zawierać tylko dwa znaki: znak nowej linii (czyli Enter) 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).

Tags: , , , ,

Przegranie filmu z płyty VCD

Chciałem dzisiaj przegrać film z płyty VCD i okazało się to trochę bardziej skomplikowane niż początkowo mi się wydawało.

Początkowo sprawdziłem þlytę, znalazłem na niej pliki z rozszerzeniem dat więc stwierdziłem, że wystarczy przegrać taki plik. Niestety, nie dało się go odtworzyć przy użyciu aplikacji mplayer.

Drugie podejście polegało na użyciu polecenia ffmpeg. Niestety także nie zadziało.

Trzecie podejście do użycie aplikacji k3b w celu skopiowania płyty także nie zadziało (błąd związany z wieloma ścieżkami znajdującymi się na płycie).

Skończyło się łatwe podejście, więc trzeba było teraz trochę poszukać:

$ aptitude search vcd
p   vcdimager     - A VideoCD (VCD) image mastering and ripping tool
p   vcdtools      - Creates Video CD (VCD) filesystem images

Przeszukanie listy dostępnych pakietów w sowich wynikach wskazało na aplikację vcdimager, wiec trzeba ją było zainstalować:

# aptitude install vcdimager

Teraz kolej na sprawdzenie, jaki pliki binarne zostały zainstalowane i co może pomóc w zgraniu płyty:

$ dpkg-query -L vcdimager | grep bin/
/usr/bin/cdxa2mpeg
/usr/bin/vcd-info
/usr/bin/vcdimager
/usr/bin/vcdxbuild
/usr/bin/vcdxgen
/usr/bin/vcdxminfo
/usr/bin/vcdxrip

Najbardziej pomocna wydaje się aplikacji vcdxrip

Tutaj się pojawił problem, bardzo kiepska dokumentacja, zarówno w postaci plików man jak i dostępna na stronie aplikacji. Ale po krótkich poszukiwaniach udało mi się znaleźć rozwiązanie. Aby odczytać film z płyty wystarczy wydać następujące polecenie:

$ vcdxrip --nofiles -p

Spowoduje ono odczytanie zawartości płyty oraz zapisanie znalezionych na niej ścieżek w bieżącym katalogu w formacie MPEG.

Źródła

Tags: , , , , ,