Existe alguma maneira de converter um monte de arquivos .ogg em uma pasta para .mp3 usando ffmpeg?

3

Existe alguma maneira de converter um monte de arquivos .ogg em cerca de 30 pastas em uma pasta que contém essas pastas em arquivos .mp3 e colocá-los em outra pasta usando o comando ffmpeg? Os métodos anteriores que eu tentei levaram ao mesmo erro: "* .ogg não existe esse arquivo ou diretório"

Se possível, você poderia me dizer como? Não consigo encontrar nada relacionado a essa pergunta específica.

Edit: Eu tentei editar o comando e agora está me dando este erro: (isso vale para todos os arquivos na pasta)

/Users/Macbook/Downloads/Minecraft+Sound+Pack+1.13/step/wood6.ogg~/Downloads/Minecraft\ Sounds/step/wood6.mp3: No such file or directory

Eu usei isso:

$ for file in ~/Downloads/Minecraft+Sound+Pack+1.13/step/*.ogg 
> do
>     fullfilename=$(basename "${file}")
>     filename="${fullfilename%.*}"
>     ffmpeg -i "$file""~/Downloads/Minecraft\ Sounds/step/$filename.mp3"
> done

Eu acho que está tentando vincular os dois diretórios.

The Muffin Man
fonte
O código acima não funcionou. Se o ffmpeg deve ler as pastas dentro do diretório, algo está errado com o ffmpeg. Eu tentei "ffmpeg -i" {} "" {.}. Mp3 "::: .ogg", "para i em * .ogg; faça ffmpeg -i" $ i "" $ {i%. } .mp3 "; done" e o código acima.
The Muffin Man
@ user10829240 Você tentou converter um arquivo separadamente para verificar se o ffmpeg funciona no seu sistema? ffmpeg -i file_name.ogg file_name.mp3
Yoric
Se você já tem um trecho de código, adicione-o diretamente à pergunta e explique onde ele falha.
nohillside
O Ffmpeg não deve ler dentro dos diretórios; tudo o que faz é pegar um formato de entrada e produzi-lo como outro, é isso. A leitura “dentro” de um diretório depende de como você o codifica. Sem ver seu código, é impossível dizer por que está falhando.
Allan
O ffmpeg funciona no meu sistema. Eu o usei outro dia para converter um vídeo de 1h 30m de .flv para .mp4 porque não consegui abrir o arquivo no meu sistema. Funcionou perfeitamente sem nenhum erro.
The Muffin Man

Respostas:

2

Não é surpreendente como esses pequenos problemas criam um monte de soluções :-)

Faça o download do arquivo ZIP e execute

unzip "Minecraft Sound Pack 1.13.zip" -d mc
cd mc/
find . -type f -iname '*.ogg' -execdir sh -c \
    'ffmpeg -v 8 -i "$1" "${1%.*}.mp3" && rm -- "$1" && echo "$1"' sh {} \;

Isso substituirá todos os .oggarquivos pela .mp3versão, excluindo o .oggarquivo no processo. Você ainda tem os dados originais no arquivo ZIP, se necessário.

  • -type fgarante que apenas os arquivos sejam correspondidos (caso contrário, um diretório nomeado foo.oggtambém seria passado ffmpegpara processamento)
  • A -execdiropção executa o seguinte comando no diretório em que o arquivo foi encontrado (portanto, não precisamos nos preocupar com a remoção dos nomes dos caminhos)
  • Como -execdirsó podemos executar um comando, iniciamos um novo shell e passamos o conjunto de comandos via-c
  • ffmpeg -v 8 -i "$1" "${1%.*}.mp3" && rm -- "$1" && echo "$1"é o comando real sendo executado, com o nome do arquivo a ser convertido como $1
  • sh {}são os parâmetros passados ​​para o script de shell como $0e $1respectivamente. shé necessária apenas por razões sintáticas (você pode colocar qualquer palavra lá, algumas pessoas usam, _por exemplo), {}é substituída pelo arquivo encontrado atualmente
  • \;termina a -execdirparte (na verdade termina ;, mas precisa ser escapado do bash, quem o interpretaria como um terminador de comando)

PS: Se você quiser ver os detalhes, ffmpegremova a -v 8peça.

nohillside
fonte
Obrigado! Isso resolveu meu problema. Agradeço sua ajuda.
The Muffin Man
0

Usando a lógica básica no post, Sugestões para um conversor de áudio em lote? , basta fazer um for/doloop aninhado simples para percorrer cada um de seus diretórios. Supondo que, na melhor das hipóteses, os diretórios tenham apenas um diretório filho e os arquivos sejam bastante limpos (nada além .oggdisso), esse script converterá automaticamente os arquivos para você.

#!/bin/bash

base_dir="~/Downloads"
newbase_dir="~/Downloads/New Sounds"

cd "$base_dir"
for dir in */
do
  for file in *
  do
    fullfilename=$(basename "${file}")
    newfilename="${fullfilename%.*}"
    echo
    echo "Converting ${file} to $newfilename.mp3
    ffmpeg -i "$file" "${newbasedir}/${dir}/${filename}.mp3"
  done
