Ich wollte ffmpeg selbst kompilieren, um eine kleinere ausführbare Datei zu erhalten, die ich dann mit meinem Programm verteilen kann. Während ich den offiziellenffmpeg-Kompilierungshandbuch für UbuntuIch erhalte eine Fehlermeldung, wenn ich ffmpeg tatsächlich kompiliere, wie im Abschnitt beschriebenKompilierung & Installation -> FFmpeg. Der folgende lange zusammengesetzte Befehl wird gegeben.
cd ~/ffmpeg_sources && \
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \
tar xjvf ffmpeg-snapshot.tar.bz2 && \
cd ffmpeg && \
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--extra-libs="-lpthread -lm" \
--ld="g++" \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-gnutls \
--enable-libaom \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libsvtav1 \
--enable-libdav1d \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-nonfree && \
PATH="$HOME/bin:$PATH" make && \
make install && \
hash -r
Ich möchte nur den libvpx-Encoder einbinden und ffmpeg nicht installieren, sondern nur kompilieren. Damit bleibt mir dieser etwas kürzere Befehl.
cd ~/ffmpeg_sources && \
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \
tar xjvf ffmpeg-snapshot.tar.bz2 && \
cd ffmpeg && \
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--extra-libs="-lpthread -lm" \
--ld="g++" \
--bindir="$HOME/bin" \
--enable-libvpx \
PATH="$HOME/bin:$PATH" make && \
hash -r
Dieser zusammengesetzte Befehl besteht aus 6 einzelnen Befehlen. Bei der Ausführung des längsten, 5. Befehls
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--extra-libs="-lpthread -lm" \
--ld="g++" \
--bindir="$HOME/bin" \
--enable-libvpx \
PATH="$HOME/bin:$PATH" make
Ich erhalte diesen Fehler
Unknown option "PATH=/home/joker/bin:/home/joker/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin".
See ./configure --help for available options.
wobei „Joker“ mein Benutzername auf dieser virtuellen Maschine ist.
Ich verwende Ubuntu Groovy Gorilla x64 mit allen neuesten Updates.
Was mache ich falsch?
Antwort1
Fakten:
\
bevor ein Zeilenumbruchzeichen der Shell mitteilt, dass der Befehl in der nächsten Zeile fortgesetzt wird.foo=bar baz
läuftbaz
mitfoo
Variablen in der Umgebung.baz && qux
läuftqux
nur, wennbaz
Erfolg zurückgegeben wird (Beendigungsstatus0
).
Der ursprüngliche Befehl war wie folgt
… && \
PATH=… PKG_CONFIG_PATH=… ./configure \
… \
--enable-nonfree && \
PATH=… make && \
…
Gleichwertig
… && PATH=… PKG_CONFIG_PATH=… ./configure … --enable-nonfree && PATH=… make && …
Die Struktur war also wie
… && ./configure … && PATH=… make && …
Du hast es in etwas verwandelt, das ist wie
… && ./configure … PATH=… make && …
und PATH=…
ist jetzt eine Option für ./configure
. Das ist falsch.
&&
Mit anderen Worten: Sie hätten from before nicht entfernen dürfen PATH="$HOME/bin:$PATH" make
. Ihr neues Snippet kann durch Hinzufügen &&
an der richtigen Stelle ( --enable-libvpx && \
) korrigiert werden.
Dies wäre weniger verwirrend, wenn der ursprüngliche Code die folgende Form hätte:
… \
&& PATH=… PKG_CONFIG_PATH=… ./configure \
… \
--enable-nonfree \
&& PATH=… make \
&& …
Wenn Sie nun die gesamte --enable-nonfree \
Zeile entfernen würden, bliebe das erforderliche &&
Davor PATH=… make
erhalten.
Randbemerkung: Einige Backslashes im Originalcode sind überflüssig, da && \
am Ende der Zeilekann einfach sein&&
Wenn Sie sich stattdessen für die Platzierung &&
am Anfang der nächsten Zeile entscheiden, \
kann in der aktuellen Zeile nicht weggelassen werden.