x
Blog Digitalgesellschaft Verwaltungsbetrieb Textarchiv Textarchiv Walter Kirk (✝) Impressum
Audiobook erstellen (.m4b) - II: Automatik
Automatisierte ErstellungAnpassungenmeta.txtDateinamenErstellung der ListenErstellung der .m4bBash-ScriptErgebnisErgänzte meta.txtDarstellung in CozyKapitelnamen nachträglich ändernZusammenfassung
Wer eine vollständig automatisierte Erstellung von .m4b bevorzugt, sollte sich das Bash-Script chapters.sh von Jeff Channel ansehen, das auf .m4b umgestellt und auf die eigenen Verhältnisse angepasst werden kann. Download unter: FFMETADATA Chapter generator.
Das Ergebnis ist gut, wenn man die Verhältnisse bei .mp4 berücksichtigt. Für die Erstellung von .m4b sind folgende Anpassungen sinnvoll.
Die Anpassungen setzen die im Blogpost Audiobook erstellen (.m4b) aufgeführten Bedingungen voraus.
Die bereit gestellten Audiobook/Podcast enthalten nicht immer die korrekten Metadaten. Deshalb ist die meta.txt manuell im Teil oberhalb der Angaben für [Chapter] zu ergänzen. Beispiel:
xxxxxxxxxx;FFMETADATA1major_brand=M4Aminor_version=512compatible_brands=M4A isomiso2title=Der Schatz im Silberseesubtitle=artist=Karl Mayauthor=Karl Maydirector=composer=lyricist=narrator=album_artist=Martin Seifertalbum=Der Schatz im Silberseedate=2020-09-10url=umid=date_recorded=recording_location=producer=producer/email=copyright=Mitteldeutscher Rundfunkcomment=ungekürzte Lesung, compiled 2024-10-31description=Auf der Suche nach Reichtümern ziehen der Bandit Cornel Brinkley und seine Tramps zum Silbersee. Old Firehand, Winnetou und Old Shatterhand haben das gleiche Ziel. Wer wird zuerst ankommen?synopsis=genre=Audiobookencoder=Lavf60.3.100
Das Script fügt die Kapitelmarker automatisiert in die meta.txt ein.
Das Script setzt voraus, dass die Dateinamen als Kapitelnamen genutzt werden. Deshalb ist hier darauf zu achten, dass die Dateinamen entsprechend der Gliederung korrekt ausgewählt sind, z.B. Folge 1.mp3 oder Folge 1: Text.mp3.
Damit die natürliche Reihenfolge der Dateien erfolgt, und zwar von 1-9 und nicht 01-09, wird die Erstellung der Listen entsprechend eingestellt:
xxxxxxxxxxprintf "%s\n" *.m4b | sort -V > "${file_list}"printf "file '%s'\n" *.m4b | sort -V > "${input_list}"
Mit der Sortierung unter Angabe sort -V wird dies erreicht.
Da die Videospur nicht vorhanden ist, wird die Ausführung von FFmpeg entsprechend angepasst.
xxxxxxxxxxffmpeg -f concat -safe 0 -i "${input_list}" -i "${meta_file}" -map_metadata 1 -vn -codec copy "${final_m4b}" -v quiet
Der Schalter -vn bewirkt, dass die Videospur nicht berücksichtigt wird, sodass keine neue Transcodierung stattfindet.
xxxxxxxxxx#!/bin/bash# Original chapters.sh by copyrigt Jeff Channel# https://gist.github.com/bdurrow/b51470869dd72b2333407dbfcb947801# Adapted Version# copyright Wolfgang Kirkset -euo pipefailIFS=$'\n\t'## Script to merge all m4b in current directory## And update chapter marks to retain the folder/filename## Script for merging .m4b# 1. Schritt Transcodieren nach m4b# for f in *.mp3; do ffmpeg -i "$f" -vn -ac 2 -ar 48000 -b:a 320k -c:a aac "${f%.mp3}.m4b" ; done# 2. Schritttemp_dir=$(mktemp -d)function finish {rc=$?if [[ $rc != 0 ]]; thenechoecho "FAILED!"fiecho -n "Cleaning up "rm -rf "${temp_dir}"echo "..........[ DONE ]"exit $rc}trap finish EXITcurrent_dir=$(pwd)bname=$(basename ${current_dir})final_m4b=${bname}.m4binput_list=input-list.txtfile_list=filelist.txtmeta_file=meta.txt# 3. Schritt Prüfung auf Gesamtdatei#Hopefully this will work for either BSD or GNU sedextended_match="-r"echo "" | sed ${extended_match} 's|foo|bar|' 2>/dev/null || extended_match="-E"if [ -e "${final_m4b}" ]; thenecho "${final_m4b} already exists, please remove it."exit 1fi# 4 Schritt Listen erstellen.echo -n "Generating file lists "printf "%s\n" *.m4b | sort -V > "${file_list}"printf "file '%s'\n" *.m4b | sort -V > "${input_list}"echo "..........[ DONE ]"# 5. Schritt Chaptermarks erstellen## chapter marks#Do this first so we fail early#TODO: Test (‘=’, ‘;’, ‘#’, ‘\’) are escapedts=0echo -n "Generating chapter marks "# ffmpeg -i "$(head -1 "${file_list}")" -f ffmetadata "${meta_file}" -v quietcat "${file_list}" | while read filedods=$(ffprobe -v quiet -of csv=p=0 -show_entries format=duration "${file}")# echo "$ds"escaped_title=$(echo ${file} | sed ${extended_match} -e 's|([=;#\])|\\\1|g' -e 's|.[Mm][Pp]4$||' )# escaped_title=$(echo ${bname} | sed ${extended_match} -e 's|([=;#\])|\\\1|g' -e 's|.[Mm][Pp]4$||' )echo "[CHAPTER]" >> "${meta_file}"echo "TIMEBASE=1/1" >> "${meta_file}"echo "START=${ts}" >> "${meta_file}"ts=$(awk "BEGIN {print ${ts}+${ds}; exit}")echo "END=${ts}" >> "${meta_file}"# echo "TITLE=${escaped_title}" >> "${meta_file}"echo "TITLE=${file%.*}" >> "${meta_file}"doneecho "..........[ DONE ]"# 6. Schrittecho -n "Merging the files "ffmpeg -f concat -safe 0 -i "${input_list}" -i "${meta_file}" -map_metadata 1 -vn -codec copy "${final_m4b}" -v quietecho "..........[ DONE ]"echo "Job Completed."# 7. Schritt Art-Cover einfügenfor f in ./*.m4b; do AtomicParsley "$f" --artwork cover.jpg --overWrite ; done# 8. Schritt Ordner bereinigenmv "$(basename "$(pwd)")".m4b ./gesamt/ &&mv *.jpg .txt ./sonstiges/ && mv *.m4b ./m4b/ && mv *.mp3 ./mp3/ && mv *.mpga* ./mp3/
Ein Temp-Ordner wird bei dieser Ausführung nicht genutzt, weil die .txt aufbewahrt werden sollen.
Bei umfangreichen .m4b zeigt das Script seine Stärken. Im Bild unten wird ein Beispiel aufgezeigt, das insgesamt 38 Kapitel umfasst und ohne Schwierigkeiten erstellt wurde.
xxxxxxxxxx;FFMETADATA1major_brand=M4Aminor_version=512compatible_brands=M4A isomiso2title=Der Schatz im Silberseesubtitle=artist=Karl Mayauthor=Karl Maydirector=composer=lyricist=narrator=album_artist=Martin Seifertalbum=Der Schatz im Silberseedate=2020-09-10url=umid=date_recorded=recording_location=producer=producer/email=copyright=Mitteldeutscher Rundfunkcomment=ungekürzte Lesung, compiled 2024-10-31description=Auf der Suche nach Reichtümern ziehen der Bandit Cornel Brinkley und seine Tramps zum Silbersee. Old Firehand, Winnetou und Old Shatterhand haben das gleiche Ziel. Wer wird zuerst ankommen?synopsis=genre=Audiobookencoder=Lavf60.3.100[CHAPTER]TIMEBASE=1/1START=0END=1583.59TITLE=Folge 1[CHAPTER]TIMEBASE=1/1START=1583.59END=3316.13TITLE=Folge 2[CHAPTER]TIMEBASE=1/1START=3316.13END=5106.41TITLE=Folge 3usw.
Das .m4b als Ergebnis in Cozy angezeigt:

