在Docker镜像中运行vlc,通过rtsp协议

时间:2017-02-10 14:45:23

标签: bash video docker vlc rtsp

我正在使用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"]

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

1 个答案:

答案 0 :(得分:0)

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

其次,您无法将StringBuilder guessedPart = new StringBuilder; for (int lc = 0; lc < word.lenght(); lc++) { for (char c : correct) if (word.indexOf(lc) = c) guessedPart.append(c); if (guessedPart.length() < lc) guessedPart.append('_'); String guessedWord = guessedPart.toString(); 作为vlc运行。

第三,当文件位于主机时,您无法提供文件作为参数并期望root内容中打开它EM>。你需要先安装它。

第四,你需要引用vlc变量,否则它将以$sout开头,而bash将忽略它作为参数赢得了&t 将其传递给#

第五,如果您希望流在外面可用,则需要expose端口。

进行以下更改:

Dockerfile:

vlc

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