Преобразуйте mp4 в mp3 Используя Сценарий оболочки

Я посмотрел на Преобразование 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

Я смотрел на то, как сделать это преобразование с помощью сценариев удара, и я столкнулся со Сценарием: Рекурсивно преобразуйте 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. Дальнейший вклад будет цениться значительно.

6
задан 13 April 2017 в 05:23

1 ответ

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

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

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 выполняет команду удара, обеспеченную в последующей строке для каждого найденного файла. Это также передает имя файла как переменную $1 который может использоваться в команде удара.

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

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

9
ответ дан 23 November 2019 в 07:33

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

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