2017-02-10 38 views
0

Я использую Docker для проекта. Цель состоит в том, чтобы воспроизвести видео в VLC и отправить поток данных по протоколу RTSP, чтобы другие машины (пользователь) могли видеть видео в прямом эфире на своих машинах. видео, файл Docker и файл bash находятся в одной папке. здесь Баш файл (simulate_video_stream.sh) я использую:запустить vlc в изображении Docker для отправки видеопотока по протоколу 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"] 

Билда является успех на "Суд Docker построить -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 переменную, в противном случае она будет начинаться с # и Баш будет игнорировать его как аргумент и не передаст его 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"] 

Script 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

извините за задержку. сборка была успешной. но когда я сделал команду «docker run», которую вы предложили, казалось, что vlc работал, а затем сразу же ушел. И я не вижу поток с помощью [rtsp: // my ip address: 8554/test] на другом компьютере в той же подсети. –

+0

плюс, если я хочу протестировать его с помощью counter.mp4 в той же папке, что и файл bash, и файл Docker, правильно ли я заменил все «namevideo.mp4» в команде «docker run» на «counter». mp4? Большое спасибо. –

+0

Я ожидал, что «запуск docker» откроет плеер vlc и воспроизведет видео, в течение этого времени мы можем посетить его по ссылке. Я полагаю? –