用ffmpeg+nginx+海康威視網路攝像頭rtsp在手機端和電腦端實現直播
原料:海康威視攝像頭,nginx伺服器,ffmpeg。
首先海康威視攝像頭,
它的rtsp資料流的地址為:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
說明:
username: 使用者名稱。例如admin。
password: 密碼。例如12345。
ip: 為裝置IP。例如 192.0.0.64。
port: 埠號預設為554,若為預設可不填寫。
codec:有h264、MPEG-4、mpeg4這幾種。
channel: 通道號,起始為1。例如通道1,則為ch1。
subtype: 碼流型別,主碼流為main,輔碼流為sub。
主碼流:rtsp://admin:[email protected]:554/h264/ch1/main/av_stream
子碼流:rtsp://admin:[email protected]:554/h264/ch1/sub/av_stream
然後是nginx伺服器,本人是在Linux主機上安裝了nginx伺服器,對於nginx伺服器就不多介紹了。下面是詳細的安裝步驟,因為考慮的訪問量會比較大,所以是用原始碼包安裝的。
下載之後的檔案時:nginx-1.10.1.tar.gz,在Linux下通過,tar -cvf nginx-1.10.1.tar.gz 命令可以進行解歸檔,
將該檔案解壓之後放到/home/user,該目錄是自己隨意選擇的,為了方便。
就可以進入nginx1.10.1的解歸檔之後資料夾,執行
./configure --prefix=/usr/local/nginx --add-module=/home/user/nginx-rtmp-module --with-http_ssl_module
完成之後執行:
make
make之後執行
make install
接著就是等待一般半個小時左右,安裝完成之後進行配置檔案的修改,
vi /etc/local/nginx/conf/nginx.conf
儲存完配置檔案之後,啟動nginx服務#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } rtmp { server { listen 1935; application myapp { live on; } application hls { live on; hls on; hls_path /tmp/hls; } } } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
cd /usr/local/nginx/sbin
./nginx
啟動時可能會遇到端口占用的問題,因為之前nginx已經啟動了,所以先把程序停止
killall -9 nginx
然後在啟動nginx就不會出錯了。
至此,伺服器端的nginx伺服器就已經搭建好了。
接著就是ffmpeg,用於rtsp協議轉換成rtmp協議,並且推流到nginx伺服器
解壓,執行安裝命令,./configure make make install 具體如下:
由於名字過於複雜mv ffmpeg-0.4.9-p20051120.tar.bz2 ffmpeg 改個名
配置安裝路徑:./configure --enable-shared --prefix=/usr/local/ffmpeg
然後 make
最後make install完成ffmpeg原始碼包的安裝。
為了方便起見,我們可以將ffmpeg的安裝地址加入到環境變數中,修改/etc/ld.so.conf檔案,在末尾加入
/usr/local/ffmpeg/lib,然後就可以在任意目錄下執行ffmpeg命令。
額外配置
1.為了能夠成功將視訊流推送到hls上,還需要對nginx.conf配置檔案進行修改,在http中新增下面內容:
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}
2.由於延遲比較大,根據前輩們的經驗,在nginx配置檔案中,進行修改
application hls {
live on;
hls on;
hls_path /data/misc/hls;
hls_fragment 1s;
hls_playlist_length 3s;
} <pre name="code" class="html">
到這裡準備工作就已經做好了,下面進入正題:在Linux伺服器上執行ffmpeg命令,實現轉碼以及推流
ffmpeg -i rtsp://admin:[email protected] -vcodec copy -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 -f flv rtmp://172.16.97.29:1935/hls/test
手機端,在任意的瀏覽器,不是自帶的,輸入172.16.97.29:1935/hls/test.m3u8,此時我們就可以看到攝像頭的監控畫面。
如果您覺得本文章對您有幫助,感謝您的支援!