MP4 to MP3 Umwandeln

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.536
Punkte für Reaktionen
1.372
Punkte
234
Also bei mir funktioniert es noch nach wie vor.

Entscheidend ist die Zeile: Error while opening decoder for input stream #0:1 : Operation not permitted
Kannst du das Skript mal bitte von einem anderen User ausführen lassen - idealerweise als ein Admin oder root?

Ich habe es mal noch etwas 'verschönert':
Bash:
#!/bin/sh

#------------------------- Variablen:
infolder="/volume1/docker/handbrake/storage/mp4/" # Quellverzeichnis
outfolder="/volume1/docker/handbrake/output/" # Zielverzeichnis

# optional Quelldateien in Papierkorb verschieben lassen / sonst leer lassen:
delfolder="/volume1/docker/handbrake/storage/mp4/#recycle"     # Löschverzeichnis der Quelldateien

#--------------------------------------------------
if [ ! -d "${outfolder}" ] || [ ! -d "${infolder}" ]; then
    echo "Pfade prüfen!" > "${outfolder%/}/info.log"
    exit
fi

IFS=$'\012'
for i in $(find "$infolder" -name "*.mp4" -type f); do
    title=$(basename $i)
    title=${title%.*}
    echo "bearbeite $i" >> "${outfolder%/}/info.log"
    ffmpegLog=$(ffmpeg -y -i "$i" -ab 192k -vn "${outfolder%/}/${title}.mp3" 2>&1)
    echo "$ffmpegLog" >> "${outfolder%/}/info.log"
    if [ -d "$delfolder" ] ; then
        echo "verschiebe $i nach $delfolder" >> "${outfolder%/}/info.log"
        mv "$i" "$delfolder"
    fi
done
 

rmk-andre

Benutzer
Mitglied seit
30. Aug 2021
Beiträge
34
Punkte für Reaktionen
2
Punkte
14
ich hab es als Aufgabe gemacht und funktioniert wenn ich root als benutzereinstelle. eine frage kann ich mehrere Ordner umwandeln so das sie im output auch so wieder erstellt werden
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.536
Punkte für Reaktionen
1.372
Punkte
234
Ich habe es für dich mal so angepasst, dass Unterordner mit abgebildet werden:

Bash:
#!/bin/sh

#------------------------- anzupassende Variablen -------------------------
# Quellverzeichnis:
    infolder="/volume1/docker/handbrake/input/"
# Zielverzeichnis:
    outfolder="/volume1/docker/handbrake/output/"
# optional Quelldateien in Papierkorb verschieben lassen / sonst leer lassen:
    delfolder="/volume1/docker/handbrake/storage/mp4/#recycle"

#------------------------- ab hier nichts mehr ändern -------------------------
log="${outfolder%/}/info.log"

if [ ! -d "${outfolder}" ] || [ ! -d "${infolder}" ]; then
    echo "ERROR: Pfade prüfen!"
    exit
fi

IFS=$'\012'
for i in $(find "$infolder" -name "*.mp4" -type f); do
    filename=$(basename $i)
    title=${filename%.*}
    subdir=$(sed "s~$infolder~~g;s~$filename~~g;" <<< "$i")
    outfoldertmp="${outfolder%/}/${subdir}"
    echo "bearbeite $i" >> "$log"
    mkdir -p "${outfoldertmp}"
    ffmpegLog=$(ffmpeg -y -i "$i" -ab 192k -vn ${outfoldertmp%/}/${title}.mp3 2>&1)
    echo "$ffmpegLog" >> "$log"
    if [ -d "$delfolder" ] ; then
        delfoldertmp="${delfolder%/}/${subdir}"
        mkdir -p "$delfoldertmp"
        echo "verschiebe $i nach $delfoldertmp" >> "$log"
        mv "$i" "${delfoldertmp%/}"
    fi
done
 
Zuletzt bearbeitet:

Mayo_248

Benutzer
Mitglied seit
12. Feb 2022
Beiträge
3
Punkte für Reaktionen
2
Punkte
53
Hallo,

