Musik Konvertieren + Skript

Status
Für weitere Antworten geschlossen.

hvkls

Benutzer
Mitglied seit
23. Dez 2012
Beiträge
463
Punkte für Reaktionen
0
Punkte
22
Skript beginnt immer mit #!/...... das weis ich ich habs eher so vom Code das ich da irgend wie ein anhalts Punkt hätte ;) ??

Das "Shebang" gibt an, welches Programm die Befehle ausgeführt ausführen soll. Dies Programm wird als "Darumherum" auch "Shell" genannt. Standardmäßig ist das "#! /bin/sh". DSM nutzt dafür "ash" in der busybox-Variante. Probier also in deinem Script zunächst "#! /bin/sh" aus. Wenn es aus irgendeinem Grund denn unbedingt die "bash" sein soll, ersetz "#! /bin/bash" in deinem Script doch mal durch "#! /usr/syno/synoha/bin/bash".
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.672
Punkte für Reaktionen
2.074
Punkte
829
Dann musst Du die bash aber per ipkg vorher installieren, wenn Du nicht eine Atom-DS hast.
 

cp389

Benutzer
Mitglied seit
07. Jan 2014
Beiträge
532
Punkte für Reaktionen
5
Punkte
44
Ich überleg schon die ganze Zeit, ob ich hier wirklich antworten soll, denn irgendwie läuft das m.M.n. in eine komische Richtung.

Wir hier schonmal erwähnt wurde, kann man dazu auch ffmpeg nutzen und das ist bereits vorinstalliert. Für die reine Konvertierung benötigt es kein Script, sondern einfach den Aufruf von ffmpeg.
Ich würde mich erstmal mit ffmpeg vertraut machen und "zu Fuß" ein paar Files konvertieren.

Das funktioniert am einfachsten so:
Rich (BBCode):
ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

Wenn das soweit passt, kann man anfangen, über ein Script nachzudenken. Jedoch sollte dann auch klar sein, was das Script eigentlich machen soll, denn das wurde hier noch gar nicht gesagt. Für die reine Konvertierung braucht es keins.
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.672
Punkte für Reaktionen
2.074
Punkte
829
Schön, dass Du trotzdem geantwortet und das Thema (hoffentlich) in die richtige Richtung gelenkt hast. ffmpeg ist ein mächtiges Tool, dass ich bisher nur für Videofiles einsetze. Deshalb habe ich es im Zusammenhang mit Audio nicht richtig auf dem Schirm.
 

cp389

Benutzer
Mitglied seit
07. Jan 2014
Beiträge
532
Punkte für Reaktionen
5
Punkte
44
Der oben genannte ffmpeg-Befehl führt bei mir zu sehr guten Ergebnissen, wenn ich als Quelle eine WMV-Datei nutze und als Ziel ein MP3.
Sind in der WMV-Datei auch die ID3-Tags und Cover gepflegt, werden diese in die Ziel-Datei 1:1 übernommen.

Der Parameter -qscale:a 2 führt übrigens dazu, dass die Zieldatei eine variable Bitrate bekommt, die in etwa bei 180kBit/s liegt. So nutze ich das auch sonst.
 

hvkls

Benutzer
Mitglied seit
23. Dez 2012
Beiträge
463
Punkte für Reaktionen
0
Punkte
22
Eine typische Anwendung wäre wahrscheinlich, mp4a-Dateien in mp3 umzuwandeln, um DRM loszuwerden. Wenn man allerdings über wav geht, verliert man die MP3-Tags. Man müsste sie vorher sichern und nachher wieder hinzufügen.

Auf Basis von Code von irgendwo aus dem Netz habe ich mal ein Script verbrochen, das keinerlei Wert auf Schönheit legt, sondern rein durch Probieren entstanden ist. Keine Ahnung, was es mit Euren Dateien im aktuellen Verzeichnis anstellen würde :)

Rich (BBCode):
#!/bin/bash
#
# m4a to mp3 and tag transfer
# for music from iPod

# This software is licensed under the GNU General Public License
# For the full text of the GNU GPL, see:
#
# http://www.gnu.org/copyleft/gpl.html
#
# No guarantees of any kind are associated with use of this software.

#requirements: faad, lame, eye3D

#Begin
clear

# variables
version=2013-10-27

current_directory=$( pwd )
mkdir mp3 orig txt playlist 2>/dev/null

echo '#EXTM3U' > playlist/playlist.m3u


for i in *.mp3
do
	w=`echo "$i"|grep -E ".mp3"|sed -e 's/.mp3/.txt/;s/.mp3/.txt/'`
	y="$i"
	eyeD3 "$i" >"$w"
	title=`grep '^title: ' "$w"|sed -e 's@title: @@'`
	artist=`grep '^artist: ' "$w"|sed -e 's@^artist: @@'`
	album=`grep '^album: ' "$w"|sed -e 's@album: @@'`
	track=`grep '^track: ' "$w"|sed -e 's@track: @@;s@[[:space:]]*genre.*@@;s@\(.*\)/.*@\1@'`
	playingtime=`grep '^Time: ' "$w"|sed -e 's@Time: \(.*\)	MPEG.*@\1@'|sed -E 's@(.*):(.+):(.+)@\1*3600+\2*60+\3@;s@(.+):(.+)@\1*60+\2@' | bc`
	#year=`grep '^recording date: ' "$w"|sed -e 's@recording date: @@'`
	# alternatively
	#id3info "$i" >"$w"
	#title=`grep '=== TT2' "$w"|sed -e 's@=== TT2 (Title/songname/content description): @@'`
	#artist=`grep '=== TP1' "$w"|sed -e 's@=== TP1 (Lead performer(s)/Soloist(s)): @@'`
	#album=`grep '=== TAL' "$w"|sed -e 's@=== TAL (Album/Movie/Show title): @@'`
	#track=`grep '=== TRK' "$w"|sed -e 's@=== TRK (Track number/Position in set): \(.*\)/.*@\1@'`
	#totaltracks=`grep '=== TRK' "$w"|sed -e 's@=== TRK (Track number/Position in set): .*/\(.*\)@\1@'`
	#year=`grep '=== TYER' "$w"|sed -e 's@=== TYER (Year): @@'`
	#partset=`grep '=== TPA' "$w"|sed -e 's@=== TPA (Part of a set): \(.*\)/.*@\1@'`
	#parttotal=`grep '=== TPA' "$w"|sed -e 's@=== TPA (Part of a set): .*/\(.*\)@\1@'`

	if echo "$i" | grep -E "^[0-9]" ; then 
		z=$( echo "$i" | awk '{print " - " $1}' )
	else
		z=""
	fi
	# /alternatively
	#[ "$track" -gt "0" ] && [ "$track" -lt "10" ] && track="0$track" 
	#[ ! -z "$track" ] && z=" - $track" || z="$track"
	mv "$w" txt/
	if [ -s "$y" ] ; then
		if [ "$artist$album$z$title" != "" ] ; then
			cp -av "$y" mp3/"$( echo "$artist - $album$z - $title.mp3" | sed -e "s/  / /g ; s/\[/_/g ; s/\]/_/g ; s/[()\!\?\/»«]/_/g ; s/ - .mp3/.mp3/" )" #&& rm "$y"
			echo "#EXTINF:$playingtime, $artist - $title" >> playlist/playlist.m3u
			echo "$( echo "$artist - $album$z - $title.mp3" | sed -e "s/  / /g ; s/\[/_/g ; s/\]/_/g ; s/[()\!\?\/»«]/_/g ; s/ - .mp3/.mp3/" )" >> playlist/playlist.m3u
		else
			cp -av "$y" mp3/
			echo "$y" >> playlist/playlist.m3u
		fi
	fi
	mv "$i" orig/

done

for i in *.m4a *.m4b *.m4v *.mp4
do
	faad "$i"
	w=`echo "$i"|grep -E ".(m4[abv]|mp4)"|sed -e 's/.m4[abv]/.txt/;s/.mp4/.txt/'`
	x=`echo "$i"|grep -E ".(m4[abv]|mp4)"|sed -e 's/.m4[abv]/.wav/;s/.mp4/.wav/'`
	y=`echo "$i"|grep -E ".(m4[abv]|mp4)"|sed -e 's/.m4[abv]/.mp3/;s/.mp4/.mp3/'`

	faad -i "$i" 2>"$w"
	sed -i '23s/unknown: /title: /' "$w"
	sed -i '24s/unknown: /^artist: /' "$w"

	year=` grep '^unknown:[[:space:]]*[[:digit:]]*[[:space:]]*$' "$w"|sed -e 's/unknown: //'`
	sed -i 's/^unknown:[[:space:]]*[[:digit:]]*[[:space:]]*$/year: /' "$w"

	#If you get year problems use this instead
	#year=`grep 'date: ' "$w"|sed -e 's/date: //'`

	sed -i 's/unknown: iTunes/iTunes: iTunes/' "$w"

	genrecount=`grep -c 'genre: ' "$w"`
	unknowncount=`grep -c 'unknown: ' "$w"`

	if [ "$genrecount" -eq 1 ] && [ "$unknowncount" -eq 2 ]; then
	sed -i '25s/unknown: /composer: /' "$w"
	sed -i '26s/unknown: /album: /' "$w"
	genre=`grep 'genre: ' "$w"|sed -e 's/genre: //'`
	fi

	if [ "$genrecount" -eq 1 ] && [ "$unknowncount" -eq 1 ]; then
	sed -i '25s/unknown: /album: /' "$w"
	genre=`grep 'genre: ' "$w"|sed -e 's/genre: //'`
	fi

	if [ "$genrecount" -eq 0 ] && [ "$unknowncount" -eq 3 ]; then
	sed -i '25s/unknown: /composer: /' "$w"
	sed -i '26s/unknown: /album: /' "$w"
	sed -i '27s/unknown: /genre: /' "$w"
	genre='other'
	fi

	if [ "$genrecount" -eq 0 ] && [ "$unknowncount" -eq 2 ]; then
	sed -i '25s/unknown: /album: /' "$w"
	sed -i '26s/unknown: /genre: /' "$w"
	genre='other'
	fi

	title=`grep 'title: ' "$w"|sed -e 's/title: //'`
	artist=`grep '^artist: ' "$w"|sed -e 's/^artist: //'`
	album=`grep 'album: ' "$w"|sed -e 's/album: //'`
	track=`grep 'track: ' "$w"|sed -e 's/track: //'`
	totaltracks=`grep 'totaltracks: ' "$w"|sed -e 's/totaltracks: //'`
	[ "$totaltracks" != "" ] && the_tracks="$tracks/$totaltracks" || the_tracks="$track"
	playingtime=`grep ' secs,' "$w"|sed -e 's@ secs,.*@@;s@.*[[:space:]]@@;s@\..*@@'`

	if echo "$i" | grep -E "^[0-9]" ; then 
		z=$( echo "$i" | awk '{print " - " $1}' )
	else
		z=""
	fi

	lame --preset cd --add-id3v2 --tt "$title" --ta "$artist" --tl "$album" --tg "$genre" --tn "$the_tracks" --ty "$year" "$x" "$y"
	mv "$w" txt/
	rm "$x"
	if [ -s "$y" ] ; then
		if [ "$artist$album$z$track$title" != "" ] ; then
			cp -av "$y" mp3/"$( echo "$artist - $album$z - $track$title.mp3" | sed -e "s/  / /g ; s/\[/_/g ; s/\]/_/g ; s/[()\!\?\/»«]/_/g ; s/ - .mp3/.mp3/" )" && rm "$y"
		else
			cp -av "$y" mp3/
		fi
	fi
	mv -v "$i" orig

	echo "#EXTINF:$playingtime, $artist - $title" >> playlist/playlist.m3u
	echo "$( echo "$artist - $album$z - $track$title.mp3" | sed -e "s/  / /g ; s/\[/_/g ; s/\]/_/g ; s/[()\!\?\/»«]/_/g ; s/ - .mp3/.mp3/" )" >> playlist/playlist.m3u
done

grep -v '#EXTINF:,  -' playlist/playlist.m3u | grep -v ' -.mp3' | grep -v '^$' > playlist/"$artist - $(grep -v '^#' playlist/playlist.m3u | awk -F' - ' '{print $2}' | uniq | grep -v '^$' | tail -n1 )".m3u

rm *" -  - .mp3" 2>/dev/null
rm " -.mp3" 2>/dev/null
rm txt/"*.txt" 2>/dev/null
rm playlist/playlist.m3u 2>/dev/null

#If you get bad characters errors use this instead
#rm "$x"
#artist=`echo $artist | sed -e 's/\//_/'`
#mv "$y" "$artist - $title.mp3"
#rm $i
#done

