Ожидание между сценариями FFMPEG при создании файлов .hdr / .chk и .mpd на сервере NGINX с использованием модуля RTMP - PullRequest
0 голосов
/ 17 апреля 2020

Интересно, кто-нибудь может предложить решение и проблему, которая у меня есть.

Я запускаю несколько сценариев FFMPEG внутри блока RTMP-сервера на сервере NGINX, работающем в Ubuntu 18.04.

В основном я принимаю поток RTMP на сервер, затем использую FFMPEG для демультиплексирования в отдельные файлы заголовков аудио и видео и файлы чанков, затем в отдельных сценариях я создаю два отдельных манифеста как для аудио, так и для видео.

У моего проигрывателя (разработка ambisoni c, видеоплеер 360) возникают проблемы с правильным чтением потока, и я считаю, что это связано с процессом FFMPEG для манифестов, которые не ждут 2 секунды перед запуском.

Есть ли способ запрограммировать ожидание между скриптами, чтобы облегчить это?

Более того, есть ли способ заставить скрипты манифеста запускаться только один раз, а затем завершаться?

вот мой текущий NGINX .conf

user root;
#user www-data;
worker_processes 1;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
    worker_connections 768;
    # multi_accept on;
}
http {
    ##
    # Basic Settings
    ##
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;
    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    ##
    # SSL Settings
    ##
    #ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    #ssl_prefer_server_ciphers on;
    ##
    # Logging Settings
    ##
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    ##
    # Gzip Settings
    ##
    ##
    # Virtual Host Configs
    ##
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
rtmp {
        server {
            listen 1935;
            chunk_size 4096;

            application live {
            live on;
            record off;
            interleave off;
            wait_key on;
            meta on;
            wait_video off;
            idle_streams off;
            sync 300ms;
            session_relay on;
            #allow publish 127.0.0.1;
            #allow publish 192.168.2.0/24;
            allow publish all;
            #deny publish all;
            allow play all;    
        #RX stream to FFMPEG, demux audio and video, write .hdr files, start chunking DASH segments .chk
         exec_push sudo ffmpeg -y -re -i 'rtmp://localhost:1935/live/stream' -map 0:1 -pix_fmt yuv420p -maxrate 750k -bufsize 3000k -c:v libvpx-vp9 -s 1920x1080 -keyint_min 60 -g 60 -speed 6 -tile-columns 4 -frame-parallel 1 -threads 8 -static-thresh 0 -max-intra-rate 300 -deadline realtime -lag-in-frames 0 -error-resilient 1 -b:v 6000k -f webm_chunk -header "/var/www/html/dash/video_360.hdr" -chunk_start_index 1 "/var/www/html/dash/video_360_%d.chk" -map 0:2 -c:a libopus -mapping_family 255 -b:a 1024k -vn -f webm_chunk -audio_chunk_duration 2000 -header "/var/www/html/dash/audio_171.hdr" -chunk_start_index 1 "/var/www/html/dash/audio_171_%d.chk" 2>>/var/log/nginx/ffmpegChunk.log;

        #Create video manifest
        exec_push sudo ffmpeg -probesize 500M -analyzeduration 100M -f webm_dash_manifest -live 1 -i "/var/www/html/dash/video_360.hdr" -map 0 -c copy -f webm_dash_manifest -live 1 -adaptation_sets "id=0,streams=0" -chunk_start_index 1 -chunk_duration_ms 2000 -minimum_update_period 7200 "/var/www/html/dash/video.mpd" 2>>/var/log/nginx/ffmpegManifestVideo.log;
        #Create audio manifest
        exec_push sudo ffmpeg -probesize 500M -analyzeduration 100M -f webm_dash_manifest -live 1 -i "/var/www/html/dash/audio_171.hdr" -map 0 -c libopus -mapping_family 255 -f webm_dash_manifest -live 1 -adaptation_sets "id=1,streams=0" -chunk_start_index 1 -chunk_duration_ms 2000 -minimum_update_period 7200 "/var/www/html/dash/audio_16ch.mpd" 2>>/var/log/nginx/ffmpegManifestAudio.log;

        ##
        # Record the incoming stream
        ##
        # Record audio and video together
        record all;
        record_path /home/mathewknight/Desktop/StreamRecord/Master;
        record_notify on;
        # Record audio seperately
        recorder audio {
            record audio;
            record_path /home/mathewknight/Desktop/StreamRecord/Audio;
            record_suffix -%d-%b-%y-%T.audio.flv;
            record_notify on;
            }
        # Record video seperately
        recorder video{
            record video;
            record_path /home/mathewknight/Desktop/StreamRecord/Video;
            record_suffix -%d-%b-%y-%T.video.flv;
            record_notify on;
            }

            }


        }

}

...