der Code hat mir sehr weiter geholfen, jedoch ist die output-Datei bei mir ebenfalls 0 Byte große.
Dies scheint laut dem Log aber nicht an den Rechten zu liegen, sondern eher an einem fehlenden decoder,
doch wie kann ich diesen nachträglich installieren?

Fehlerauszug:
"Decoder (codec aac) not found for input stream #0:0"

PS: Log ist im Anhang.
Mir ist bewust, dass dieser Beitrag schon etwas älter ist, doch hoffentlich kann trotzdem jemand helfen.
DS 1621+ DSM 7.1-42661 Update 2
 

Anhänge

  • info.txt
    5,4 KB · Aufrufe: 0

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.536
Punkte für Reaktionen
1.372
Punkte
234
In ffmpeg von DSM7.1 ist kein AAC En- und Decoder mehr enthalten. Lade dir von Synnocomunity das ffmpeg und passe ggf. die Pfade im Skript an.
 
  • Like
Reaktionen: Mayo_248

Mayo_248

Benutzer
Mitglied seit
12. Feb 2022
Beiträge
3
Punkte für Reaktionen
2
Punkte
53
Danke für die schnelle Antwort, ich werde mich da mal reinfuchsen.

Ist es richtig, dass ich das AAC-Audio-File mit dem zusätzlichen Comando "-acodec copy" und dem ausgabeformat AAC, einfach extrahieren kann.
Zumindest in einem Kurzen Test mit deinem Script hat es super geklappt.
Ich frage mich nur ob ich mir damit ggf. Fehler einbaue, oder ggf. ganz am Thema vorbei rausche.

Könntest du bitte etwas genauer auf "passe ggf. die Pfade im Skript an", das Paket ist ja schnell installiert, aber danach ist auch erstmal bei mir ende.
Wie bringe ich der DS bei, dieses FFmpeg Paket zu benutzen ?
Meine Englischkenntnisse sind hierfür wahrscheinlich nicht ausreichend.

Gruß Mayo
 
Zuletzt bearbeitet:

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.536
Punkte für Reaktionen
1.372
Punkte
234
Ist es richtig, dass ich das AAC-Audio-File mit dem zusätzlichen Comando "-acodec copy" und dem ausgabeformat AAC, einfach extrahieren kann.
Zumindest in einem Kurzen Test mit deinem Script hat es super geklappt.
Ja, dass sollte so gehen.
ffmpeg -i "$quelldatei" -c:a copy -vn "/pfad/audiospur.m4a"
Die Dateiendung solltest du hier vorher wissen / bei mp4 ist es meistens ein aac Stream, also dann ein m4a-Container.
-c:a copy ist das gleiche wie -acodec copy

Könntest du bitte etwas genauer auf "passe ggf. die Pfade im Skript an", das Paket ist ja schnell installiert, aber danach ist auch erstmal bei mir ende.
Wie bringe ich der DS bei, dieses FFmpeg Paket zu benutzen ?
Das Paket überschreibt das ffmpeg der DS nicht, sondern installiert es parallel. Um es explizit zu nutzen, muss es auch direkt im Skript angesprochen werden. Am besten, man legt den Pfad in eine Variable, falls man es an mehreren Stellen brauchen sollte.

Bash:
ffmpeg=/usr/local/ffmpeg/bin/ffmpeg
$ffmpeg -i "$i" -c:a copy -vn "/pfad/audiospur.m4a"

Edit:
offenbar ist der Pfad ab DSM7 ein anderer:
Bash:
ffmpeg=/var/packages/ffmpeg/target/bin/ffmpeg
$ffmpeg -i "$i" -c:a copy -vn "/pfad/audiospur.m4a"

oder:
Bash:
ffmpeg=/volume1/@appstore/ffmpeg/bin/ffmpeg  # hier ggf. das Volume anpassen, wenn nicht auf Volume1 installiert
$ffmpeg -i "$i" -c:a copy -vn "/pfad/audiospur.m4a"
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Mayo_248

