Конвертируйте mp4 в mp3 используя Shell Script - proUbuntu
Винтажный Клуб для гитаристов
6 голосов
/

Я смотрел на Преобразование mp4 в mp3 , в котором используется инструмент под названием ffmpeg. Процесс хорош, когда у вас есть один файл для конвертации, но я пытаюсь автоматизировать преобразование mp4 в mp3 для любого каталога.

В качестве примера приведен каталог ниже со всеми его подкаталогами, то есть MusicVideos`:

.
├── Andra
│   └── Andra::Why.mp4
├── Ariana Grande
│   └── Dangerous Woman
│       ├── ArianaGrande::IntoYou.mp4
│       └── ArianaGrande::SideToSide.mp4
├── Justin Bieber
│   └── JustinBieber::LetMeLoveYou.mp4
├── Major Lazer
│   └── De Maxx 37
│       └── MajorLazer::ColdWater.mp4
├── Martin Garrix & Bebe Rexha
│   └── MartinGarrix&BebeRevha::InTheNameOfLove.mp4
├── Shawn Mendes
│   └── ShawnMendes::TreatYouBetter.mp4
├── Sia
│   └── The Greatest
│       └── Sia::TheGreatest.mp4
├── The Chainsmokers
│   ├── TheChainsmokers::AllWeKnow.mp4
│   └── TheChainsmokers::Closer.mp4
├── The Weekend
│   └── Starboy
│       └── TheWeekend::DaftPunk.mp4
└── TWENTY ØNE PILØTS
    └── Suicide Squad
        └── TwentyOnePilots::Heathens.mp4

После запуска сценария выходной каталог должен выглядеть следующим образом: MusicAudio:

.
├── Andra
│   └── Andra::Why.mp3
├── Ariana Grande
│   └── Dangerous Woman
│       ├── ArianaGrande::IntoYou.mp3
│       └── ArianaGrande::SideToSide.mp3
├── Justin Bieber
│   └── JustinBieber::LetMeLoveYou.mp3
├── Major Lazer
│   └── De Maxx 37
│       └── MajorLazer::ColdWater.mp3
├── Martin Garrix & Bebe Rexha
│   └── MartinGarrix&BebeRevha::InTheNameOfLove.mp3
├── Shawn Mendes
│   └── ShawnMendes::TreatYouBetter.mp3
├── Sia
│   └── The Greatest
│       └── Sia::TheGreatest.mp3
├── The Chainsmokers
│   ├── TheChainsmokers::AllWeKnow.mp3
│   └── TheChainsmokers::Closer.mp3
├── The Weekend
│   └── Starboy
│       └── TheWeekend::DaftPunk.mp3
└── TWENTY ØNE PILØTS
    └── Suicide Squad
        └── TwentyOnePilots::Heathens.mp3

Я смотрел, как сделать это преобразование, используя bash-скрипты, и наткнулся на Скрипт: рекурсивное преобразование файлов wma в MP3, затем удаление файлов WMA .

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

Обновление

С некоторой помощью я написал скрипт: Пожалуйста, подтвердите, что это работает!

cp -a /$1/. /$2/  #copy the whole dir from src to dest

#cd $2 #change dir to dest
cd $2
#convert *.mp4 to *.mp3
#find . -name "*.mp4" -exec bash -c 'var=${1%.mp4}; var=${var#*/};ffmpeg -i "${1#*/}" -vn -acodec libmp3lame -ac 2 -qscale:a 4 -ar 48000 "$dest/$var".mp3' - '{}' \;

find . -name "*.mp4" -exec bash -c 'ffmpeg -i "$1" -vn -acodec libmp3lame -ac 2 -qscale:a 4 -ar 48000 "${1%.mp4}".mp3' - '{}' \;

echo "Cleaning up" 
find . -name "*.mp4" -exec bash -c 'var=${1%.mp4}; var=${var#*/}; rm "${1#*/}"' - '{}' \;

Вы можете найти исходный код на моем GitHub . Любой дальнейший вклад будет высоко оценен.

1 Ответ

9 голосов
/

Сначала вам нужно будет скопировать структуру каталогов в новый верхний каталог. Внутри оригинального верхнего каталога, содержащего файлы .mp4, запустите find . -type d >dirs.txt. Это сохранит все каталоги и их пути в dirs.txt. Затем измените каталог на новый верхний каталог и запустите xargs mkdir -p <dirs.txt. Это создаст ту же структуру каталогов, что и оригинальная.

Чтобы изменить формат и сохранить файлы в другом каталоге, выполните следующую команду в исходном верхнем каталоге.

find . -name "*.mp4" -exec bash -c 'var=${1%.mp4}; var=${var#*/};ffmpeg -i "${1#*/}" -vn -acodec libmp3lame -ac 2 -qscale:a 4 -ar 48000 "~/PATH/to/NewTopDIr/$var".mp3' - '{}' \;

Объяснение

find . -name "*.mp4" находит все файлы типа .mp4. -exec bash -c запускает команду bash, указанную в следующей строке для каждого найденного файла. Он также передает имя файла как переменную $1, которую можно использовать в команде bash.

На данный момент $1 содержит что-то вроде ./path/file.mp4. Чтобы удалить тип файла *.mp4, мы используем var=${1%.mp4}, который хранит от ./path/file до $var. Теперь мы удаляем предыдущие ./ с var=${var#*/}, следовательно, значение $var равно path/file.

В команде ffmpeg мы получаем текущее имя файла с ${var#*/}, которое дает путь / file.mp4, и мы получаем выходной файл с ~/PATH/to/NewTopDIr/$var".mp3, где $var имеет значение path/file, как объяснено выше.

Добро пожаловать на сайт proUbuntu, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...