我正在使用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; 我该怎么办?感谢
答案 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'"