Änderungen der Kapitelnamen lassen sich in eine vorhandene .m4b einfügen. Dazu ist die meta.txt zu ergänzen/ändern:
xxxxxxxxxx[CHAPTER]TIMEBASE=1/1START=0END=1583.59# TITLE=Folge 1 # altTITLE=Folge 1: Beispiel
Die geänderte meta.txt wird in die .m4b übertragen. Danach muss die vorhandene cover.jpg neu eingefügt werden. Beide Vorgänge können mit einem Bash-Script vereinfacht erledigt werden. Hierzu müssen die Dateien .m4b, meta.txt und cover.jpg in einem Verzeichnis gespeichert sein.
xxxxxxxxxxbin/bash# 1. Schritt: Neue Metadaten einfügenffmpeg -i *.m4b -i meta.txt -map_metadata 1 -map_chapters 1 -vn -codec copy "test.m4b"# 2. Schritt Art-Cover einfügenfor f in *.m4b; do AtomicParsley "$f" --artwork cover.jpg --overWrite ; done
Im obigen Beispiel ist das Audiobook mit 38 Folgen in Cozy dargestellt. Nun lasen sich die einzelnen Folgen auch unter die vom Autor vorgegebenen Kapitel zusammen fassen, also 1=Folge 1-8, etc.. So ergibt sich eine komplett andere Darstellung.

Die Ausführung mit dem (angepassten) Bash-Script ist insbesondere bei umfangreichen Audiobook eine vorteilhafte Lösung. Eine nachträgliche Änderung der Meta-Daten kann ebenfalls mit einem Bash-Script vereinfacht erfolgen.

Wolfgang Kirk

Veröffentlicht: 2024-11-01, 09:30 Uhr aktualisiert: 2024-12-05, 07:15 Uhr