Einführung
Fieldnote Audio Studio benötigt kurze Hörproben seiner Aufnahmen. Du erstellst eine drei Sekunden lange WAV-Datei, spielst sie ab und entwickelst aus diesem Befehl ein wiederverwendbares Bash-Skript. Die vorbereiteten Aufnahmen sind eigens erzeugte synthetische Klänge und keine Mikrofonaufnahmen.
Du solltest die grundlegenden Bash-Argumente, Bedingungen, Schleifen, Arrays und Funktionen aus Shell for Beginners kennen. Dieses Lab erklärt die benötigten Medienoptionen und Anführungszeichen. FFmpeg ist einsatzbereit. Das Terminal Workspace und die Seite Listening Room teilen sich einen Container; jedes Lab wird unabhängig eingerichtet.
Eine Hörprobe erstellen und abspielen
In diesem Schritt hörst du zuerst, was eine korrekte Hörprobe enthält, bevor du ein Skript zur Stapelverarbeitung schreibst.
Beginne in Workspace, das für UTF-8-Dateinamen vorbereitet ist. Dein Arbeitsverzeichnis ist das eingerichtete Studio. Meldet ein Befehl einen fehlenden relativen Pfad, zeigt pwd dein aktuelles Verzeichnis; mit diesem vollständigen cd-Befehl kehrst du zurück. Führe alle Arbeiten für diesen Kurs hier aus.
cd /home/labex/project/audio-studio
ls input
Du solltest Morning bells.wav, 海辺.wav und -closing.wav sehen. Jede Datei ist eine acht Sekunden lange Mono-WAV-Aufnahme mit 16-Bit-PCM bei 22050 Abtastwerten pro Sekunde. PCM speichert die Abtastwerte direkt. Wir behalten dieses Format und nur den Anfang. Unterstützt werden nicht versteckte reguläre Dateien direkt im Eingabeverzeichnis mit der kleingeschriebenen Endung .wav; dieses Projekt durchsucht keine Unterverzeichnisse und verarbeitet keine beliebigen Codecs.
Erstelle zuerst single, ein Verzeichnis für einzelne Versuche. mkdir -p legt es bei Bedarf an und akzeptiert ein bereits vorhandenes Verzeichnis.
mkdir -p single
Im folgenden Befehl bezeichnet -i die Eingabe, -t 3 begrenzt die Ausgabe auf drei Sekunden und -c:a pcm_s16le wählt vorzeichenbehaftetes 16-Bit-PCM. Optionen beschreiben die folgende Ein- oder Ausgabe; ihre Position ist deshalb wichtig. -v error blendet normale Fortschrittsmeldungen aus, zeigt aber Fehler. -nostdin verhindert, dass FFmpeg interaktive Befehle aus der Terminaleingabe liest, und macht es auch in Schleifen sicherer. Der letzte Pfad benennt die Ausgabe.
Doppelte Anführungszeichen halten einen Pfad mit Leerzeichen als ein Argument zusammen. Ein vorangestelltes ./ oder ein absoluter Verzeichnispfad verhindert außerdem, dass ein mit - beginnender Dateiname als Option gilt. Verwende eine neue Ausgabedatei: Ohne Interaktion über die Standardeingabe verweigert FFmpeg normalerweise das Überschreiben einer bestehenden Datei.
ffmpeg -nostdin -v error -i "input/Morning bells.wav" -t 3 -c:a pcm_s16le "single/Morning bells.wav"
Bei dieser Protokollstufe gibt eine erfolgreiche Konvertierung nichts aus. $? ist der native Exitstatus des vorherigen Befehls: Null bedeutet Erfolg, ein anderer Wert einen Fehler. Lies ihn sofort aus; jeder weitere Befehl ersetzt ihn.
printf 'Conversion exit: %s\n' "$?"
Erwartet wird Conversion exit: 0. Dieser Status bestätigt die erfolgreiche Ausführung der Konvertierung; die Wiedergabe prüft, ob die Datei nutzbar ist.
Wechsle zum Tab Listening Room und lade die Seite neu. Starte unter First preview die Wiedergabe von Morning bells. Höre auf die wechselnden Töne, verschiebe den Wiedergaberegler in den Ausschnitt und prüfe, dass er bei drei Sekunden endet. Wähle Download WAV, um genau diese Datei zu speichern. Die Seite liest nur deine tatsächlichen Ausgabedateien; fehlendes Audio kann sie nicht aus der Bibliothek ergänzen. Kehre anschließend zu Workspace zurück.

