Nginx ffmpeg在一段时间后停止捕获整个小时的HTTP流

Nginx ffmpeg在一段时间后停止捕获整个小时的HTTP流,nginx,ffmpeg,http-live-streaming,Nginx,Ffmpeg,Http Live Streaming,首先,如果我使用了错误的术语,很抱歉。我一直在玩nginx,但我仍然对RTMP和HLS以及其他首字母缩略词感到困惑 我已经成功地将OBS设置为流式传输到nginx服务器,该服务器接收RTMP流并将其切碎以供HLS使用。以下是nginx配置文件的相关部分 rtmp { server { listen 1935; chunk_size 4000; ping 30s; deny play all; applica

首先,如果我使用了错误的术语,很抱歉。我一直在玩nginx,但我仍然对RTMP和HLS以及其他首字母缩略词感到困惑

我已经成功地将OBS设置为流式传输到nginx服务器,该服务器接收RTMP流并将其切碎以供HLS使用。以下是nginx配置文件的相关部分

rtmp {
    server {
        listen 1935;
        chunk_size 4000;
        ping 30s;
        deny play all;

        application live {
            live on;
            hls on;
            hls_nested on; # Create a new folder for each stream
            hls_path /mnt/hls/live;
            hls_fragment 3s;
            hls_fragment_naming timestamp;
            hls_playlist_length 60s;
        }
    }
}

http {
    server {
        listen 81 ssl;

        #creates the http-location for our full-resolution (desktop) HLS stream - "http://localhost:8080/live/test/index.m3u8"
        location /live {
            # Elided caching and CORS for brevity

            alias /mnt/hls/live;
            add_header Cache-Control no-cache;
            index index.m3u8;
        }
    }
}
这工作得很好,我可以在VLC或网站上查看流,它看起来很平滑。现在我想添加一些日志记录:我想在名为
log_yyymmdd_hh.mp4
的文件中写入完整的小时数(从xx:00:00开始,到xx:59:59结束),例如2020年7月7日18:00-19:00的文件的
log_20200707_18.mp4
。因此,我使用以下ffmpeg命令设置了一个每小时一次的cron作业:

ffmpeg -i https://stream.example.com:81/live/<streamkey> -preset veryfast -maxrate 2000k \
    -bufsize 2000k -g 60 -t 3600 -y /var/video/log/$(date +\%Y\%m\%d_\%H00).mp4 >/dev/null 2>&1
ffmpeg-ihttps://stream.example.com:81/live/ -预设极速-最大速率2000k\
-bufsize 2000k-g 60-t 3600-y/var/video/log/$(日期+\%y\%m\%d\%H00)。mp4>/dev/null 2>&1
起初,这似乎工作得很好,所以我让它快乐地运行了大约24小时。当我检查时,我的大部分小时文件都是大约10到15分钟长的小文件(约100MB)。流中的任何小延迟似乎都会导致
ffmpeg
停止写入文件。例如,我怀疑这种打嗝可能是由OBS插件引起的,我需要对此进行研究,但我更希望
ffmpeg
在放弃之前重试一段时间我应该向
ffmpeg
传递哪些参数,以便在流中断时不中断,比如说,每隔一秒钟?


当我查看HLS文件时,似乎没有任何明显的间隙,因此最终所有数据都到达了。我选择了
crontab
解决方案,使用
ffmpeg
,因为从nginx录制时,我不知道如何在整小时开始时开始录制。

在从某些网站捕获实时流时,我也遇到过这种情况。流中的一个小故障似乎会导致ffmpeg读取m3u8文件中列出的所有片段的速度比添加新片段的速度快。此时,ffmpeg必须认为流已经结束并结束。应该有一种方法告诉ffmpeg在停止之前等待一段时间,等待新片段出现。据我所知,最接近解决方法的是“-re”,但它是用于输出而不是输入的,它基于主机的时钟,可能会导致段被完全删除。我在从某些网站捕获实时流时也遇到过这种情况。流中的一个小故障似乎会导致ffmpeg读取m3u8文件中列出的所有片段的速度比添加新片段的速度快。此时,ffmpeg必须认为流已经结束并结束。应该有一种方法告诉ffmpeg在停止之前等待一段时间,等待新片段出现。据我所知,最接近解决方法的是“-re”,但它是用于输出而不是输入的,它基于主机的时钟,可能导致段被完全删除。