我想自己編譯 ffmpeg,以獲得一個較小的可執行文件,然後我可以將其與我的程式一起分發。在關注官方的同時Ubuntu 下的 ffmpeg 編譯指南在實際編譯 ffmpeg 時發生錯誤,如第 1 節所述編譯安裝->FFmpeg。給出以下長複合命令。
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
我只想包含 libvpx 編碼器而不安裝 ffmpeg,只編譯它。這給我留下了這個稍微短一點的命令。
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
此複合命令由 6 個單獨的命令組成。當執行最長的第 5 個命令時
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
我收到這個錯誤
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.
其中,joker 是我在此虛擬機器上的使用者名稱。
我正在使用 Ubuntu Groovy Gorilla x64 以及所有最新更新。
我究竟做錯了什麼?
答案1
事實:
\
在換行符號告訴 shell 指令在下一行繼續之前。foo=bar baz
在環境中baz
使用變數運行。foo
baz && qux
運行qux
iffbaz
返回成功(退出狀態0
)。
原來的命令就像
… && \
PATH=… PKG_CONFIG_PATH=… ./configure \
… \
--enable-nonfree && \
PATH=… make && \
…
等價地
… && PATH=… PKG_CONFIG_PATH=… ./configure … --enable-nonfree && PATH=… make && …
所以結構就像
… && ./configure … && PATH=… make && …
你把它變成了類似的東西
… && ./configure … PATH=… make && …
現在PATH=…
是一個選項./configure
。這是錯誤的。
換句話說,您不應該&&
從 before 中刪除PATH="$HOME/bin:$PATH" make
。您的新程式碼片段可以透過新增&&
到正確的位置 ( )來修復--enable-libvpx && \
。
如果原始程式碼採用以下形式,則不會那麼混亂:
… \
&& PATH=… PKG_CONFIG_PATH=… ./configure \
… \
--enable-nonfree \
&& PATH=… make \
&& …
現在,如果您刪除整--enable-nonfree \
行,那麼&&
先前必要的內容PATH=… make
將保留下來。
附註:原始程式碼中的一些反斜線是多餘的,因為&& \
在行的最後可以只是&&
。如果您決定放在&&
下一行的開頭,則\
不能省略目前行中的內容。