視頻文件自動轉rtsp流
最近碰到一個項目需要用到 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