利用Docker启动SRS和ffmpeg

打开官网:Docker | SRS (ossrs.io)

拉取srs镜像并实例化为容器

我这里用的是第5版srs。

在本机用管理员权限打开PowerShell(Windows+X会弹出选项框,选择对应的选项即可)

在PowerShell中输入

docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 ossrs/srs:5

显示说Unable to find image 'ossrs/srs:5' locally,就是说没有在本机找到这个镜像,于是下一行开始自动pull这个镜像。此时,屏幕上会输出若干日志。打开docker的container->Logs,发现他俩的日志一样的,这就说明这个镜像已经实例化成为容器并且正在运行中。

根据网上教程重新拉取了一个镜像,执行下面的语句,给container命名为srs5.0,并运行

docker run -it --name srs5.0 -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 10080:10080/udp registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5

打开docker,发现刚才拉取的镜像和实例化的容器已经在正常运行了。红框中前面是--name后面的参数,蓝色链接就是用来实例化容器的镜像地址

用docker安装并启动ffmpeg

但是报错:

打开Ubuntu,输入如下命令,查看所有的ffmpeg镜像

拉取ffmpeg镜像

看到第一个linuxserver星最多,果断选择这个镜像来拉取。在Ubuntu里输入下面的命令:

docker pull linuxserver/ffmpeg

我也不知道为啥它给我整了两个pulling我啥都没干啊...Anyway,我们继续。接着输入下面的命令来查看本地都有哪些镜像。

docker image ls

可以看到第一个就是我们刚刚拉取的ffmpeg镜像,然后最下面的就是根据新教程拉取的srs镜像。

ffmpeg容器被创建但未运行

接下来按照我们之前对srs镜像的处理方法,执行如下命令,将该镜像实例化成容器并给它命名为ffmpeg,并运行

docker run -it --name ffmpeg -p 8066:8066 linuxserver/ffmpeg:latest

此后,我打开docker desktop看了一下,确实有这个容器了,但是并没有运行起来。在Ubuntu里输入docker ps以查看所有运行中的容器,也没有出现新实例化的fmpeg,很郁闷。

关注到了在Ubuntu和docker desktop日志里的同样的提示:

斗胆在Ubuntu里尝试运行一下它说的那个man ffmpeg

额......不管了,先去睡一觉再说。遇到困难睡大觉!!!

起床并继续干活!

在网上查了一下ffmpeg的docker容器一启动就关闭的原因,找到一条比较符合我情况的解释:docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出。

ffmpeg是一个对视频进行编解码等一系列操作的软件。也就是说,当ffmpeg没有处理视频的任务时,容器就会退出。所以,现在应该做的是学习如何使用ffmpeg将视频推流到srs服务器上去。

重新拉取srs镜像并实例化为容器并尝试推流

打开srs官网,按指示输入命令:

docker run --rm -it ossrs/srs:encoder ffmpeg -stream_loop -l -re -i doc/source.flv -c copy -f flv rtmp://host.docker.internal/live/livestream

推流参数报错(stream_loop)

再次拉取一个新镜像并实例化为容器。应该去查一下如何将启动已有容器和用ffmpeg推流的命令结合起来。。。

可以看到最后报错说:错误信息“Expected number for stream_loop but found: -l”表明ffmpeg期望一个数字作为stream_loop的参数,但却找到了“-l”这个标志。

ffmpeg的-stream_loop标志用于指定输入流的循环次数。这个参数应该后面跟着一个数字,表示循环的次数。但在你的问题中,看起来你在-stream_loop后面跟了一个“-l”,而不是一个数字。

解决参数报错的问题

因此,需要检查ffmpeg命令,并确保-stream_loop后面跟的是一个数字,而不是“-l”。

如果想让输入流循环播放5次,命令应该是这样的:

ffmpeg -re -i 1.mp4 -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp -stream_loop 5 rtsp://192.168.79.133/live/room

重新输入:

查了一下报错原因:docker没有暴露在某个端口上或者若干原因。我打开docker看了一下,新拉取的tag为encode镜像并没有创建对应的容器,没有在运行。所以是因为该容器不存在导致的问题。于是我斗胆更改了一下命令,希望启动已有的容器:

 docker run linuxserver/ffmpeg:latest ffmpeg -stream_loop 5 -re -i doc/source.flv -c copy -f flv rtmp://host.docker.internal/live/livestream

