Hallo an alle,
ich versuche mit ffmpeg.exe eine mp3 Datei zu normalisieren.
Ich rufe den Prozess folgendermaßen auf:
ProcessStartInfo norm_first = new ProcessStartInfo
{
CreateNoWindow = false,
UseShellExecute = false,
RedirectStandardOutput = false,
FileName = Environment.CurrentDirectory + "\\ffmpeg\\ffmpeg.exe",
WorkingDirectory = Environment.CurrentDirectory,
Arguments = " -i "+"\"" + Path.GetTempPath() + dl_element.titel + ".mp3"+"\""+ " -af loudnorm=I=-16:TP=-1.5:LRA=11 -ar 48k -ab " +Get_Bitrate()+" \""+ Properties.Settings.Default.dir_audio+"\\"+dl_element.titel+".mp3\"",
RedirectStandardError = false
};
try
{
Process process = Process.Start(norm_first);
process.WaitForExit();
}
Der Prozess startet und wird auch korrekt beendet, solange ich UseShellExecute= true verwende.
Wenn ich nun UseShellExecute = false verwende, wird der Prozess gestartet, auch die Datei wird erstellt, dann aber bleibt der Prozess ohne irgendwelche Meldungen mit 0% Prozessorauslastung im Taskmanager stehen.
Die erstellte Datei ist auch gesperrt und hat angeblich nur 4kb, kann aber abgespielt werden.
Scheinbar verhindert irgendetwas, dass der Prozess abgeschlossen wird.
Da das Programm mehrere Dateien verarbeiten soll, wäre es nicht schön, wenn für jede Datei ein Fenster geöffnet würde.
Schon einmal vielen Dank für die Mühe und allen einen schönen Tag.
Schon überprüft, ob ffmpeg Deine Anforderung mit Shell-less überhaupt unterstützt?
Hab ich so meine Zweifel...
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Vielen Dank für die schnelle Antwort.
Ich werde es Morgen früh prüfen.
Ich habe bereits eine wav in eine mp3 umgewandelt, da ging es auch ohne Fenster. Ich bin davon ausgegangen, dass es auch hier funktioniert. Benutze ja in beiden Fällen die ffmpeg.exe.
Da hatte ich das Problem, dass er hängen blieb weil die Zieldatei schon vorhanden war, und er auf eine Eingabe wartete, ob ich die Datei überschreiben will. Das war dann auch in der Kommandozeile zu sehen.
Ich bin sicher, dass Du in der Dokumentation von ffmpeg findest, welche Parameter Du für Shell brauchst - oder ob es überhaupt funktioniert.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Guten Morgen an alle,
ich kontte mein Problem lösen.
Der Fehler lag darin, dass die Normaliesierung mit ffmpeg.exe auf STDERR zu viel output erzeugte
und dadurch die Pipe voll war.
Habe die Pipe nun folgendermaßen ausgelesen:
ProcessStartInfo norm_first = new ProcessStartInfo
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = false,
FileName = Environment.CurrentDirectory + "\\ffmpeg\\ffmpeg.exe",
WorkingDirectory = Environment.CurrentDirectory,
Arguments = " -i "+"\"" + Path.GetTempPath() + dl_element.titel + ".mp3"+"\""+ " -af loudnorm=I=-16:TP=-1.5:LRA=11 -ar 48k -ab " +Get_Bitrate()+" \""+ Properties.Settings.Default.dir_audio+"\\"+dl_element.titel+".mp3\"",
RedirectStandardError = true
};
try
{
Process process = Process.Start(norm_first);
StreamReader reader = process.StandardError;
string output = reader.ReadToEnd();
process.WaitForExit();
}
Die Umwandlung hat offenbar funktionert, weil weniger Daten zusammen kamen.
Nochmals vielen Dank an Abt. 👍
Wünsche allen einen schönen Tag.