2017-02-10 197 views
0

我正在爲一個項目使用Docker。其目標是在VLC中播放視頻並通過RTSP協議發送數據流,以便其他機器(用戶)可以在他們的機器上實時觀看視頻。 視頻,Dockerfile和bash文件位於相同的文件夾中。這裏是一個bash文件(simulate_video_stream.sh)我使用:在Docker鏡像中運行vlc以通過rtsp協議發送視頻流

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

構建由成功 「命令泊塢窗打造-t測試。」我希望可以在bash文件中定義兩個參數,比如「docker run test -f namevideo.mp4 -i rtsp://:8554/test」 但是它會返回「write pipe:bad file描述符「 我該怎麼辦?謝謝

+0

出於好奇,是什麼主機O S和什麼架構? –

+0

我使用Ubuntu 16.04 x64 –

回答

0

首先,您需要給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 
+0

對於延遲感到抱歉。該構建是成功的。但是當我做了你提供的「碼頭運行」命令時,似乎vlc工作,然後立即退出。而且在同一子網的另一臺計算機上使用[rtsp://我的IP地址:8554/test]時看不到通量。 –

+0

加上,如果我想在與bash文件和Dockerfile相同的文件夾中使用counter.mp4來測試它,是不是將'docker run'命令中的'namevideo.mp4'替換爲'counter'是正確的。 MP4' ?非常感謝你。 –

+0

我期望的是'碼頭運行'將打開一個vlc播放器並播放視頻,在此期間我們可以通過鏈接訪問它。我猜? –