在正常Linux环境中安装ffmpeg、RTSP以及VLC就可以实现推流以及拉流,在Docker中差不多一样的流程。
1.首先创建目录存放要实现的Dockerfile,并进入该目录
# 创建目录fr
mkdir fr
# 进入目录
cd fr
2.在该目录内编写Dockerfile文件
# 创建Dockerfile,并编写内容
vim Dockerfile
内容如下
1 # 基础镜像
2 FROM ubuntu:18.04
3
4 # 更新软件包列表
5 RUN apt-get update
6
7 # 设置工作目录
8 WORKDIR /workspace
9
10 # 复制rtsp服务
11 COPY rtsp/ /workspace/usr/
12
13 # 安装依赖
14 RUN apt-get install -y autoconf \
15 automake \
16 nasm \
17 libsdl2-dev \
18 build-essential \
19 libfreetype6-dev \
20 libass-dev \
21 libtool \
22 libtheora-dev \
23 libva-dev \
24 libvdpau-dev \
25 libvorbis-dev \
26 libxcb1-dev \
27 libxcb-shm0-dev \
28 libxcb-xfixes0-dev \
29 pkg-config \
30 texinfo zlib1g-dev \
31 libx264-dev \
32 libx265-dev \
33 yasm \
34 libsdl2-2.0 \
35 libopus-dev \
36 libmp3lame-dev
37
38 # 装ffmpeg
39 RUN apt-get install -y ffmpeg
40
41 # 将视频复制到容器
42 COPY jial.mp4 .
其中,需要注意的是
COPY rtsp/ /workspace/usr/
COPY jial.mp4 .
这两段代码,需要在fr目录下将提前下载好的rtsp服务以及jial.mp4视频复制到本目录,创建好的目录内容应该如下:
3.接下来就可以建立docker镜像了,执行命令
docker build -t fr .
会很漫长一段时间,如果执行成功提示会像下面一样,但下面这张图并不是我第一次执行该命令的结果。
这时,执行
docker images
会显示创建的镜像如下:
fr latest 34434bf01548 21 hours ago 1.04GB
4.接下来运行镜像,执行命令:
docker run -it --net host --rm --shm-size 32g -v $PWD:/data fr:latest
以下是对该命令的解释:
这条命令命令用于在 Docker 容器中运行一个名为 fr:latest 的镜像
-it: 这两个选项通常一起使用。-i 或 --interactive 保持容器的标准输入(STDIN)开放,即使没有附加到容器。-t 或 --tty 分配一个伪终端或终端。这两个选项结合起来,使得用户可以与容器中的进程进行交互,就像在一个真实的终端中一样。
--net host: 这个选项让容器使用宿主机的网络堆栈。这意味着容器不会获得自己的 IP 地址,而是直接使用宿主机的 IP地址和端口。这可以简化网络配置,但在某些情况下可能会带来安全风险,因为它允许容器访问宿主机的所有网络接口。
--rm
: 这个选项告诉 Docker 在容器停止后自动清理(删除)该容器。这有助于避免不必要的容器堆积,特别是在进行一次性任务或测试时。
--shm-size 32g
: 这个选项设置容器内 /dev/shm
分区的大小为 32GB。/dev/shm
是一个特殊的文件系统,通常用于共享内存和临时文件。在某些需要大量共享内存的应用程序中,增加这个分区的大小可能是必要的。
-v $PWD:/data
: 这个选项用于挂载卷。-v
或 --volume
允许你将宿主机的目录或文件挂载到容器内的指定位置。$PWD
是一个环境变量,代表当前工作目录的完整路径。因此,这个选项将当前工作目录挂载到容器内的 /data
目录。这允许容器访问和修改宿主机上的文件,这对于数据持久化或共享数据非常有用。
fr:latest
: 这指定了要运行的 Docker 镜像的名称和标签。在这个例子中,镜像的名称是 fr
,标签是 latest
。如果省略标签,Docker 默认使用 latest
标签。
执行后会出现下面的样式
在这里就可以进行推流操作了,首先看看我们的镜像的工作目录里都有什么:
从这里可以看到在/workspace目录里含有所需的视频以及usr目录里RTSP所需的服务,执行ffmpeg -version命令可以看到相关信息就说明镜像可以正常使用。
5.在推流前,先打开RTSP服务,执行以下命令并看到以下提示就说明没有问题:
cd usr
./mediamtx
这里说明一下,要退出RTSP服务显示原来的命令行界面直接 CTRL+Z或者CTRL+C就可以了,但是这不是关闭服务的正确方式,当你再次执行./mediamtx 时,则会出现以下提示:
这时输入fg就可以继续运行该服务了。如果要关闭该服务进程一般是执行
Killall -2 MediaServer
但是在docker中我并没有安装这个命令包,所以只能退出容器并重新运行容器了。
6.接下来新打开一个终端,执行以下命令,并最终会输出如下图所示的提示。
ffmpeg -re -i jial.mp4 -vcodec libx264 -preset slow -maxrate 1000k -bufsize 2000k -pix_fmt yuv420p -f rtsp rtsp://127.0.0.1:8554/steam
或
ffmpeg -re -i jial.mp4 -vcodec libx264 -preset slow -crf 23 -pix_fmt yuv420p -f rtsp rtsp://127.0.0.1:8554/steam
7.同时打开Linux操作系统里的VLC ,按照下面操作拉流
接下来点击播放就可以了。
退出容器也很简单,直接在命令行输入
exit