#user#

Benutzer
Mitglied seit
24. Apr 2023
Beiträge
2
Punkte für Reaktionen
1
Punkte
53
Hallo zusammen,
ich versuche wie Mayo_248 den Fehler zu finden (MP3 sind 0Bytes groß)

Fehlercode:
bearbeite /volume1/60_Musik/test1/Barfuß am Klavier.mp4
ffmpeg version 4.1.8 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 8.5.0 (GCC)
configuration: --prefix=/usr --incdir='${prefix}/include/ffmpeg' --arch=i686 --target-os=linux --cross-prefix=/usr/local/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu- --enable-cross-compile --enable-optimizations --enable-pic --enable-gpl --enable-shared --disable-static --disable-stripping --enable-version3 --enable-encoders --enable-pthreads --disable-protocols --disable-protocol=rtp --enable-protocol=file --enable-protocol=pipe --disable-muxer=image2 --disable-muxer=image2pipe --disable-swscale-alpha --disable-ffplay --disable-ffprobe --disable-doc --disable-devices --disable-bzlib --disable-altivec --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libmp3lame --disable-vaapi --disable-cuvid --disable-nvenc --disable-decoder=aac --disable-decoder=aac_fixed --disable-encoder=aac --disable-decoder=amrnb --disable-decoder=ac3 --disable-decoder=ac3_fixed --disable-encoder=zmbv --disable-encoder=dca --disable-decoder=dca --disable-encoder=ac3 --disable-encoder=ac3_fixed --disable-encoder=eac3 --disable-decoder=eac3 --disable-encoder=truehd --disable-decoder=truehd --disable-encoder=hevc_vaapi --disable-decoder=hevc --disable-muxer=hevc --disable-demuxer=hevc --disable-parser=hevc --disable-bsf=hevc_mp4toannexb --x86asmexe=yasm --cc=/usr/local/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu-wrap-gcc --enable-yasm --enable-libx264 --enable-encoder=libx264
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/volume1/60_Musik/test1/Barfuß am Klavier.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:03:15.36, start: 0.000000, bitrate: 629 kb/s
Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, 128 kb/s (default)
Metadata:
handler_name : ISO Media file produced by Google Inc.
Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1080x1080 [SAR 1:1 DAR 1:1], 495 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : ISO Media file produced by Google Inc.
Stream mapping:
Stream #0:0 -> #0:0 (? (?) -> mp3 (libmp3lame))
Decoder (codec aac) not found for input stream #0:0

Script:
Bash:

#!/bin/sh

#------------------------- Variablen:
infolder="/volume1/60_Musik/test1/" # Quellverzeichnis
outfolder="/volume1/60_Musik/test1mp3/" # Zielverzeichnis

# optional Quelldateien in Papierkorb verschieben lassen / sonst leer lassen:
delfolder="/volume1/60_Musik/test1mp3/#recycle" # Löschverzeichnis der Quelldateien

#--------------------------------------------------



log="${outfolder%/}/info.log"

if [ ! -d "${outfolder}" ] || [ ! -d "${infolder}" ]; then
echo "ERROR: Pfade prüfen!"
exit
fi


IFS=$'\012'
ffmpeg=/var/packages/ffmpeg/target/bin/ffmpeg
$ffmpeg -i "$i" -c:a copy -vn "/pfad/audiospur.m4a"
for i in $(find "$infolder" -name "*.mp4" -type f); do
filename=$(basename $i)
title=${filename%.*}
subdir=$(sed "s~$infolder~~g;s~$filename~~g;" <<< "$i")
outfoldertmp="${outfolder%/}/${subdir}"
echo "bearbeite $i" >> "$log"
mkdir -p "${outfoldertmp}"
ffmpegLog=$(ffmpeg -y -i "$i" -ab 192k -vn ${outfoldertmp%/}/${title}.mp3 2>&1)
echo "$ffmpegLog" >> "$log"
if [ -d "$delfolder" ] ; then
delfoldertmp="${delfolder%/}/${subdir}"
mkdir -p "$delfoldertmp"
echo "verschiebe $i nach $delfoldertmp" >> "$log"
mv "$i" "${delfoldertmp%/}"
fi
done