Unter First preview findest du die Wiedergabe- und Positionssteuerung sowie Download WAV.
Hast du den Eingabepfad falsch geschrieben, prüfe ls input, korrigiere den Namen in Anführungszeichen und führe den Befehl erneut aus. Belegt ein nicht mehr benötigter Versuch den Ausgabenamen, entferne nur diesen Versuch mit rm -- "single/Morning bells.wav", bevor du es wiederholst. -- beendet die Optionen und bedeutet nicht „alles löschen“. Lasse library, archive, notes.txt und scratch-other während dieses Labs unverändert.
Die Konvertierung in eine wiederverwendbare Funktion fassen
In diesem Schritt übergibst du Eingabe, Ausgabe und Dauer an dieselbe Konvertierung, statt ihren Befehl für jede Aufnahme zu bearbeiten.
Beginne in Workspace unter /home/labex/project/audio-studio. Eine Funktion gibt einer Gruppe von Befehlen einen Namen. In make_preview sind $1, $2 und $3 die Argumente dieser Funktion. Das Skript empfängt eigene Argumente und reicht sie in derselben Reihenfolge weiter. Die Anführungszeichen in "$1" bewahren jeden vollständigen Pfad einschließlich Leerzeichen und Unicode-Zeichen.
Das folgende Here-Dokument schreibt ein kleines Skript. cat > preview-one.sh ersetzt diese Skriptdatei. <<'BASH' übernimmt die folgenden Zeilen als wörtlichen Text bis zu einer Zeile, die nur BASH enthält. Die Anführungszeichen um den Begrenzer verhindern, dass deine aktuelle Shell beim Speichern $1 expandiert. Die erste Zeile wählt Bash, wenn das Skript als Programm gestartet wird. Hier führen wir es ausdrücklich mit bash aus.
cat > preview-one.sh <<'BASH'
#!/usr/bin/env bash
make_preview() {
ffmpeg -nostdin -v error -i "$1" -t "$3" -c:a pcm_s16le "$2"
}
make_preview "$1" "$2" "$3"
BASH
Erstelle mit der Funktion eine andere, zwei Sekunden lange Hörprobe. 2 ist das Argument für die Dauer und gehört zu keinem Dateinamen.
bash preview-one.sh "input/海辺.wav" "single/海辺.wav" 2
printf 'Conversion exit: %s\n' "$?"
Der Status sollte wieder Null sein. Lade Listening Room neu, spiele 海辺 unter First preview ab und beobachte, dass dieser Ausschnitt nach zwei Sekunden endet. Kehre zu Workspace zurück. Dieselbe Funktion arbeitet nun mit verschiedenen Pfaden und Dauern; im nächsten Schritt kommt eine Sammlung von Eingaben hinzu.
Alle Aufnahmen verarbeiten
In diesem Schritt veröffentlichst du ein neues Verzeichnis mit einer Hörprobe für jede Eingabe.
Beginne in Workspace. Unser Skript akzeptiert genau drei Argumente: Eingabeverzeichnis, neues Ausgabeverzeichnis und eine ganzzahlige Dauer von einer bis fünf Sekunden. Das Eingabeverzeichnis und das übergeordnete Verzeichnis der Ausgabe müssen für diesen ersten Lauf bereits vorhanden und voneinander getrennt sein; die Ausgabe selbst muss außerhalb der Eingabe liegen. Eine vorhandene Ausgabe muss abgewiesen werden, damit ein neuer Lauf gute Ergebnisse nicht überschreibt. Lass keine zwei schreibenden Prozesse gleichzeitig denselben Ausgabepfad verwenden. Diese Prüfungen behandeln normale Fehler; sie garantieren keine sicheren gleichzeitigen Schreibzugriffe.
Lies vor dem Schreiben die neuen Teile. realpath wandelt das vorhandene Eingabeverzeichnis in einen absoluten Pfad um und gibt jeder Eingabe ein sicheres Verzeichnispräfix. Mit shopt -s nullglob wird ein *.wav ohne Treffer zu null Elementen statt zu einem wörtlichen Pfad mit Stern. files=(...) speichert die Treffer als Array. Die Anführungszeichen um das Verzeichnis bewahren dessen Leerzeichen, während das nicht zitierte *.wav weiterhin Dateinamen abgleicht. ${#files[@]} zählt die Elemente und "${files[@]}" übergibt jedes einzeln.
$(command) erfasst die Ausgabe eines Befehls. || exit 2 beendet das Skript, wenn dieser Befehl fehlschlägt. Zwischen Tests bedeutet || ODER: [ -e "$2" ] || [ -L "$2" ] behandelt beide Arten vorhandener Ziele als Grund zur Ablehnung.
case wählt einen Zweig; 1|2|3|4|5 erlaubt einen dieser Werte. [ -e path ] prüft, ob ein Ziel existiert; -L erkennt auch einen symbolischen Link ohne vorhandenes Ziel. ${source##*/} entfernt das längste auf / endende Präfix und lässt nur den Dateinamen übrig. if ! command nimmt den Fehlerzweig, wenn der Befehl einen Status ungleich Null liefert. >&2 schreibt die Erklärung in den Fehlerstrom und exit 1 beendet den Lauf mit einem Fehler.
Ersetze das vorbereitete, unvollständige batch.sh durch diese erste funktionierende Version. Sie ist für die intakten Eingaben dieses Labs gedacht. Eine fehlgeschlagene Konvertierung liefert einen Status ungleich Null, kann aber ein teilweise gefülltes neues Verzeichnis hinterlassen. Das nächste geführte Lab zeigt, wie du diese Veröffentlichung verhinderst.
cat > batch.sh <<'BASH'
#!/usr/bin/env bash
if [ "$#" -ne 3 ]; then
printf 'Usage: batch.sh INPUT OUTPUT SECONDS\n' >&2
exit 2
fi
case "$3" in 1|2|3|4|5) ;; *) exit 2 ;; esac
if [ -e "$2" ] || [ -L "$2" ]; then
printf 'Output already exists\n' >&2
exit 2
fi
input=$(realpath -- "$1") || exit 2
shopt -s nullglob
files=("$input"/*.wav)
if [ "${#files[@]}" -eq 0 ]; then
printf 'No WAV inputs\n' >&2
exit 1
fi
mkdir -- "$2" || exit 1
make_preview() {
ffmpeg -nostdin -v error -i "$1" -t "$3" -c:a pcm_s16le "$2"
}
for source in "${files[@]}"; do
name=${source##*/}
if ! make_preview "$source" "$2/$name" "$3"; then
printf 'Could not convert: %s\n' "$name" >&2
exit 1
fi
done
printf 'Published %s previews\n' "${#files[@]}"
BASH
Erstelle nun den Drei-Sekunden-Lauf im neuen Verzeichnis previews. Der veröffentlichte Ordner muss genau eine passende WAV-Datei pro Eingabe mit unverändertem Namen enthalten und darf keine zusätzlichen Dateien haben.
bash batch.sh input previews 3
Erwartet wird Published 3 previews. Lade Listening Room neu. Spiele unter Your listening pack alle drei Ausschnitte ab, springe innerhalb der Aufnahmen und lade einen herunter. Jeder dauert drei Sekunden und enthält den Anfang seiner eigenen Aufnahme, auch -closing. Die Einzelversuche bleiben getrennt erhalten.
Wiederhole den Befehl anschließend bewusst in Workspace. Die Ablehnung ist erwartet; die Umgebung ist nicht defekt.
bash batch.sh input previews 3
printf 'Repeat exit: %s\n' "$?"
Erwartet werden Output already exists und Repeat exit: 2. Behalte den gelungenen Lauf und wähle für künftige Versuche einen anderen neuen Ausgabenamen. Auch bei leerer Eingabe kann das Skript klar fehlschlagen, statt ein nützliches Paket vorzutäuschen. Du hast nun eine wiederverwendbare Stapelverarbeitung; als Nächstes verbesserst du ihr Verhalten bei einer beschädigten Aufnahme.
Zusammenfassung
Du hast abspielbares Audio erzeugt, vollständige Dateinamen mit Anführungszeichen bewahrt und eine Funktion mit einer Array-Schleife zu einer wiederverwendbaren Bash-Stapelverarbeitung verbunden. Du hast native Exitstatus gelesen und das Überschreiben eines bestehenden Hörprobenpakets verweigert. Das nächste Lab ergänzt ein Zwischenverzeichnis, damit fehlgeschlagene Konvertierungen kein unvollständiges neues Paket veröffentlichen.



