Пакетне перетворення файлів за допомогою ffmpeg


0

Може хто-небудь сказати мені, де я йду неправильно робити це.

Ідея полягає в тому, щоб знайти і перетворити всі файли в каталог до m4v. Незалежно від розширення. Після того, як він буде перетворений, генерувати ескіз із нібито "релевантної" частини перетвореного файлу. Потім, як тільки він зробив це, щоб видалити оригінальний файл (в ідеалі, якщо він менше, ніж оригінал - однак я ще не зрозумів, цей біт ще.) Я дуже новий для скриптів оболонки, тому будь-яка допомога буде найбільш цінується.

Потім я хотів би в майбутньому додати ім'я файлу і подробиці до бази даних MySQL. Якщо у кого є якісь поради про те, що я буду дуже вдячний. Крім того, як додати в чек, щоб пропустити перетворення на файли, які вже є m4v.

#!/bin/bash
#Convert files using ffmpeg
OrDir="/Volumes/Misc/Test/"
NewDir="/Volumes/Misc/Conv2/"

find "$OrDir" -type f -exec /bin/bash -c \
    'f2=$(basename "$1"); \
     ffmpeg -i "$1" -c:v libx264 -crf 23 -preset ultrafast -c:a aac -strict experimental -b:a 192k -ac 2 "${NewDir}${f2%.*}.m4v" ' _ {} \;
     ffmpeg -ss 3 -i "${NewDir}${f2}.m4v" -vf "select=gt(scene\,0.4)" -frames:v 5 -vsync vfr fps=fps=1/600 "${NewDir}pictures/${f2%.*}.jpg"
     rm $1

ОНОВЛЕННЯ: Я граю з цим багато в останні кілька днів, і це те, що я маю зараз:

#!/bin/bash
#Convert files using ffmpeg

OrDir="/Volumes/Misc/Test"

find "$OrDir" -type f -exec /bin/bash -c \
    'ND="/Volumes/Misc/Convert/"
     f2=$(basename "$1")
     eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width "$1")
     size=${streams_stream_0_height}
     if [ "$size" -gt 720 ]
     then
         size=720
     fi
     ffmpeg -y -hide_banner -i "$1" -codec:v libx264 -profile:v high -preset ultrafast -b:v 500k -qmin 10 -qmax 42 -maxrate 1000k -bufsize 1000k -threads 0 -vf "scale=-1:$size" -pass 1 -c:a aac -strict -2 -b:a 128k -f m4v /dev$
     ffmpeg -y -hide_banner -i "$1" -codec:v libx264 -profile:v high -preset ultrafast -b:v 500k -qmin 10 -qmax 42 -maxrate 1000k -bufsize 1000k -threads 0 -vf "scale=-1:$size" -pass 2 -c:a aac -strict -2 -b:a 128k "$ND${f2%.*$
     ffmpeg -hide_banner -i "$ND${f2%.*}.m4v" -vf "select=gt(scene\,0.4), scale=-1:135, fps=1/60" -frames:v 5 -vsync vfr "${ND}pictures/${f2%.*}_%03d.png"
     rm $1
     mysql --host=****** --user=***** --password=****** db << EOF
     INSERT INTO tbl (Name, FileType, Time, AddedDate) VALUES ("${f2%.*}", '.m4v', 0, NOW());
     EOF
     ' _ {} \;

Це має дві проблеми; по-перше, він не завжди генерує ескізи, іноді повертаючись Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used) але створений файл перетворюється ідеально, а по-друге, лінія mysql не виконує правильно повернення помилки: _: line 12: mysql: command not found Я також не зрозумів, як отримати тривалість відео ще додати, що до db, а також.


Як можна ffmpeg знати, що є відповідні для вас?
Endoro

@Endoro - Я не зовсім впевнений, що ви маєте на увазі. Основна ідея полягає в тому, щоб просто перетворити його на m4v і спробувати зробити файл меншим. Я грався з нею в останні кілька днів і оновлю свою операційну систему з тим, що я придумав. Це встановлює те, що я вважаю «релевантним» для мене. Але якщо я неправильно зрозумів, будь ласка, дайте мені знати
Tom

Як можна ffmpeg зробіть ескіз з відповідну частину фільму? Що ви маєте на увазі відповідні ?
Endoro

@Endoro Я бачу те, що ви маєте на увазі зараз. Я мав на увазі щось подібне Посилання Так що він захопив мініатюри, які були насправді щось замість просто чорного, або кредитів.
Tom

Добре, приємно, я буду дивитися на це. Якщо вам потрібно невеликий файлів з гарна якість Ви не повинні використовувати ultrafast пресета x264.
Endoro

Відповіді:


0

Якщо ви плануєте розширити цей сценарій - який, з вашого питання про базу даних, ви - я б рекомендував, якнайшвидше, параметризацію.