was läuft bei mir falsch? habe das ffmpeg 6.0 über die Synnocomunity installiert.

Hilfe :)
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.536
Punkte für Reaktionen
1.372
Punkte
234
Herzlich willkommen hier im Forum :)

Folgende Zeilen geben Aufschluss:
ffmpeg version 4.1.8 Copyright (c) 2000-2021 the FFmpeg developers
Decoder (codec aac) not found for input stream #0:0

Offensichtlich wird nicht deine manuell installierte ffmpeg-Version genutzt.

Ich hab mir mal die Version 6 von ffmpeg installiert. Diese erreicht man über diesen Pfad: /usr/local/bin/ffmpeg6. Also mal bitte die nachstehende Zeilen so ändern:
Bash:
ffmpeg=/usr/local/bin/ffmpeg6
...
ffmpegLog=$($ffmpeg -y -i "$i" -ab 192k -vn "${outfoldertmp%/}/${title}.mp3" 2>&1)

PS: Bitte Code auch als solchen posten, damit man es besser lesen kann - danke :)
Bildschirmfoto 2023-04-24 um 11.24.59.png

PPS: diese zwei Zeilen bringen dir nichts, wenn du sie einfach in das Skript einfügst:
Code:
ffmpeg=/var/packages/ffmpeg/target/bin/ffmpeg
$ffmpeg -i "$i" -c:a copy -vn "/pfad/audiospur.m4a"
 
Zuletzt bearbeitet:

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.536
Punkte für Reaktionen
1.372
Punkte
234
Hier nochmal als Ganzes mit definierbarer ffmpeg-Version:

Bash:
#!/bin/bash

#------------------------- anzupassende Variablen -------------------------
# Quellverzeichnis:
    infolder="/volume1/docker/handbrake/input/"
# Zielverzeichnis:
    outfolder="/volume1/docker/handbrake/output/"
# optional Quelldateien in Papierkorb verschieben lassen / sonst leer lassen:
    delfolder="/volume1/docker/handbrake/storage/mp4/#recycle"
# gewünschte ffmpeg-Version definieren (>= DSM7):
    # originale Syno-Version:
    ffmpeg=$(which ffmpeg)
    # ffmpeg 6 von synocommunity:
    ffmpeg=/usr/local/bin/ffmpeg6


#------------------------- ab hier nichts mehr ändern -------------------------
log="${outfolder%/}/info.log"

if [ ! -d "${outfolder}" ] || [ ! -d "${infolder}" ]; then
    echo "ERROR: Pfade prüfen!"
    exit
fi

IFS=$'\012'
for i in $(find "$infolder" -name "*.mp4" -type f); do
    filename="$(basename $i)"
    title="${filename%.*}"
    subdir="$(sed "s~$infolder~~g;s~$filename~~g;" <<< "$i")"
    outfoldertmp="${outfolder%/}/${subdir}"
    echo "bearbeite $i" >> "$log"
    mkdir -p "${outfoldertmp}"
    ffmpegLog=$($ffmpeg -y -i "$i" -ab 192k -vn "${outfoldertmp%/}/${title}.mp3" 2>&1)
    echo "$ffmpegLog" >> "$log"
    if [ -d "$delfolder" ] ; then
        delfoldertmp="${delfolder%/}/${subdir}"
        mkdir -p "$delfoldertmp"
        echo "verschiebe $i nach $delfoldertmp" >> "$log"
        mv "$i" "${delfoldertmp%/}"
    fi
done
 
Zuletzt bearbeitet:

#user#

Benutzer
Mitglied seit
24. Apr 2023
Beiträge
2
Punkte für Reaktionen
1
Punkte
53
jawohl jetzt hat es funktioniert, vielen Dank! :) und danke für die Erklärungen! :)
Grüße Tobias
 
  • Like
Reaktionen: geimist


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat