ubuntuusers.de

Nautilus-Skript zum konvertieren von Videos mittels ffmpeg

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

DaWi

Anmeldungsdatum:
19. Februar 2008

Beiträge: 132

Hallo,

ich habe mich heute mal hingesetzt, und habe ein Nautilusskript geschrieben, welches flv, mpg und avi hinundher konvertiert.

Es funktioniert allerdings nur richtig, wenn der Audio-Support bei ffmpeg besteht.
Dies erreicht man indem man den Quellcode von ffmpeg mit

./configure --enable-libmp3lame


bzw. "--enable-libfaad" oder "--enable-libfaac" konfiguriert. Sonst hat man halt kein Audio ☺ , seltsamerweise fehlt der Support beim ffmpeg von Ubuntu.

Funktioniert soweit auch ganz gut.

Es gibt aber noch 3 Sachen zu tun bei denen ich Hilfe brauche:

1.) Ich bekomme keinen Fortschrittsbalken ganz am Ende hin (also voletzte Zeile). Ich dachte an awk... leider verstehe ich dieses Programm nicht. Ausserdem müsste ich ja die Gesamtgröße wissen dafür, die gibt mir ffmpeg aber nicht aus. Geht das überhaupt?

Edit: Oh Gott, bin ich ein Idiot... Ich habs vergessen abzufragen...... nevermind 😳
->2.) Irgendwie erkennt er die mpg's nicht an. Also das "is_mpg()" funktioniert nicht....was ich so überhaupt nicht verstehe. Die anderen beiden laufen.←

3.) allgemeines "Drüberschauen", da bestimmt hunderte bugs drinn sind 😳 .
Für Verbesserungsvorschläge wäre ich dankbar.

Ich habe mich btw. beim posten für die Variant unten entschieden... ist vielleicht ein wenig viel, kann ich auch Sachen uploaden damit mans per Forum runterladen kann? Wenn ja: wie? ICh finde hier nix. Wenns geht, werd ich das besser machen.

Edit: ach ja. Kleine Anleitung zum Installieren:
Am besten (so denke ich) den Code nehmen und in ein File packen... und eine passenden Namen finden.. bei mir heißst es "VideoConvert".
Diese Datei nach "/usr/share/nautilus-scripts" kopieren (Root rechte!), und dann per

nautilus-script-manager enable 'NameVomSkript'

aktivieren. Nautlilus neu starten, und schon ists da 😀

Grüße DaWi

ps: ich habe die Fähigkeiten von ffmpeg deutlich eingeschränkt, da sonst das Skript unbenutzbar wäre....es gibt ja tausende von Parametern die man noch abfragen könnte, ich denke aber ich habe die wichtigsten abgedeckt.

pps: Bei den Texten habe ich mir nicht allzu viel Mühe gemacht.... 😈

ppps: Ein Hinweis, wenn ihr das ausprobiert, solltet ihr nicht allzu große z.B. avis oder xvids in flv konvertierten... das dauert nämlich ein Weilchen...


#!/bin/bash

#Script for video converting

set -x


#The translation... and the Default, sure :D

warning="warning"
noselec="A file is requiered"
not_supported="The format od this video is not supported"
ffmpeg_not_installed='ffmpeg is not installed on your system. Please install it.'
noaudio='No audio support. To enable it deinstall ffmepeg and get the ffmpeg source and type: "./configure --enable-libmp3lame", or libfaad or libfaac, then make and sudo make install '
Audiooptions='audio options'
videooptions='video options'
want_to_differ='Choose where you wnat to differ from the default settings'
settings='settings'
bitrate='bitrate'
fps='frames per second'
size='size'
width='width'
height='height'
text_asking='Please enter the Value of'
output_text='Which output format you want?'
format='format'
name_of_output_text='Name of OutPut-File (without e.g. *.mpg)'
name_of_output_title='Name of output'



case $LANG in
	de* )
		warning="Warnung"
		noselec="Ein File muss angewählt sein"
		not_supported="Dieses Videoformat kann nicht konvertiert werden."
		ffmpeg_not_installed='ffmpeg ist nicht installiert. Bitte installieren sie das Programm.'
