it-swarm.com.de

Konvertieren Sie mp4 in mp3 mit Shell Script

Ich habe mir angesehen , wie ich mp4 in mp3 konvertiere, wobei ein Tool namens ffmpeg verwendet wird. Der Prozess ist großartig, wenn Sie eine einzelne Datei konvertieren müssen, aber ich versuche, die Konvertierung von mp4 in mp3 für ein bestimmtes Verzeichnis zu automatisieren.

Als Beispiel wird das folgende Verzeichnis mit all seinen Unterverzeichnissen angegeben, d. H. 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

Nachdem das Skript ausgeführt wurde, sollte das Ausgabeverzeichnis wie folgt aussehen: 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

Ich habe mir überlegt, wie diese Konvertierung mithilfe von Bash-Skripten erfolgen soll, und bin auf folgendes Skript gestoßen: . Konvertiere rekursiv WMA-Dateien in MP3 und entferne dann WMA-Dateien .

Dies scheint etwas schwieriger zu sein, als ich erwartet hatte. Jede Hilfe und Anleitung wird sehr geschätzt.

Aktualisieren

Mit etwas Hilfe habe ich ein Skript geschrieben: Bitte bestätigen Sie, dass dies funktioniert!

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#*/}"' - '{}' \;

Sie finden den Quellcode auf meinem GitHub . Jeder weitere Beitrag wird sehr geschätzt.

6
Amir

Zuerst müssen Sie die Verzeichnisstruktur im neuen obersten Verzeichnis replizieren. In dem ursprünglichen obersten Verzeichnis, das die MP4-Dateien enthält, wird find . -type d >dirs.txt ausgeführt. Dadurch werden alle Verzeichnisse und ihre Pfade in dirs.txt gespeichert. Wechseln Sie dann in das neue Hauptverzeichnis und führen Sie xargs mkdir -p <dirs.txt aus. Dadurch wird dieselbe Verzeichnisstruktur wie bei orginal erstellt.

Führen Sie den folgenden Befehl im ursprünglichen obersten Verzeichnis aus, um das Format zu ändern und die Dateien in einem anderen Verzeichnis zu speichern.

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

Erläuterung

find . -name "*.mp4" findet alle Dateien vom Typ .mp4. -exec bash -c führt den Bash-Befehl aus, der in der nachfolgenden Zeichenfolge für jede gefundene Datei angegeben ist. Der Dateiname wird auch als Variable $1 übergeben, die im Befehl bash verwendet werden kann.

Zu diesem Zeitpunkt enthält $1 so etwas wie ./path/file.mp4. Zum Entfernen des Dateityps *.mp4 verwenden wir var=${1%.mp4}, in dem ./path/file bis $var gespeichert sind. Jetzt entfernen wir den vorhergehenden ./ mit var=${var#*/}, daher ist der Wert von $varpath/file.

Im Befehl ffmpeg erhalten wir den aktuellen Dateinamen mit ${var#*/}, was path/file.mp4 ergibt, und die Ausgabedatei mit ~/PATH/to/NewTopDIr/$var".mp3, wobei $var den Wert path/file wie oben erklärt.

9
Bilal Baqar