Wie lame man sagen, VBR-Header in Stream zu schreiben?

572
petersohn

Ich möchte lame verwenden, um mp3-Dateien zu kodieren, aber anstatt sie direkt in eine Datei zu schreiben, möchte ich sie in ein anderes Programm leiten, das sie irgendwann ausschreibt. Das Problem ist, dass, wenn Lame feststellt, dass seine Ausgabe ein Stream ist, der VBR-Header nicht geschrieben wird und die Länge der Datei falsch ermittelt wird. Wenn ich dies zum Beispiel mache, ist die resultierende Datei falsch:

lame infile.wav - >outfile.mp3 

Ich habe folgenden Trick ausprobiert:

lame infile.wav /dev/stdout >outfile.mp3 

Es scheint anfangs zu funktionieren, aber nur, wenn das stdout direkt in eine Datei umgeleitet wird. Der folgende Fall funktioniert nicht:

lame infile.wav /dev/stdout | cat >outfile.mp3 

Wenn ich ffmpeg (oder avconv) als Frontend für lame verwende, habe ich genau das gleiche Problem.

Gibt es eine Möglichkeit, Lame zu sagen, dass ich möchte, dass der VBR-Header geschrieben wird, auch wenn er der Meinung ist, dass er in einen Stream schreibt?

1

1 Antwort auf die Frage

1
petersohn

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 stracealle 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 --silentfü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).

Danke für diese Information, nach all den Jahren =) Niloct vor 5 Jahren 0