ich hab ne batch datei geschrieben die mir aus allen mp4 und webm dateien aus einem ordner den musikstream rausholt, die tags kopiert und ein albumart generiert.
mit allen formaten die aac spuren tragen geht das auch, aber bei vorbis kann ich das album art nicht reinspeichern.
setlocal EnableDelayedExpansion
if not exist "convertedFiles" mkdir convertedFiles
if not exist "originalFiles" mkdir originalFiles
if not exist "tmp" mkdir tmp
for %%a in ("originalFiles/*.*") do (
set "inputName=%%a"
set "inputPath=originalFiles/%%a"
set "type=!inputName:~-4,4!"
set "tmpArt=tmp/%%a.png"
set "newtype=.m4a"
set "fin=convertedFiles/!inputName:~0,-4!!newtype!"
set "tmpAudio=tmp/%%a!newtype!"
if "!type!" == "webm" (
set "newtype=.ogg"
set "fin=convertedFiles/!inputName:~0,-5!!newtype!"
rem bei webm muss eins mehr weggemacht werden, weil sonst 2 punkte in fin sind
set "tmpAudio=tmp/%%a!newtype!"
)
ffmpeg -y -ss 4 -i "!inputPath!" -vf "pad=iw*2:ih:iw/2:0:black, crop=ih:ih, select=gte(n\,100)" -vframes 1 "!tmpArt!"
ffmpeg -i "!inputPath!" -y -map audio -codec:a copy -map_metadata 0 "!tmpAudio!"
rem m4a
if "!newtype!" == ".m4a" (
atomicparsley "!tmpAudio!" --artwork "!tmpArt!" -o "!fin!"
)
rem ogg
if "!newtype!" == ".ogg" (
ffmpeg -y -i "!tmpAudio!" -i "!tmpArt!" -map 0:0 -map 1:0 -c copy -id3v2_version 3 -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (Front)" "!fin!"
)
)
unten unter "rem ogg"
da sollte normalerweise per ffmpeg das album art aus ner png in die ogg gepackt werden. Die png wird auch zuverlässig erzeugt.
fehlermeldungen sind folgende:
[ogg @ 000000000440a1e0]Unsupported codec id in stream 1
und
Could not write header for output file #0 (incorrect codec parameters ?): Error number -22 occurred
Anscheinend werden tags bei oggs als vorbiscomment in form einer hashmap gespeichert. Der Name des vorbiscomments für album arts lautet "METADATA_BLOCK_PICTURE". Nur leider habe ich noch kein Programm mit dem ich ein vorbiscomment speichern kann gefunden.
ich hab zudem anstelle von atomicparsley jetzt mp4box drin, weil atomicparsley nicht alle generierten jpgs erkannt hat. Ich hab es momentan so drin, das oggs ohne albumart gespeichert werden. Hier der aktuelle code der auch soweit funktioniert:
setlocal EnableDelayedExpansion
if not exist "convertedFiles" mkdir convertedFiles
if not exist "originalFiles" mkdir originalFiles
if not exist "tmp" mkdir tmp
for %%a in ("originalFiles/*.*") do (
set "inputName=%%a"
set "inputPath=originalFiles/%%a"
set "type=!inputName:~-4,4!"
set "tmpArt=tmp/%%a.jpg"
set "newtype=.m4a"
set "fin=convertedFiles/!inputName:~0,-4!!newtype!"
set "tmpAudio=tmp/%%a!newtype!"
set "tmpAudioName=%%a!newtype!"
if "!type!" == "webm" (
set "newtype=.ogg"
set "fin=convertedFiles/!inputName:~0,-5!!newtype!"
rem bei webm muss eins mehr weggemacht werden, weil sonst 2 punkte in fin sind
rem tmpaudio neu einstellen wegen den neuen newtype
set "tmpAudio=tmp/%%a!newtype!"
set "tmpAudioName=%%a!newtype!"
)
ffmpeg -y -ss 4 -i "!inputPath!" -vf "pad=iw*2:ih:iw/2:0:black, crop=ih:ih, select=gte(n\,100)" -vframes 1 "!tmpArt!"
ffmpeg -i "!inputPath!" -y -map audio -codec:a copy -map_metadata 0 "!tmpAudio!"
rem m4a
if "!newtype!" == ".m4a" (
rem atomicparsley "!tmpAudio!" --artwork "!tmpArt!" -o "!fin!"
rem atomicparsley erkennt nicht alle jpgs
mp4box -itags cover="!tmpArt!" "!tmpAudio!"
move "tmp\!tmpAudioName!" "convertedFiles"
ren "convertedFiles\!tmpAudioName!" "!inputName:~0,-4!!newtype!"
)
rem ogg
if "!newtype!" == ".ogg" (
rem ffmpeg -y -i "!tmpAudio!" -i "!tmpArt!" -map 0:0 -map 1:0 -c copy -id3v2_version 3 -metadata:s:v title="Album cover" -metadata:s:v comment="METADATA_BLOCK_PICTURE" -codec:v libtheora "!fin!"
copy "tmp\!inputName!!newtype!" "convertedFiles"
ren "convertedFiles\!inputName!!newtype!" "!inputName:~0,-5!!newtype!"
)
)