Converter mp4 para mp3 usando o Shell Script

6

Eu olhei para Convertendo mp4 para mp3 que usa uma ferramenta chamada ffmpeg . O processo é ótimo quando você tem um único arquivo para converter, mas estou tentando automatizar a conversão de mp4 para mp3 para qualquer diretório.

Como exemplo, o diretório abaixo com todos os seus subdiretórios é fornecido, ou seja, 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

Após a execução do script, o diretório de saída deve se parecer com, por exemplo, 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

Eu estava olhando como fazer essa conversão usando scripts bash e me deparei com Script: Converte recursivamente os arquivos wma em MP3, depois remove os arquivos WMA .

Isso parece um pouco mais difícil do que eu esperava, qualquer ajuda e orientação será muito apreciada.

Atualizar

Com alguma ajuda, escrevi um script: Por favor, confirme que isso funciona!

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

#cd  #change dir to dest
cd 
#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 "" -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#*/}"' - '{}' \;

Você pode encontrar o código-fonte em meu GitHub . Qualquer outra contribuição será muito apreciada.

    
por Amir 16.10.2016 / 17:34

1 resposta

9

Primeiro, você precisará replicar a estrutura de diretórios no novo diretório principal. Dentro do diretório original que contém os arquivos .mp4, execute find . -type d >dirs.txt . Isso armazenará todos os diretórios e seus caminhos em dirs.txt . Em seguida, altere o diretório para o novo diretório superior e execute xargs mkdir -p <dirs.txt . Isso criará a mesma estrutura de diretórios que o original.

Para alterar o formato e armazenar os arquivos em um diretório diferente, execute o seguinte comando dentro do diretório superior original.

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' - '{}' \;

Explicação

find . -name "*.mp4" localiza todos os arquivos do tipo .mp4. -exec bash -c executa o comando bash fornecido na sequência subsequente para cada arquivo encontrado. Ele também passa o nome do arquivo como variável , que pode ser usado no comando bash.

Neste ponto, contém algo como ./path/file.mp4 . Para remover o tipo de arquivo *.mp4 , usamos var=${1%.mp4} , que armazena ./path/file a $var . Agora, removemos o ./ precedente com var=${var#*/} , portanto, o valor de $var é path/file .

No comando ffmpeg , obtemos o nome do arquivo atual com ${var#*/} , que dá caminho / arquivo.mp4 e obtemos o arquivo de saída com ~/PATH/to/NewTopDIr/$var".mp3 , em que $var tem o valor path/file , conforme explicado acima.

    
por Bilal Baqar 16.10.2016 / 18:13