使用ffmpeg把非原始格式的内容输入videoloopback设备时发生如下错误

1
V4L2 output device supports only a single raw video stream

查看github issue发现原因为debian包管理器自带的ffmpeg版本太低,不支持把非原始格式的内容输入videoloopback设备,需要重新编译高版本ffmpeg,具体可以参考官方ubuntu编译文档

下载源码

1
2
3
4
5
mkdir -p ~/ffmpeg_sources ~/bin
cd ~/ffmpeg_sources
wget https://ffmpeg.org/releases/ffmpeg-5.1.4.tar.gz
tar xzvf ffmpeg-5.1.4.tar.gz
cd ffmpeg-5.1.4/

安装第三方库

ffmpeg在编译时可以选择是否包含某些额外功能,这些额外功能需要安装特定的第三方库

nasm

1
sudo apt-get install nasm

需要版本大于2.13,包管理器下载的版本为2.15

libx264

1
sudo apt-get install libx264-dev

需要版本大于118,包管理器下载的版本为160

在编译时需要开启 --enable-gpl --enable-libx264选项

libvpx

1
sudo apt-get install libvpx-dev

需要版本大于1.4.0 ,包管理器下载的版本为1.9.0

在编译时需要开启--enable-libvpx选项

libfdk-aac

1
sudo apt-get install libfdk-aac-dev

无版本要求

编译时需开启 --enable-libfdk-aac --enable-nonfree选项

libdav1d

1
sudo apt-get install libdav1d-dev

无版本要求

编译时需开启--enable-libdav1d选项

编译ffmpeg

安装依赖项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sudo apt -y install \
autoconf \
automake \
build-essential \
cmake \
git-core \
libass-dev \
libfreetype6-dev \
libgnutls28-dev \
libmp3lame-dev \
libsdl2-dev \
libtool \
libva-dev \
libvdpau-dev \
libvorbis-dev \
libxcb1-dev \
libxcb-shm0-dev \
libxcb-xfixes0-dev \
meson \
ninja-build \
pkg-config \
texinfo \
wget \
yasm \
zlib1g-dev

开始编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
./configure \
--prefix="$HOME/ffmpeg_build" \
--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-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libdav1d \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-nonfree

PATH="$HOME/bin:$PATH" make -j4
make install
source ~/.profile

此时可以直接在终端中输入ffmpeg、ffplay进行使用

1
2
ffmpeg -version
ffplay -version

但是发现在终端上输入以上命令仍然是老版本,需要指定ffmpeg、ffplay执行文件才行

1
2
~/bin/ffmpeg -version
~/bin/ffmpeg -version

卸载ffmpeg

1
rm -rf ~/ffmpeg_build ~/bin/{ffmpeg,ffprobe,ffplay,x264,x265}