done

Script Logic

Basicamente, ele irá percorrer cada arquivo em cada diretório, processando-o através da ffmpegconversão de .oggpara .mp3manter a estrutura de diretórios do original. Há duas variáveis ​​que você precisa definir:

  • base_dir - o ponto inicial de onde os arquivos estão localizados
  • new_base_dir - o diretório em que você deseja que todos os arquivos terminem.

Se você não deseja manter a estrutura de diretórios, basta reescrever a ffmpeglinha para ler:

ffmpeg -i "$file" "${newbase_dir}/${filename}.mp3"
Allan
fonte
@ user3439894 - Fiz suposições que detalhei no primeiro parágrafo .... É facilmente corrigido com a adição da oggextensão. Eu poderia ter adicionado a verificação de erros para o diretório e o arquivo, mas isso é apenas para a lógica do script.
Allan
Considerando que o OP está lidando com um pacote de arquivos de som baixado da Internet, o Minecraft + Sound + Pack + 1.13.zip, que contém 131 diretórios, alguns aninhados com 3 ou mais de profundidade e 1406 arquivos .ogg ... seu script como atualmente codificado falha por várias razões.
user3439894 2/01
0

Como exemplo, tenho um monte de .oggarquivos no meu Downloadsdiretório, então ... para converter em lote um monte de .oggarquivos em um determinado diretório para .mp3arquivos no mesmo diretório, fiz o seguinte no Terminal :

cd Downloads
for f in *.ogg; do ffmpeg -i "$f" "${f%.*}.mp3"; done

Isso criou um .mp3arquivo para cada .oggarquivo que tenho no meu diretório Downloads .

Portanto, usando o caminho do diretório, faça o seguinte:

cd ~/Downloads/Minecraft+Sound+Pack+1.13/step
for f in *.ogg; do ffmpeg -i "$f" "${f%.*}.mp3"; done

Dito isso, e considerando que você lida com um pacote de arquivos de som baixado da Internet, Minecraft + Sound + Pack + 1.13.zip, que contém 131 diretórios , alguns aninhados com 3 ou mais de profundidade e 1406 .ogg arquivos, dos quais alguns dos nomes de arquivos são do mesmo modo, eu lidaria com a situação com as seguintes condições em mente.

  1. Eu baixei o Minecraft+Sound+Pack+1.13.ziparquivo da Internet.
  2. Expanda o arquivo zip clicando duas vezes nele na minha pasta Downloads no Finder. Observe que isso ocorre porque eu não deixo o navegador descompactar os arquivos compactados. Isso também mantém uma cópia do arquivo zip, caso eu ainda precise dela posteriormente.

Com isso feito, usei o seguinte exemplo de script bash para converter cada .oggarquivo na estrutura de pastas hierárquicas em um .mp3arquivo no mesmo local. Em seguida, exclua os .oggarquivos, pois ainda tenho o arquivo zip original.

#!/bin/bash

    # s="/Path/To/Source/Files"

s="$HOME/Downloads/Minecraft+Sound+Pack+1.13"

for d in $(find "$s" -type f -iname '*.ogg' | sed -E 's|/[^/]+$||' | sort -u); do
    cd "$d"
    for f in *.ogg; do
        ffmpeg -i "$f" "${f%.*}.mp3"
        rm "$f"
    done
done
  • Você só precisa alterar o valor de s="..."como ou se necessário e, como regra geral, gosto de usar $HOMEno lugar de ~.

Observe que é assim que escolho lidar com a situação no momento e há muitas maneiras diferentes de escrever um script. No entanto, acredito que alcança o objetivo final de manter intacta a estrutura de pastas hierárquicas dos 131 diretórios com os 1406 .mp3 arquivos convertidos .

A propósito ... No meu antigo MacBook Pro, (Retina, 15 polegadas, início de 2013) Intel Core i7 de 2,8 GHz, foram necessários pouco menos de 9 minutos para processar os .ogg arquivos 1406 .

user3439894
fonte
O script do shell trincado no Unix e Linux provavelmente teria um dia de campo com a análise dos findresultados (mesmo que não seja interrompido pelo problema específico) :-)
nohillside
@nohillside, geralmente é analisar a saída lsque normalmente é abatida e analisar findé a recomendação sobre ela. Eu direi que, para outro cenário específico do tipo único, eu usaria novamente o que eu publiquei porque foi testado várias vezes e funcionou sem problemas e eu só não queria dedicar tempo para formular a linha de comando necessária em conjunto com -execdire finde passar pelo teste que eu achei mais fácil para testar a direção que eu fui. No entanto, não há dúvida de que sua resposta é o melhor caminho a percorrer entre eles, mas não o único!
User3439894 10/01
Eu sei que você sabe o que está fazendo aqui :-)
nohillside