此时,docker desktop上根据已有镜像新创建了容器。最下面那个就是

Ubuntu里显示:

啊我非常的满意啊!虽然是error,但是就该是error。我就是想看到这个error。因为我没有在文件夹里添加任何视频文件。接下来只需要在指定文件夹里添加视频文件就可以了。红框里的是添加好的视频的路径。试着改了一下启动容器的命令,发现出了问题。

出现问题:ffmpeg容器一启动就关闭

问了一下文心一言,它意思没啥问题。此外,我们还能够明确,第二个ffmpeg开始,往后的命令是独立的一部分,前面的就是单纯地启动容器。但是好像也有点区别,因为如果指只输入docekr start ffmpeg的话,容器会运行(虽然一运行就关闭,但是最起码没有报错)

重来一遍:先启动srs,再启动ffmpeg,再输入ffmpeg命令。

好好好,还是不行,非要我安装一个ffmpeg。呵,我就不。

出现报错:找不到文件

重新拉取了一个ffmpeg镜像,实例化为容器并进行推流

 docker run -it --name ffmpeg_new -p 8066:8066 jrottenberg/ffmpeg ffmpeg -stream_loop 1 -re -i E://a_Junior/Internet协议与设计/ffmpeg_video/firework.mp4 -c copy -f flv rtmp
://host.docker.internal/live/livestream

又做了多次尝试,结果都是报错:没有找到这个文件。文心一言给出的解释是路径输入风格有问题,我又做了尝试,没用。探索过后发觉,在Windows系统的目录下的文件应该首先被cd到Linux的目录下。但是由于二者的语法构成不同,因此WSL提供专门为此服务的工具。

用WSL的工具将Windows的文件cd到Linux中

编写脚本实现转换

将如下代码写在win2linux_path.sh的脚本中

# usage: bash win2linux_path.sh "C:\Users\asus\Anaconda3"

win_path=$1 # 脚本的第一个参数就是windows路径
#win_path="C:\Users\asus\Anaconda3" # 一个示例路径

tmp_path=${win_path/:/} # 将冒号删掉
tmp_path=${tmp_path//\\/\/} # 将\\替换为/

disk_id=${tmp_path:0:1} # 取出第一个字母,也就是C盘的C,冒号后面第一个0指的是从下标为0的地方开始提取,第二个冒号后面的1表示提取一个字母
disk_id=$(echo $disk_id | tr [:upper:] [:lower:]) # 大写转小写
#echo $disk_id

other_path=${tmp_path:1} # 路径中除了磁盘以外的部分

linux_path="/mnt/"${disk_id}${other_path} # 需要将/mnt/接在路径最前方
echo "windows path is "${win_path}
echo "linux path is "${linux_path}

输入windows里的路径执行之后得到Linux的路径格式。此处参考Windows路径转成Linux子系统的路径_windows路径和linux路径变换-CSDN博客

将转换完的路径输入ffmpeg推流命令

将启动容器和推流命令分开输入之后回到了ffmpeg瞬间启动和关闭导致的无法识别ffmpeg命令的问题上来。

解决ffmpeg启动后瞬间关闭的问题

按如下命令新实例化一个容器

docker run -it --entrypoint='bash' jrottenberg/ffmpeg

重点在于--entrypoint='bash'上,是创建一个容器用于终端登录。完成之后看一下其状态:特别好,最下面那个就是,已经运行起来了。

希望其在停止后开始就用最普通的start命令。用下面的命令,在容器开启之后重新进入这个终端

docker attach <container_name>

执行结果如下图,

文件不存在的问题仍未解决

请教了学过Linux的舍友,舍友说可以从Linux文件夹中查看磁盘文件。不需要再进行文件剪切之类的移植操作。于是打开了Ubuntu文件夹,在mnt里果然找到了下图内容。但是说无法访问,可能没有权限使用网络资源。无所谓,我有gpt。

从Windows系统打开想访问的文件夹的属性->共享

啊,可以看到下面图片说它这个盘是不共享的,那我们就给它改成共享的

点击高级共享,勾选:“共享此文件夹”

完事之后,就可以看到这个文件夹变成“共享式”的了

然后再回到Ubuntu,访问E盘。

我去?还不行??报错还是一样的。无碍,再战!

再回到高级共享页面,点击“权限”,出现下图界面。勾选所有选项框,我之前是只有后两个勾选上了,就把第一个也勾上了。然后确定。

解决找不到文件的问题

由于是在ffmpeg容器里使用视频文件,因此需要将windows中的文件夹挂载在docker中。挂载方法:docker提供一个叫数据卷的东西。数据卷:“其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的”。感觉像是由一个容器定义的一个数据挂载信息。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。操作起来就是随笔用一个镜像实例化一个新的容器,然后在该语句中执行/本地路径/文件夹:/需要挂载的路径 的操作。代码如下:

 docker run -it -v /mnt/e/fire:/usr/Downloads  --name dataVol jrottenberg/ffmpeg

上述代码的意思就是:用jrottenberg/ffmpeg镜像实例化一个名字是dataVol的容器,并且完成文件夹从本地到docker路径的挂载,并运行该容器。该容器就是所谓“数据卷”

之后,再新建一个容器来使用这个数据卷,命令如下:

 docker run -it --volumes-from dataVol jrottenberg/ffmpeg

其中,--volums-from后面跟的就是需要再该容器中使用的数据卷(容器)的名称,剩下的语法都何前文类似,不做解释。

需要注意的是,如果实例化该容器的镜像为ffmpeg,就有可能出现一启动就关闭的情况(如前文的情况),因此需要修改一下创建语句:

 docker run -it --entrypoint='bash' --volumes-from dataVol jrottenberg/ffmpeg

为了验证挂载和使用是否成功,进行如下操作:

首先运行并进入最后创建的容器

然后用cd /需要挂载的路径,查看是否成功

 cd /usr/Downloads

成功之后再使用“ls”查看该文件夹下的所有文件。此时就能看到需要操作的文件了。

接下来就在这个容器中进行ffmpeg的推拉流操作,即可。

下一篇讲述如何真正使用ffmpeg进行推流。

要在 Docker 上安装 SRS(Simple-RTMP-Server),您可以按照以下步骤进行操作: 1. 首先,确保您的系统已经安装了 Docker。您可以通过运行 `docker version` 命令来检查 Docker 是否已成功安装。 2. 创建一个工作目录,用于存储 SRS 的配置文件日志文件。假设您将工作目录命名为 `srs`,可以使用以下命令进行创建: ``` mkdir srs ``` 3. 创建 SRS 的配置文件 `srs.conf`,并将其保存在工作目录中。您可以使用文本编辑器(如 `vi` 或 `nano`)创建并编辑该文件。以下是一个简单的示例配置: ``` srs { listen 1935; max_connections 1000; daemon off; } ``` 您可以根据需要调整配置参数。 4. 创建一个名为 `Dockerfile` 的文件,并将其保存在工作目录中。在该文件中,您可以指定要运行的基础镜像以及一些其他设置。以下是一个示例 `Dockerfile` 的内容: ``` FROM alpine:latest LABEL maintainer="Your Name <your@email.com>" RUN apk --no-cache add \ build-base \ ffmpeg COPY srs.conf /etc/srs.conf EXPOSE 1935 CMD ["srs"] ``` 在这个例子中,我们使用 Alpine Linux 作为基础镜像,并安装了一些必要的依赖项(如编译工具 FFmpeg)。然后,将配置文件复制到容器内部,并暴露 SRS 所使用的默认端口 1935。最后,我们指定容器启动时要运行的命令。 5. 构建 Docker 镜像。在工作目录中打开终端,并运行以下命令: ``` docker build -t srs-server . ``` 这将使用 `Dockerfile` 中定义的设置来构建一个名为 `srs-server` 的镜像。 6. 运行 SRS 容器。运行以下命令来启动一个新的容器: ``` docker run -d -p 1935:1935 --name srs srs-server ``` 这将在后台启动一个名为 `srs` 的容器,并将容器内部的端口 1935 映射到主机上的相同端口。 现在,您应该已经成功安装并运行了 SRS。您可以通过使用适当的 RTMP 客户端连接到 `rtmp://your-server-ip/live/stream_name` 来测试它。 请注意,这只是一个简单的示例,可能需要根据您的实际需求进行调整。有关更多详细信息高级用法,请参阅 SRS 的官方文档。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值