我想自己编译 ffmpeg,以便获得一个较小的可执行文件,然后可以随我的程序一起分发。在遵循官方Ubuntu 版 ffmpeg 编译指南当我按照第节所述实际编译 ffmpeg 时,我收到一个错误编译安装 -> 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
当且仅当baz
返回成功(退出状态)时才运行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
。这是错误的。
换句话说,你不应该&&
从之前删除。 你的新代码片段可以通过在正确的位置PATH="$HOME/bin:$PATH" make
添加来修复( )。&&
--enable-libvpx && \
如果原始代码采用以下形式,则不会那么令人困惑:
… \
&& PATH=… PKG_CONFIG_PATH=… ./configure \
… \
--enable-nonfree \
&& PATH=… make \
&& …
现在,如果你删除了整--enable-nonfree \
行,那么必要的&&
之前的内容PATH=… make
将会保留下来。
附注:原始代码中的一些反斜杠是多余的,因为&& \
在行的最后可以只是&&
。如果您决定将其放置&&
在下一行的开头,则\
当前行中的 不能省略。