noaudio='Kein Audiounterstützung. Um diese zu aktivieren, müssen Sie ffmpeg deinstallieren und den ffmpeg-Quellcode laden und "./configure --enable-libmp3lame", oder libfaad oder libfaac eingeben, dann make und sudo make install'
Audiooptions='Audio-Optionen'
videooptions='Video-Optionen'
want_to_differ='Hier können Sie wählen, wo Sie von den Defaulteinstellungen abweichen wollen'
settings='Einstellungen'
bitrate='Bitrate'
fps='Framerate'
size='Ausdehnung'
width='Breite'
height='Höhe'
text_asking='Bitte geben Die den Wert ein für'
output_text='Welches Ausgabeformat wünschen Sie?'
format='Format'
name_of_output_text='Names des OutPut-Files (ohne Endung z.B. *.mpg)'
name_of_output_title='Name des Outputfiles'
esac



#Functions

is_mpg ()
{
	file -b "$1" | grep 'MPEG' || echo $1 | grep -i '\.mpg$'
}



is_avi ()
{
	file -b "$1" | grep 'AVI' || echo $1 | grep -i '\.avi$'
}


is_flv ()
{
	file -b "$1" | grep 'Macromedia' || echo $1 | grep -i '\.flv$'
}



test_zenity_output()
{
if [ $? -eq 1 ]
then
	rm VideoConvert.tmp
	exit 1
fi
}

