Experience: DJI UAV RTMP live streaming (Windows version has been successful)

DJI drone rtmp live streaming to computer (Windows version has been successful)

1. Required resources

1. The Gryphon version of nginx, which has integrated rtmp streaming compilation ( nginx-Gryphon )
2. The server status check program stat.xsl ( nginx-rtmp-module )
3. ffmpeg ( ffmpeg )
4. VLC ( VLC )

2. Installation

1. Unzip the downloaded nginx 1.7.11.3 Gryphon and modify the file name to nginx-1.7.11.3-Gryphon. There must be no Chinese in the absolute path and it must be all in English!
2. In the conf folder in the root directory, if there is an nginx.conf file, directly enter and modify it; if not, create one.
3. In the nginx file, paste the following content.


#user  nobody;
# multiple workers works !
worker_processes  2;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    
    
    worker_connections  8192;
    # max value 32768, nginx recycling connections+registry optimization = 
    #   this.value * 20 = max concurrent connections currently tested with one worker
    #   C1000K should be possible depending there is enough ram/cpu power
    # multi_accept on;
}

rtmp {
    
    
    server {
    
    
        listen 1935;
        chunk_size 4000;
        application live {
    
    
             live on;
        }
    }
}

http {
    
    
    #include      /nginx/conf/naxsi_core.rules;
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr:$remote_port - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

#     # loadbalancing PHP
#     upstream myLoadBalancer {
    
    
#         server 127.0.0.1:9001 weight=1 fail_timeout=5;
#         server 127.0.0.1:9002 weight=1 fail_timeout=5;
#         server 127.0.0.1:9003 weight=1 fail_timeout=5;
#         server 127.0.0.1:9004 weight=1 fail_timeout=5;
#         server 127.0.0.1:9005 weight=1 fail_timeout=5;
#         server 127.0.0.1:9006 weight=1 fail_timeout=5;
#         server 127.0.0.1:9007 weight=1 fail_timeout=5;
#         server 127.0.0.1:9008 weight=1 fail_timeout=5;
#         server 127.0.0.1:9009 weight=1 fail_timeout=5;
#         server 127.0.0.1:9010 weight=1 fail_timeout=5;
#         least_conn;
#     }

    sendfile        off;
    #tcp_nopush     on;

    server_names_hash_bucket_size 128;

## Start: Timeouts ##
    client_body_timeout   10;
    client_header_timeout 10;
    keepalive_timeout     30;
    send_timeout          10;
    keepalive_requests    10;
## End: Timeouts ##

    #gzip  on;

    server {
    
    
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        ## Caching Static Files, put before first location
        #location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    
    
        #    expires 14d;
        #    add_header Vary Accept-Encoding;
        #}

# For Naxsi remove the single # line for learn mode, or the ## lines for full WAF mode
        location / {
    
    
            #include    /nginx/conf/mysite.rules; # see also http block naxsi include line
            ##SecRulesEnabled;
        	  ##DeniedUrl "/RequestDenied";
	          ##CheckRule "$SQL >= 8" BLOCK;
	          ##CheckRule "$RFI >= 8" BLOCK;
	          ##CheckRule "$TRAVERSAL >= 4" BLOCK;
	          ##CheckRule "$XSS >= 8" BLOCK;
            root   html;
            index  index.html index.htm;
        }

# For Naxsi remove the ## lines for full WAF mode, redirect location block used by naxsi
        ##location /RequestDenied {
    
    
        ##    return 412;
        ##}

## Lua examples !
#         location /robots.txt {
    
    
#           rewrite_by_lua '
#             if ngx.var.http_host ~= "localhost" then
#               return ngx.exec("/robots_disallow.txt");
#             end
#           ';
#         }

        #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; # single backend process
        #    fastcgi_pass   myLoadBalancer; # or multiple, see example above
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  $document_root$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 spdy;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_prefer_server_ciphers On;
    #    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!eNULL:!MD5:!DSS:!EXP:!ADH:!LOW:!MEDIUM;

    #    location / {
    
    
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

Note: "application live" in rtmp, application+space+live, live even access path, such as localhost:1935/live.
4. In the directory where nginx.exe is located, that is, the root directory, enter the cmd window, enter nginx.exe or .\nginx.exe, and start nginx.
5. You can directly enter localhost in the browser to verify whether nginx is started. If the main page of nginx appears, it is successful.
6. Unzip the server status check program and put it in the root directory of nginx.
insert image description here
7. After decompressing ffmpeg, add environment variables to its bin directory.
8. Install VLC

3. ffmpeg streaming

The purpose of ffmpeg streaming is to confirm that port 1935 of nginx has been opened and run the rtmp streaming function to troubleshoot and other problems.
1. Open the cmd window in the folder where the test video is located, and enter the command ffmpeg.exe -re -i .\video name.mp4 -vcodec libx264 -acodec aac -f flv rtmp://127.0.0.1:1935/live 2.
If If the following screen appears, streaming fails, because port 1935 of nginx is not opened, or rtmp is not streaming.

Please add a picture description
3. If the following screen appears, it is successful, and the frame, fps and other information will continue to change.
Please add a picture description

4. Open VLC, select Open Network Stream in the upper left corner of the media, enter rtmp://127.0.0.1:1935/live in the network URL, and click Play.
Please add a picture description
5. If the video is displayed, it is successful.

4. UAV rtmp streaming

1. Ensure that the computer and the remote control of the drone (or the mobile phone connected to the remote control) are in the same local area network (that is, the same router or hotspot).
2. Confirm the ip address on the computer, open the cmd window and enter the command ipconfig to determine the ip address of the computer.
3. When the drone enters the custom live broadcast function, enter the address, usually rtmp://192.168.xx:1935/live or rtmp://10.0.xx:1935/live.
4. Open VLC, select to open the network stream in the media in the upper left corner, enter the same ip address as in 3 in the network URL, and click to play.
Please add a picture description
5. If the drone screen is displayed, it is successful, and the delay is generally within 3~10s. (I succeeded, hahahahaha!)
Note: If the drone cannot transmit video, then turn off the firewall of the Windows system and try again.

5. Python obtains real-time video of UAV

import cv2
import time

if __name__ == '__main__':
    # 无人机rtmp视频流url
    video_path = "rtmp://192.168.x.x:1935/live"

    # opencv获取视频流
    capture = cv2.VideoCapture(video_path)

    while True:
        fps = 0.0

        t1 = time.time()
        # 读取某一帧
        ref, frame = capture.read()
        fps = (fps + (1. / (time.time() - t1))) / 2
        print("fps= %.2f" % (fps))
        frame = cv2.putText(frame, "fps= %.2f" % (fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

        cv2.imshow("video", frame)

        c = cv2.waitKey(1) & 0xff
        if c == 27:
            capture.release()
            break
    print("Video Detection Done!")
    capture.release()
    cv2.destroyAllWindows()

Guess you like

Origin blog.csdn.net/RSssr/article/details/129654853