cd "$2"
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
Rich (BBCode):
ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

okey also ich habe das nun getestet und habe bei dir bei

Rich (BBCode):
input.wav
abgeändert auf Input.mp4

nun weis ich nicht ob man das so machen kann oder nicht aber ich bekomme bei beiden diese Fehler Meldung

Rich (BBCode):
DiskStation> ffmpeg -i input.mp4 -codec:a libmp3lame -qscale:a 2 output.mp3
FFmpeg version UNKNOWN, Copyright (c) 2000-2008 Fabrice Bellard, et al.
  configuration: --enable-cross-compile --cross-prefix=/home/slug/optware/syno-i686/toolchain/gcc-4.2.1-glibc-2.3.6/i686-linux-gnu/bin/i686-linux-gnu- --arch=i686 --disable-encoder=snow --disable-decoder=snow --enable-shared --disable-static --enable-gpl --enable-postproc --prefix=/opt
  libavutil version: 49.6.0
  libavcodec version: 51.54.0
  libavformat version: 52.13.0
  libavdevice version: 52.0.0
  built on Feb 18 2012 04:13:40, gcc: 4.2.1
input.mp4: no such file or directory

DiskStation> ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3
FFmpeg version UNKNOWN, Copyright (c) 2000-2008 Fabrice Bellard, et al.
  configuration: --enable-cross-compile --cross-prefix=/home/slug/optware/syno-i686/toolchain/gcc-4.2.1-glibc-2.3.6/i686-linux-gnu/bin/i686-linux-gnu- --arch=i686 --disable-encoder=snow --disable-decoder=snow --enable-shared --disable-static --enable-gpl --enable-postproc --prefix=/opt
  libavutil version: 49.6.0
  libavcodec version: 51.54.0
  libavformat version: 52.13.0
  libavdevice version: 52.0.0
  built on Feb 18 2012 04:13:40, gcc: 4.2.1
input.wav: no such file or directory

und ja ich bin in einem Ordner wo eine Datei vorhanden ist

is der output von ffmpeg eig. so normal ?
 

cp389

Benutzer
Mitglied seit
07. Jan 2014
Beiträge
532
Punkte für Reaktionen
5
Punkte
44
Du musst für "input.wav" natürlich die Quelldatei (den Dateinamen des Liedes) angeben. Die heißt ganz bestimmt nicht "Input.mp4", sondern vielleicht "DJ Ötzi – Burger Dance.mp4". :D
Für "output.mp3" macht es auch Sinn, einen richtigen Dateinamen zu setzen. Der könnte dann entsprechend "DJ Ötzi – Burger Dance.mp3" lauten.

Wobei mir .mp4 als Audio-Datei nicht geläufig ist. Aber machbar ist es ja.
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
hahha beste :D
ja danke dir da macht er schon ein wenig weiter hehe ^^
aber ich habe etwas gefunden was ich nun für mich abgeändert habe
jetzt hätte ich nur noch eine Frage ist es möglich von der mp4 ( Keine Audio dabei ) video das Vorschau Bild mit in dir mp3 zu übernehmen
wenn ja unter welchem Stichwort findet man so etwas
so wie ichs in google gesucht habe kam nichts ^^
 

cp389

Benutzer
Mitglied seit
07. Jan 2014
Beiträge
532
Punkte für Reaktionen
5
Punkte
44
Theoretisch müsste das gehen, aber wie konkret, kann ich Dir nicht sagen.
Ich habe mich vor einer Weile mal mit ffmpeg beschäftigt und dabei ist mir aufgefallen, dass das Cover-Bild als Video-Spur mit nur einem Frame eingebunden wird. Zumindest hat es den Anschein.

Was Du mit Deinen obigen Sätzen nun wirklich sagen wolltest habe ich nicht ganz verstanden. Du solltest mal an Artikulation und Interpunktion arbeiten.

Was ich verstanden habe ist, dass Du ein MP4-Video ohne Audiospur hast, und daraus das "Vorschau-Bild" extrahieren und in eine (andere?) MP3-Audio-Datei übernehmen willst. Das funktioniert sicherlich nicht ohne den Zwischenschritt, das Bild vorher als JPEG (oder anderes Bildformat) abzuspeichern und dann in das MP3 einzubinden.

