в настоящее время я выполняю эту команду...
# 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 создает в другой каталог. Какие-либо мастера там имеют некоторые примеры кода, или условия или идеи, как я могу выполнить эту задачу?
Позвольте рекурсивному 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
Этот фильтр менее общий и специально предназначен для тех, кто хочет совместить аппаратное ускорение с другими фильтрами и нуждается в настройке, аналогичной описанной выше.
В заданном каталоге, содержащем папку размером 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