在 Docker 镜像中运行 vlc 通过 rtsp 协议发送视频流

Han*_*ang 4 bash video vlc rtsp docker

我正在一个项目中使用 Docker。目标是在VLC中播放视频并通过RTSP协议发送数据流,以便其他机器(用户)可以在他们的机器上实时看到视频。视频、Dockerfile 和 bash 文件位于同一文件夹中。这是我使用的 bash 文件(simulate_video_stream.sh):

# Two facultativ parameters : -f <nameOfTheVideoFile> and -i <URL_Output>
SCRIPTPATH=$( cd $(dirname $0) ; pwd -P );
name=$SCRIPTPATH"/counter.mp4";
sdp="rtsp://:8554/flux";
while getopts "f:i:" OPTNAME
do
   case $OPTNAME in
      f) name=$OPTARG;;
      i) sdp=$OPTARG;;
   esac
done
sout="#transcode{vb=0,scale=0,acodec=mpga,ab=128,channels=2,samplerate=44100}:rtp{sdp="$sdp"}";
vlc -vvv $name --sout $sout
Run Code Online (Sandbox Code Playgroud)

这是 Dockerfile:

FROM ubuntu

RUN apt-get update \
&& apt-get install -y vlc

COPY simulate_video_stream.sh /tmp/
COPY counter.mp4 /tmp/
ENTRYPOINT ["/tmp/simulate_video_stream.sh"]
Run Code Online (Sandbox Code Playgroud)

通过“sudo docker build -t test”构建成功。我希望将它与 bash 文件中定义的两个参数一起使用,例如“docker run test -f namevideo.mp4 -i rtsp://:8554/test” ,但它返回“write pipeline: bad file detector”应该怎么做我愿意?谢谢

Neh*_*ani 5

首先,您需要提供一个解释器来执行脚本。

其次,你不能vlc以root.

第三,当文件位于主机上时,您不能提供文件作为参数并期望从容器内部vlc打开它。您需要先安装它。

第四,您需要引用$sout变量,否则它将以 开头#,并且 bash 将忽略它作为参数,并且不会将其传递给vlc.

第五,如果您希望流在外部可用,则需要公开端口。

进行以下更改:

Dockerfile:

FROM ubuntu

RUN apt-get update \
&& apt-get install -y vlc

RUN useradd -m vlcuser

COPY simulate_video_stream.sh /tmp/
COPY counter.mp4 /tmp/
ENTRYPOINT ["/tmp/simulate_video_stream.sh"]
Run Code Online (Sandbox Code Playgroud)

脚本simulate_video_stream.sh:

#!/bin/bash
# Two facultativ parameters : -f <nameOfTheVideoFile> and -i <URL_Output>
SCRIPTPATH=$( cd $(dirname $0) ; pwd -P );
name=$SCRIPTPATH"/counter.mp4";
sdp="rtsp://:8554/flux";
while getopts "f:i:" OPTNAME
do
   case $OPTNAME in
      f) name=$OPTARG;;
      i) sdp=$OPTARG;;
   esac
done
sout="#transcode{vb=0,scale=0,acodec=mpga,ab=128,channels=2,samplerate=44100}:rtp{sdp="$sdp"}";
su vlcuser -c "vlc -vvv $name --sout '$sout'"
Run Code Online (Sandbox Code Playgroud)

并将容器运行为:

docker run -v $PWD/namevideo.mp4:/tmp/namevideo.mp4 -p 8554:8554 test -f /tmp/namevideo.mp4 -i rtsp://:8554/test
Run Code Online (Sandbox Code Playgroud)