Wählen Sie zufällig 10 Sekunden aus MP3-Dateien

479
Tony Vincent

Ich habe ein Verzeichnis tracksmit 3 Dateien track1.mp3, track2.mp3, track3.mp3. Ich möchte ein zufälliges Stück von 10 Sekunden aus jeder Datei auswählen und diese Stücke in einer neuen Datei zusammenfassen sample.mp3. Wie mache ich das mit ffmpeg?

Ich bin ziemlich neu bei ffmpeg und alles, was ich bisher geschafft habe, ist das Aufteilen einer Datei in Stücke

ffmpeg -i track1.mp3 -f segment -segment_time 10 -c copy out%03d.mp3

Jemand bitte helfen. Ich bin auf Mac OSX High Sierra und Bash Shell

1

1 Antwort auf die Frage

3
slhck

Sie können das folgende Bash-Skript verwenden:

numFiles=3 maxStart=10 idx=1 for randomStart in $(jot -r $numFiles 0 $maxStart); do ffmpeg -y -ss "$randomStart" -i "track$.mp3" -t 10 -c:a copy "track$-chunk.mp3" idx=$((idx + 1)) done 

Hier müssen Sie die Anzahl der Dateien ( track1durch track3) und die maximale Startposition angeben (z. B. wenn Ihre Dateien nur 20 Sekunden lang sind, sollten Sie höchstens um 00:00:10 beginnen).

Das jotDienstprogramm wird zum Erstellen von Zufallszahlen zwischen 0 und $maxStart10 (im obigen Beispiel 10) verwendet. Unter Linux jotnicht verfügbar; stattdessen verwenden shuf -n $numFiles -i 0-$maxStart.

Verketten Sie dann die Chunks (siehe den Eintrag im FFmpeg-Wiki ):

ffmpeg -f concat -safe 0 -i <(for f in ./*-chunk.mp3; do echo "file '$PWD/$f'"; done) -c copy output.mp3 

Es verwendet eine spezielle Shell-Syntax, um eine temporäre Verkettungsdatei zu erstellen. Dadurch werden die Bitstreams kopiert, sodass keine Neucodierung durchgeführt wird.

Danke für eine großartige Antwort. Sie waren sehr hilfreich, ich habe keine Möglichkeit, die Länge meiner Dateien vorher zu kennen Tony Vincent vor 6 Jahren 0
In diesem Fall müssten Sie anders vorgehen: iterieren Sie die Dateien, führen Sie einen ersten Durchgang mit ffmpeg oder ffprobe aus, um ihre Länge in Sekunden zu erhalten (https://superuser.com/a/945604/48078), und verwenden Sie dass eine neue Zufallszahl für die maximale Startposition generiert wird. Aber da würde ich auf Bash verzichten und stattdessen Python oder Ruby verwenden. slhck vor 6 Jahren 0