#WARNING:
# I use everytime the variable GetPar.
# so if you want to use this function, make sure you don't need GetPar anymore
#!!!!!!!!!!!!
get_value_to_GetPar()
{
if [ $# -lt 2 ] 
then break
fi

answer=$(zenity --entry --title "" --text "$text_asking $1 ")


if [ $? -eq 1 ]
then
	return 1
else
	GetPar=$GetPar$2$answer 
	return 0
fi


}



#Programm

#enough info?



if [ $# -eq 0 ]; then
        zenity --error --title="$warning" --text="$noselec"
        exit 1
fi



#supported? 
#EDIT: forgot the '!(is_mpg "$1")', now it works
if  !( is_avi "$1") && !(is_flv "$1") && !(is_mpg "$1")
then
	zenity --error --title="$warning" --text="$not_supported"
	exit 1
fi

#ffmpeg there?
if !(which ffmpeg 2>/dev/null)
then
	zenity --error --title="$warning" --text="$ffmpeg_not_installed"
	exit 1
fi



#Output choosing

zenity --list --radiolist --text "$output_text" --column "" --column "$format" True "mpeg" False "flv" False "avi" > VideoConvert.tmp

test_zenity_output

if (cat VideoConvert.tmp | grep "mpeg") 
then output=".mpg"
elif  (cat VideoConvert.tmp | grep "flv")  
then output=".flv"
elif  (cat VideoConvert.tmp | grep "avi")  
then output=".avi"
else 
exit 1
fi

rm VideoConvert.tmp


#ask for audiosupport

#lame?
if (ffmpeg --version 2>&1 | grep 'enable-libmp3lame')
then
lame='False lame'
fi
#faad?
if (ffmpeg --version 2>&1 | grep 'enable-libfaad')
then
faad='False faad'
fi
#faac?
if (ffmpeg --version 2>&1 | grep 'enable-libfaac')
then
faac='False faac'
fi

#Audio possible?
if 	!(ffmpeg --version 2>&1 | grep 'enable-libmp3lame') && \ 
	!(ffmpeg --version 2>&1 | grep 'enable-libfaad') && \
	!(ffmpeg --version 2>&1 | grep 'enable-libfaac')
then
	zenity --warning --title="$warning" --text="$noaudio"
fi


#SetAudioOptions

zenity --list --radiolist --title "$Audiooptions" --column "" --column "Audiocodecs" True "Default" $faad $lame $faac > VideoConvert.tmp

test_zenity_output

if (cat VideoConvert.tmp | grep "Default") 
then audio="  "
elif  (cat VideoConvert.tmp | grep "lame")  
then audio=" -acodec libmp3lame "
elif  (cat VideoConvert.tmp | grep "faad")  
then audio=" -acodec libfaad "
elif  (cat VideoConvert.tmp | grep "faac")  
then audio=" -acodec libfaac "
else 
exit 1
fi

rm VideoConvert.tmp


#SetVideoOptions

zenity --list --checklist --title "$videooptions" --text "$want_to_differ" --column "" --column "$settings" False "$bitrate" False "$fps" False "$size"  > VideoConvert.tmp

test_zenity_output

Video=" "
GetPar=" "

if ( cat VideoConvert.tmp | grep "$bitrate" )
then get_value_to_GetPar "$bitrate" '-b '
fi
GetPar=$GetPar" "

if ( cat VideoConvert.tmp | grep "$fps" )
then 
	get_value_to_GetPar "$fps" '-r '

		if [ 1 -eq $? ]
		then 
			GetPar=$GetPar" -r ntsc "
		fi

else GetPar=$GetPar" -r ntsc "
fi
GetPar=$GetPar" "

if ( cat VideoConvert.tmp | grep "$size" )
then 
get_value_to_GetPar "$width" '-s '

	if [ $? -eq 0 ]
	then get_value_to_GetPar "$height" 'x'
	fi

fi
GetPar=$GetPar" "

Video=$Video$GetPar

rm VideoConvert.tmp

name_of_output=$(zenity --file-selection --save --confirm-overwrite)

test_zenity_output


if  (echo $name_of_output | grep "$output" )


then ffmpeg -i $1 $Video $audio "$name_of_output"


else

ffmpeg -i $1 $Video $audio "$name_of_output"$output 

fi

DerHesse

Anmeldungsdatum:
29. September 2006

Beiträge: 539

DaWi hat geschrieben:

... ...den Code nehmen und in ein File packen... und eine passenden Namen finden.. bei mir heißst es "VideoConvert".
Diese Datei nach "/usr/share/nautilus-scripts" kopieren (Root rechte!), und dann per

nautilus-script-manager enable 'NameVomSkript'

aktivieren. Nautlilus neu starten, und schon ists da 😀

...oder einfach nach ~/.nautilus/nautilus-scripts kopieren. 😉

Klingt gut! Werde ich später ausprobieren.
Schon mal Danke dafür. 😛

DaWi

(Themenstarter)

Anmeldungsdatum:
19. Februar 2008

Beiträge: 132

...oder einfach nach ~/.nautilus/nautilus-scripts kopieren. 😉

Das ist ja auch die Lösung die im Wiki vorgeschlagen wird.
Funktioniert natürlich auch.

Das Problem dabei ist nur, das ich so den script manager umgehe, also Nautilus austrickse. Die Idee der Skripte ist ja, dass ich irgendwo die Skripte liegen habe (/usr/share/...) und sich jeder Benutzer diese bei Bedarf aktivieren und wieder deaktivieren können soll, also Links in /.nautilus/... anlege.

Deswegen installiert Synaptic die Skripte ja auch nach /usr/share....

Das ist aber (wie ich denke) Geschmackssache.

Werde ich später ausprobieren.

Für Feedback wär ich dankbar.

Grüße DaWi

traxanos

Anmeldungsdatum:
31. Dezember 2006

Beiträge: 656

Zum Thema fehlender Audiosupport für FFMPEG.
Schau mal nach Medibuntu diese haben den Audiosupport aktiviert.

DerHesse

Anmeldungsdatum:
29. September 2006

Beiträge: 539

Hallo DaWi,
Ich habe einige Zeit mit FFmpeg verbracht.
Wirklich benutzerfreundlich ist die Installation von ffmpeg nicht, zumal das dann nach dem upgrade auf Hardy wiederholt werden muss.

Aber...es hat sich gelohnt. Das Konvertieren hat mit dem "Standard" sehr gute Ergebnisse. Keine Probleme mit dem Ton. Dein Skript läuft Prima. 😉 Danke dafür!

Was auch gut klappt: Beim Umwandeln vom mpeg-TS von meinem vdr bleibt der Ton synchron. 😀

DerHesse

Anmeldungsdatum:
29. September 2006

Beiträge: 539

Hallo Dawi,
Du hattest um Anregungen gebeten:

Was mir so auffällt ist, das die gemachte Angabe der "Bitrate" keine Auswirkung auf die resultierenden Datei hat:

Ich habe dreimal den gleichen, etwa 1h langen Film berechnet. Bei Abmessungen von 720 x 576 ergab dies bei Benutzung von lame (64kbit):
Bitrate: Standard –> 195MB
Bitrate: 1200kbit –> 203MB
Bitrate: 2000kbit –> 203MB !!!
Hier scheint die Übernahme nicht korrekt zu sein.

Was ich mir davon ab noch wünschen würde ist die Anpassung der bitrate bei lame. Gerade bei Musikvideos sind 64kbit zu wenig.

Vielleicht könnte man auch noch ein paar Voreinstellungen zur Auswahl anbieten:
z.B. Auflösungen für PocketPC/Handy (320x240, etc) mit geringer Auflösung oder auch volle Auflösungen bei hohen Bitrate.

Machbar?

DaWi

(Themenstarter)

Anmeldungsdatum:
19. Februar 2008

Beiträge: 132

Hallo und danke für die Anregungen....

Was mir so auffällt ist, das die gemachte Angabe der "Bitrate" keine Auswirkung auf die resultierenden Datei hat:

Ich habe damit auch mal ein wenig rumgespielt. Tatsächlich ist es so, dass ab einer gewissen Größe (~1000) dieser Wert tatsächlich keinen (oder kaum einen) Einfluss mehr hat. Dies ist (so denke ich) von ffmpeg so vorgesehen, da ich das selbe Ergebnis erzeuge wenn ich direkt über ffmpeg gehe. FFmpeg erkennt die Bitrate vom Video, und wenn die z.B. 500 ist, wird das Viedeo mit 2000 oder mit 4000 Bit/s kaum einen unterschied machen....

..... Ich weiß nicht ob man das umgehen kann.... sry.

Was ich mir davon ab noch wünschen würde ist die Anpassung der bitrate bei lame. Gerade bei Musikvideos sind 64kbit zu wenig.

Daran habe ich tatsächlich nicht gedacht....

Vielleicht könnte man auch noch ein paar Voreinstellungen zur Auswahl anbieten:
z.B. Auflösungen für PocketPC/Handy (320x240, etc) mit geringer Auflösung oder auch volle Auflösungen bei hohen Bitrate.

Jau... auch das ist eine gute Idee....

Machbar?

Gemacht 😀

Hier die neue Version:
http://rafb.net/p/m4rM9M38.html

Aber Vorsicht. Ich habe überall bei den Defaultwerten erstmal "Unsinn" eingetragen.
Da habe ich erstmal einen Kommentar drüber geschrieben...

	#BESSERE WERTE EINTRAGEN
	#ICH HABE KEINE AHNUNG WAS HIER GUT IST


Ausser bei der "audiobitrate" sollte man die Werte noch anpassen.... leider habe ich da nicht so die Ahnung was da gut ist.

die Funktion 'get_value_to_GetPar_By_Defaults' wird ganz einfach benutzt....
einfach den namen Hinschreiben, danach den Namen der zu verändernden Größe, danach der text der vor der Auswahl stehen soll (also z.B. der ffmpeg code, "-ab" und son zeuchs), Dann der Test der Bei der Frage stehen soll, und dann in Reihenfolge einfach all Defaults....
(steht aber auch im code...), also z.B.

get_value_to_GetPar_By_Defaults "Audiobitrate" "-ab" "Hier steht toller Text" 32k 64k 128k


Danach liegt nach der Auswahl auf der Variable z.B. $GetPar="-ab 32k"

Ich habe übrigens auch einen Fortschrittsbalken reingebaut... aber der Funktioniert noch nicht so richtig.... *grummel*

Gruß und Dank

DaWi

ps: man sollte, wenn man die Werte anpasst, das erstmal immer in der Konsole Testen.. also

bash VideoConvert NameVomMovie.mpg

DerHesse

Anmeldungsdatum:
29. September 2006

Beiträge: 539

Hallo DaWi,
typische Auflösungen findest Du z.B. hier:
DivX#Profiles

Der Link zum Skript geht leider nicht. ☹

DaWi

(Themenstarter)

Anmeldungsdatum:
19. Februar 2008

Beiträge: 132

mmmh

ich hoffe der geht

http://rafb.net/p/sCZRHV50.html

Habe die typischen GrößenEinstellungen reingenommen

DaWi

Tomcraft

Avatar von Tomcraft

Anmeldungsdatum:
29. Januar 2007

Beiträge: 13

Servus,

bastelst du am Script noch weiter?
Wo kann man denn immer die aktuelle Version her bekommen?

Grüße

Tom

Tomcraft

Avatar von Tomcraft

Anmeldungsdatum:
29. Januar 2007

Beiträge: 13

*schieb*

Wo bekomme ich denn die aktuelle Version des Scriptes her?

tomtimo

Anmeldungsdatum:
2. Januar 2008

Beiträge: 170

Hi,

auch ich würde mich über das Script freuen. Klingt echt interessant.

Viele Grüße

Timo

Antworten |