Solltest Du jedoch gemeint haben, dass Du ein MP4-Video MIT Audiospur in ein MP3-Audio umwandeln willst, würde ich mal probieren, einfach alle anderen Frames außer dem ersten aus dem File zu löschen, bzw. nur das erste Frame mit zu übernehmen.

Allerdings muss man hier sagen, dass das Vorschau-Bild durch unterschiedliche Software/Betriebssysteme auch unterschiedlich ausgewählt wird. Manche Software zeigt das allererste Frame, andere wiederum nimmt irgendeins aus der Mitte, da zumindest bei normalen Filmen das erste Frame meist schwarz ist (wegen der Aufblendung).
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
letzteres stimmt ich wollte von einem Video mit Audio .mp4 in .mp3 + das Vorschau pic Konvertieren
ich hab aber so nichts im netzt gefunden wo ich es probieren könnte deswegen lass ich das einfach mal sein!

wenn wer den Code möchte wieso auch immer
hier ist er:

Rich (BBCode):
#!/bin/sh
#PATH zu dem Ordner
cd /
for f in *.mp4; do
	faad -q -o - "$f" |
  	lame --vbr-old -V 0 - "${f%.mp4}.mp3" |
  	xargs rm "${f%.mp4}.mp4"
done
 

cp389

Benutzer
Mitglied seit
07. Jan 2014
Beiträge
532
Punkte für Reaktionen
5
Punkte
44
Ich wollte Euch auch noch mein Script da lassen. Vielleicht braucht es ja mal jemand.
Es wandelt alle im Verzeichnis vorhandenen WMA-Dateien in MP3 um.

Verwendung:
Einfach in den Ordner kopieren, in dem sich die WMA-Dateien befinden und starten mit
Rich (BBCode):
DS> ./wma2mp3.py

Zum Anpassen an andere Quell-Formate einfach auf Zeile 14 das "wma" durch das vorhandene Quellformat ersetzen.
Die Bitrate für die Zieldatei kann ganz einfach gemäß integrierter Tabelle angepasst werden.
Die MP3-Dateien landen im gleichen Verzeichnis wie die Ausgangsdateien. Gelöscht wird nichts.

Rich (BBCode):
#!/usr/bin/env python
#coding: utf8 

import dircache
import os
import re

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

# Arbeitsverzeichnis
workdir = './'

# Ausgangsmaterial, nach dem gesucht werden soll
srctype = 'wma'

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

# Dateilisten
filesInWorkdir = dircache.listdir(workdir)

for file in filesInWorkdir:

	# nur WMA-Dateien bearbeiten
	if str(file).split('.')[-1] == srctype:
		
		# Neuen Dateinamen aus dem Alten bilden
		newFileName = str(file).split('.' + srctype)[0] + '.mp3'
		
		# Mit ffmpeg umwandeln	
		os.popen("ffmpeg -i " + re.escape(workdir + "/" + file) + " -codec:a libmp3lame -qscale:a 2 " + re.escape(workdir + "/" + newFileName) + " 1&> /dev/null")
			
		print file + " umgewandelt -> " + newFileName
			
#-------------------------------------------------------------------------------

# Terminal-Befehl für ffmpeg:
# DS> ffmpeg -i input.wma -codec:a libmp3lame -qscale:a 2 output.mp3

# Average kbit/s | Bitrate range kbit/s | ffmpeg option
# ---------------+----------------------+-------------------------------------------
# 320            | 320 CBR (non VBR)    | -b:a 320k (NB this is 32KB/s, or its max)
# 245            | 220-260              | -q:a 0 (NB this is VBR from 22 to 26 KB/s)
# 225            | 190-250              | -q:a 1
# 190            | 170-210              | -q:a 2
# 175            | 150-195              | -q:a 3
# 165            | 140-185              | -q:a 4
# 130            | 120-150              | -q:a 5
# 115            | 100-130              | -q:a 6
# 100            | 80-120               | -q:a 7
# 85             | 70-105               | -q:a 8
# 65             | 45-85                | -q:a 9

Ich hab das Script bewusst einfach gehalten. Füllt Euch frei, das Script ganz nach Euren Bedürfnissen anzupassen.
 
Status
Für weitere Antworten geschlossen.
 

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