Создайте сценарий удара, чтобы проверить подкаталоги и выполнить команду с ffmpeg

в настоящее время я выполняю эту команду...

# Script designed to convert webm files to m4a for easy listening

for i in *.m4a ; do
    echo ffmpeg -i "\""$PWD/$i"\"" -c:a copy "\""$PWD/${i%.m4a}.mkv"\"" >> ~/bulk.command.txt
done

создать меня файл сценария, который я могу позже выполнить, чтобы сделать пакетные перепакеты медиа-файлов. Печально этот процесс требует, чтобы я ввел каждый каталог, который должен быть повторно упакован и сделать, чтобы я ввел имя сценариев.

Иногда эти проекты имеют довольно много каталогов, а также подкаталогов. Также эти проекты при становлении большими, требуют, чтобы я действительно был осторожен на размере корневого каталога проектов.

Я все еще изучаю, как кодировать в ударе, и этот простой сценарий взял меня некоторое время к идеальному, чтобы удостовериться примерно, что каждое возможное имя файла составляется.

Что я хотел бы сделать, затем, изменяют его в таком как путь, поскольку я могу просто войти в свою домашнюю музыкальную папку папок, выполнить эту команду, единственное время И также иметь его сохраняет расположение каталога, но также и помещает, файлы ffmpeg создает в другой каталог. Какие-либо мастера там имеют некоторые примеры кода, или условия или идеи, как я могу выполнить эту задачу?

2
задан 5 April 2017 в 09:09

2 ответа

Позвольте рекурсивному globbing рекурсивно вызвать в подкаталоги:

shopt -s globstar

Затем Вы могли сделать:

for f in **/*.m4a
do
    printf 'ffmpeg -i %q -c:a copy %q\n' "$PWD/$f" "$PWD/${f%.m4a}.mkv"
done > bulk.command.txt

printf %q кавычки представляют в виде строки так, чтобы они могли безопасно использоваться в качестве входа оболочки, таким образом, Вы не должны смешивать с кавычками там:

  %q    quote the argument in a way that can be reused as shell input

Если Вы делаете это сценарием, то можно использовать аргументы, чтобы решить, использовать ли другой каталог для выходных файлов:

#! /bin/bash
shopt -s globstar

for f in **/*.m4a
do
    printf 'ffmpeg -i %q -c:a copy %q\n' "$PWD/$f" "${1:-$PWD}/${f%.m4a}.mkv"
done > bulk.command.txt

${foo:-bar} использует значение переменной foo, если это не пусто, или bar иначе так в этом случае это использует первый аргумент если не пустой и $PWD иначе.

Необходимо будет воссоздать структуру каталогов в этом случае, которая может быть, покончили mkdir -p:

#! /bin/bash
shopt -s globstar

for f in **/*.m4a
do
    printf 'mkdir -p %q\n' "${1:-$PWD}/${f%/*}"
    printf 'ffmpeg -i %q -c:a copy %q\n' "$PWD/$f" "${1:-$PWD}/${f%.m4a}.mkv"
done > bulk.command.txt

Это - то, если действительно необходимо создать сценарий для более позднего использования. Лично, я не вижу точку - Вы могли просто выполнить цикл непосредственно, когда на самом деле необходимо выполнить его:

#! /bin/bash
shopt -s globstar

for f in **/*.m4a
do
    mkdir -p "${1:-$PWD}/${f%/*}"
    ffmpeg -i "$PWD/$f" -c:a copy "${1:-$PWD}/${f%.m4a}.mkv"
done > bulk.command.txt
3
ответ дан 2 December 2019 в 02:47

Этот фильтр менее общий и специально предназначен для тех, кто хочет совместить аппаратное ускорение с другими фильтрами и нуждается в настройке, аналогичной описанной выше.

В заданном каталоге, содержащем папку размером 4k, содержащую все медиафайлы, которые мы хотим преобразовать, этот скрипт найдет весь соответствующий контент, перекодирует, тональная карта и уменьшит их до 1920независимо от исходного соотношения сторон. было, перекодировать в файл HEVC со скоростью 20 Мбит/с, преобразовать первую встроенную звуковую дорожку в стерео и вывести каждый файл в собственный подкаталог под папкой 2k — это упрощает выделение исходного содержимого 2k (для веб-контента это имеет тенденцию к 19201080). Кроме того, здесь используется интерфейс VAAPI, который не зависит от аппаратного обеспечения, поэтому, если аппаратное обеспечение поддерживает HEVC, это будет работать.

В целях организации это также поддерживает исходную структуру каталогов, которая находится в вашей папке 4k.

В случае, если вы не поддерживаете библиотеку 2k, это создаст идентичный репозиторий и создаст необходимые папки, чтобы упростить создание библиотеки в стиле Plex.

Предыдущие ответы были достаточно хороши для прохождения 95% пути, хотя потребовалось некоторое время, чтобы все заработало должным образом.ради индексации поисковыми системами, вот что в итоге получилось у моей последней команды:

for f in 4k/**/.mkv; do mkdir -p ./2k/transcodes/output/"${f%/}"; ffmpeg -hide_banner -loglevel warning -hwaccel 'vaapi' -hwaccel_output_format vaapi -i "$PWD/$f" -vf "scale_vaapi=w=1920:h=-1,hwdownload,format=p010le,zscale=transfer=linear,tonemap =clip,zscale=transfer=bt709,format=yuv420p,format=nv12,hwupload" -ac '2' -c:v 'hevc_vaapi' -b:v '20M' -ss 10 -t 20 ./2k/transcodes/ вывод/"${f%}".mp4 ; done

for f in 4k/**/*.mkv; do mkdir -p ./2k/transcodes/output/"${f%/*}"; ffmpeg  -hide_banner -loglevel warning -hwaccel 'vaapi' -hwaccel_output_format vaapi -i "$PWD/$f"  -vf "scale_vaapi=w=1920:h=-1,hwdownload,format=p010le,zscale=transfer=linear,tonemap=clip,zscale=transfer=bt709,format=yuv420p,format=nv12,hwupload" -ac '2' -c:v 'hevc_vaapi' -b:v '20M' -ss 10 -t 20 ./2k/transcodes/output/"${f%}".mp4 ; done
0
ответ дан 7 December 2020 в 03:54

Другие вопросы по тегам:

Похожие вопросы: