【问题标题】:run vlc in a Docker image to send a video stream via rtsp protocol在 Docker 镜像中运行 vlc 以通过 rtsp 协议发送视频流
【发布时间】:2017-06-28 23:08:27
【问题描述】:

我正在为一个项目使用 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

这里是 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"]

"sudo docker build -t test 构建成功。我希望将它与 bash 文件中定义的两个参数一起使用,例如 "docker run test - f namevideo.mp4 -i rtsp://:8554/test" 但它返回“写管道:错误的文件描述符” 我该怎么办?谢谢

【问题讨论】:

  • 出于好奇,主机操作系统是什么,架构是什么?
  • 我使用的是 Ubuntu 16.04 x64

标签: bash video docker vlc rtsp


【解决方案1】:

来自Nehal J Wani 的答案对我有一个小的改动:我必须使用“clvc”命令(在没有用户界面的情况下运行 VLC)而不是“vlc”,否则 VLC 会在没有正确启动流的情况下关闭。

所以,simulate_video_stream.sh 中的最后一条命令是:

su vlcuser -c "cvlc -vvv $name --sout '$sout'"

【讨论】:

    【解决方案2】:

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

    第二,你不能将vlc作为root运行。

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

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

    第五,如果你想让流在外面可用,你需要expose端口。

    进行以下更改:

    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"]
    

    脚本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'"
    

    并将容器运行为:

    docker run -v $PWD/namevideo.mp4:/tmp/namevideo.mp4 -p 8554:8554 test -f /tmp/namevideo.mp4 -i rtsp://:8554/test
    

    【讨论】:

    • 抱歉耽搁了。构建是成功的。但是当我执行您提供的docker run 命令时,vlc 似乎工作了,然后立即退出。而且我无法通过在同一子网中的另一台计算机中使用 [rtsp://my ip adress:8554/test] 来查看通量。
    • 另外,如果我想使用与 bash 文件和 Dockerfile 位于同一文件夹中的 counter.mp4 对其进行测试,是否可以替换 'docker 中的所有 'namevideo.mp4'用'counter.mp4'运行'命令?非常感谢。
    • 我期待的是docker run会打开一个vlc播放器并播放视频,在此期间我们可以通过链接访问它。我猜?
    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 2020-05-05
    • 2014-04-05
    • 2016-01-28
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多