1. 程式人生 > >用ffmpeg+nginx+海康威視網路攝像頭rtsp在手機端和電腦端實現直播

用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

#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;
    #    }
    #}

}
儲存完配置檔案之後,啟動nginx服務

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,此時我們就可以看到攝像頭的監控畫面。

如果您覺得本文章對您有幫助,感謝您的支援!