Я також рекомендую використовувати ffmpegthumbnailer для створення мініатюр, які повинні бути простими yum install ffmpegthumbnailer / apt-get install ffmpegthumbnailer геть. Перевірте параметри - у моєму сценарії я генерую ескіз такого ж розміру ( -s0 ) як оригінал, але ви не можете цього хотіти.

Цей приклад сценарію повинен розпочати:

#!/bin/bash
# Convert files using ffmpeg
# USE AT YOUR OWN RISK!

# Parameters
OrDir="/tmp/video/"             # Original directory
NewDir="/tmp/video/out/"        # New directory
PicsDir=${NewDir}pictures/
ignore="m4v"                    # ignore single filetype being converted
convto="$ignore"                # in case you want to convert to something else
thumbnailseek=5                 # Seek % at which to generate thumbnail

# Change to original directory
# For each file:
#       check appropriate (exists, not directory, not already same type)
#       convert to $convto type media file (ffmpeg)
#       generate thumbnail (ffmpegthumbnailer)
#       (optional) remove original if new version smaller

cd "$OrDir"
for oldfile in *.mkv; do        # indeed every file; globbing will eat up  spaces properly
    ext=${i##*.}
    # ignore 1) non-existant files 2) directories 3) $ignore-extentioned files
    if [[ ! -e "$oldfile" ]] || [[ -d "$oldfile"  ]] || [[ "$ext" = "$ignore" ]]; then
            continue
    fi

    filename=${oldfile%.*}
    newfile="$NewDir$filename.$convto"
    oFS=$(stat --printf="%s" $oldfile) # old file size

    ffmpeg -y -loglevel quiet -i "$oldfile" -c:v libx264 -crf 23 -preset ultrafast -c:a aac -strict experimental -$
    nFS=$(stat --printf="%s" $newfile) # new file size

    ffmpegthumbnailer -s0 -i "$newfile" -t $thumbnailseek -o "$PicsDir$filename.jpg" &>/dev/null
    if [ "$oFS" -gt "$nFS" ]; then
            #rm -- "$OrDir$oldfile" # AT OWN RISK: uncomment to remove older file if smaller
    fi
done

Я не експерт, тому що будь-який обережний прозор вищезгаданого коду покаже. Я змішав у своїх власних конвенціях про найменування змінних з тими, що містяться в оригінальному коді (моїм наміром було зберегти деяке знайомство); Я міг би параметризувати далі; Я закодував у сценарій чимало припущень (подібно до OrDir наприклад, містять лише відеофайли); можуть бути спрощені деякі умовні випробування; ім'я файлу та керування каталогами можуть бути уніфіковані.

Але це не так Перегляд коду . Там не повинно бути ніяких яскравих помилок, і він працює локально на деяких mkvs я ногами навколо просто чекаючи щось на зразок цього.

Якщо ви збираєтеся робити набагато більше з bash scripting, варто прочитати на деяких загальні підводні камені , і якщо у вас є час Розширений Bash керівництва сценаріїв .


Для "бази даних SQL" потрібна додаткова інформація для надання будь-яких порад. Яка база даних? SQLite? Чому SQL взагалі, у порівнянні з простим плоским файлом (CSV і т.д.)? Які деталі?


@betrieb Велике спасибі за це. Це було дуже корисно - я оновлював свою операційну систему тим, що зараз є. Я повинен був сказати, що у мене працює mySQL db, який я хочу помістити в деталі (відео потім подаються на веб-сервер з сторінками, які створюються на зворотній стороні деталей в db)
Tom

@Tom немає проблем, мені подобається автоматизувати ffmpeg. Я знову прочитав ваше запитання, оскільки зараз незрозуміло, з яких областей ви все ще відчуваєте труднощі, можливо, ви могли б додати цю інформацію? Щоб отримати дані в MySQL, у вас буде декілька варіантів - труби, файли тощо - залежно від того, як ви хочете це зробити.
bertieb

Я досить новий для оболонки сценаріїв, і що я хотів би зробити, зрештою, маючи його запустити на моєму Synology NAS, або Mac Server (звідси автоматизація) я потребую допомоги з автоматизацією його. На даний момент я отримую помилку на третьому рядку ffmpeg, де він виводить 'Output file empty' замість створення зображень. Я також хотів би мати деталі mysql все в файлі, але я не хочу, щоб вони потім були читабельні. Чи можна змінити дозволи, щоб воно все ще виконувалося, але не читалося?
Tom

@Tom Я повторюю, щоб зробити якомога більшу кількість параметрів; (включаючи параметри кодека ffmpeg). Якщо у вас виникла помилка з третьою командою, я б відзначив, що в ОП - коментарі не призначені для розширеного обговорення. Двійкові файли можуть бути читаними, а не виконуваними; але не сценарії оболонки відповідно до останнього питання unix.se
bertieb

На жаль я буду оновлювати мій ОП, що ви маєте на увазі саме параметром?
Tom
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.