最近碰到一個項目需要用到 rtsp 視頻流做測試, 由於真實環境的 攝像頭 並不能滿足需求,故嘗試了一下用本地視頻文件轉換成rtsp視頻流做測試,記錄一下~

採用方案: Docker + EasyDarwin + FFmpeg

準備工作:

1. 創建一個文件夾 easydarwin

2. cd easydarwin

3. wget https://github.com/EasyDarwin/EasyDarwin/releases/download/v8.1.0/EasyDarwin-linux-8.1.0-1901141151.tar.gz  (下載EasyDarwin 軟件包)

4. 創建: Dockerfile

5. 將easydarwin 的配置文件 也放到此目錄下: easydarwin.xml

6. 創建一個自動轉換 /root/video 目錄下的視頻文件成rtsp 流的 shell 腳本: start.sh

編寫Dockerfile:

FROM centos:latest
USER root

COPY ./EasyDarwin-linux-8.1.0-1901141151.tar.gz /EasyDarwin-linux-8.1.0-1901141151.tar.gz
COPY ./start.sh /start.sh
RUN mkdir -p /etc/streaming/
COPY ./easydarwin.xml /etc/streaming/easydarwin.xml
RUN yum -y install tar \
        && yum -y install gcc automake autoconf libtool make wget

RUN  gzip -d /EasyDarwin-linux-8.1.0-1901141151.tar.gz \
        && tar -xf /EasyDarwin-linux-8.1.0-1901141151.tar \
        && mv EasyDarwin-linux-8.1.0-1901141151 EasyDarwin \
	&& cd /

RUN wget https://ffmpeg.org/releases/ffmpeg-4.1.5.tar.xz \
                && tar -xf ffmpeg-4.1.5.tar.xz \
        && cd ffmpeg-4.1.5 \
                && curl -O -L http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz \
        && tar -xf yasm-1.3.0.tar.gz \
        && cd yasm-1.3.0 \
        && ./configure \
        && make \
        && make install \
        && cd /

RUN cd /ffmpeg-4.1.5 \
            && ./configure \
        && make \
        && make install \
        && cd /

ENTRYPOINT /start.sh

編寫start.sh

#!/bin/sh
cnt=`ps -ef | grep "[e]asydarwin" | wc -l`
if [ $cnt -lt 1 ];then
	nohup /EasyDarwin/easydarwin &
fi
if [[ ! -d /video ]];then
	mkdir -p /video
fi

while true;do
for video in `ls /video`; do
	if [[ "$(ps -ef | grep "$video" | grep -v "grep" | wc -l | tr -d ' ' )" = "1" ]]; then
				echo "Safe $video"
	else
		short_name=`echo $video | cut -d '.' -f 1`
		nohup /ffmpeg-4.1.5/ffmpeg -re -stream_loop -1 -i /video/$video -vcodec copy -rtsp_transport tcp  -f rtsp rtsp://localhost/$short_name &
		echo "Started $video"
	fi
done

sleep 1m
done

用途說明:

Dockerfile將我們需要的環境準備好,包括安裝編譯安裝EasyDarwin以及需要的依賴包, FFmpeg等, 最後運行 start.sh. 注意 Docker中 ENTRYPOINT 和 CMD 命令的用法區別。

start.sh 用來啓動EasyEarwin,並每隔1分鐘查看 /root/video 目錄下的視頻文件,如果有新文件,就會自動使用ffmpeg 轉爲rtsp流, 地址爲 rtsp://localhost/short_name, 其中localhost使用時改成服務器的IP地址,short_name 爲 當前食品文件的文件名(去掉擴展名, 如: video.mp4 的 short_name 爲 video)

最後打包鏡像,然後運行container, 可以在 easydarwin 目錄的同級別創建 啓動腳本: easydarwin.sh

#!/bin/bash
easy=`ls ./easydarwin/*.gz | wc -l`
if [[ $easy -lt 1 ]];then
        wget https://github.com/EasyDarwin/EasyDarwin/releases/download/v8.1.0/EasyDarwin-linux-8.1.0-1901141151.tar.gz
        mv EasyDarwin-linux-8.1.0-1901141151.tar.gz ./easydarwin
fi
local_img=`docker images | grep "[e]asydarwin" | wc -l`
if [ $local_img -lt 1 ];then
        cd easydarwin
        docker build -t easydarwin_qa . --no-cache
        cd ..
fi

#掛載host 的 /root/video 到 container 的對應路徑
docker run -dit --net host --restart=always --name easy_qa -v /root/video:/video easydarwin_qa

所以只需在裝了docker的服務器上啓動此shell就可以: bash easydarwin.sh

相關文章