Es scheint, dass es so nicht geht. Das Problem ist, dass der VBR-Header an den Anfang der Datei geschrieben wird, jedoch erst am Ende der Codierung berechnet wird. Dies erfordert das Suchen in der Datei, was nicht möglich ist, wenn die Ausgabe eine Pipe ist.
Ich habe strace
alle oben genannten Varianten ausgeführt. In der 2. Version (beim Schreiben in eine normale Datei) bekomme ich am Ende Folgendes:
lseek(4, 0, SEEK_SET) = 0 write(4, "\377\373\220d\0\0\0"..., 417) = 417 close(4) = 0
In der ersten Version, in der ich -
als Ausgabeargument verwende, versucht Lame nicht einmal, den Header zu schreiben. In der 3. Version wird jedoch versucht, es schlägt jedoch fehl, da die Ausgabe eine Pipe ist.
lseek(4, 0, SEEK_SET) = -1 ESPIPE (Illegal seek)
Es schreibt auch eine Fehlermeldung am Ende, die aufgrund der anderen Ausgabe, die normalerweise in stderr gedruckt wird, leicht übersehen wird, es sei denn, ich --silent
führe sie mit der Option aus (was ich tat, um die strace-Ausgabe sauberer zu machen):
fatal error: can't update LAME-tag frame!
Die Lösung für dieses Problem besteht darin, entweder in eine temporäre Datei zu schreiben, diese dann weiterzuleiten oder die Codierung mit konstanter Bitrate zu verwenden (in diesem Fall wird zu Beginn der Datei nach der Codierung kein zusätzlicher Header geschrieben).