Как поднять RTMP поток и его запись после недоступности RTSP-источника более 5 минут?

1,510 views
Skip to first unread message

Вячеслав Поспелов

unread,
Aug 15, 2016, 10:06:51 AM8/15/16
to nginx-rtmp-ru
Здравствуйте.
Я установил nginx плюс nginx-rtmp-module вот так, добавил функцию записи RTMP потока в файлы «*.flv» размером 50 Мб. Записывается в папку «/mnt» в виде «stream-2016-08-11--16-56-44.flv». Когда RTSP-источник становится недоступен в течении , например, 10-20 секунд - поток возобновляется и запись начинается в новый файл.

Проблема состоит в том, что если RTSP-источник становится недоступен в течении, например, 5 минут и дольше, запись не возобновляется автоматически, нужно только, например, перезапустить nginx командой «service nginx restart».

Что нужно сделать, чтобы после потери-восстановлении связи с RTSP-источником запись возобновилась автоматически?

Вот содержимое моего «/etc/nginx/nginx.conf»:

user orangepi;
worker_processes
1;
 
error_log
/var/log/nginx/error.log warn;
pid
/var/run/nginx.pid;
 
events
{
  worker_connections
1024;
}
 
http
{
  include
/etc/nginx/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
/var/log/nginx/access.log main;
  sendfile on
;
 
#tcp_nopush on;
  keepalive_timeout
65;
 
#gzip on;
 
  server
{
    listen
80;
   
# rtmp stat
    location
/stat {
     rtmp_stat all
;
     rtmp_stat_stylesheet stat
.xsl;
   
}
 
    location
/stat.xsl {
     
# you can move stat.xsl to a different location
     root
/etc/nginx/;
   
}
 
    location
/ {
     rtmp_control all
;
   
}
 
    error_page
500 502 503 504 /50x.html;
    location
= /50x.html {
    root html;
  }

  location /
image/cam1/ {
    proxy_pass
"http://video-service.in.ua/wp-content/uploads/2014/08/b1072-k_.jpg";
 
}
 
}
 include
/etc/nginx/conf.d/*.conf;
}

 
rtmp {
    server {
        listen 1935;
        ping 30s;
        notify_method get;

application cam1 {
        live on;
recorder cam01 {
record all;
record_path /mnt;
record_suffix -%Y-%m-%d--%H-%M-%S.flv;
record_max_size 51200K;
exec_record_done flvmeta -U -f $path;
}
exec_static /usr/local/bin/ffmpeg -rtsp_transport tcp -i rtsp://admin:123...@192.168.0.125:1005/mpeg4 -c copy -an -f flv rtmp://localhost:1935/cam1/stream;
    }
  }
}


tos

unread,
Aug 16, 2016, 3:06:20 AM8/16/16
to nginx-rtmp-ru
Отделите мух от котлет - nginx-rtmp пусть стримит, а push на него делайте отдельным скриптом, который поднимайте через monit/runit/systemd по вкусу.
Это позволит Вам контролировать каждую часть процесса отдельно (с одной камерой можно и nginx передёрнуть, а если этих потоков 300?).

понедельник, 15 августа 2016 г., 17:06:51 UTC+3 пользователь Вячеслав Поспелов написал:
Message has been deleted
Message has been deleted

Вячеслав Поспелов

unread,
Aug 16, 2016, 3:41:56 AM8/16/16
to nginx-rtmp-ru
У меня там потоков будет максимум 10, а от nginx-rtmp мне нужна только запись. Pull предпочтительнее чем push, в моей задаче не хочу использовать push вообще. Если писать отдельный скрипт можно тогда и без nginx-rtmp обойтись, так как мне всего лишь нужна регулярная запись RTSP-потока. nginx-rtmp умеет подымать пропадавший RTSP-поток, но только если он пропадал не более 1 минуты (примерно). Суть вопроса в том как изменить этот таймаут в 1 минуту на бесконечность?

вторник, 16 августа 2016 г., 10:06:20 UTC+3 пользователь tos написал:

tos

unread,
Aug 16, 2016, 4:14:15 AM8/16/16
to nginx-rtmp-ru
Проследите за процессом ffmpeg в момент зависания push. Скорее всего виновник - ffmpeg (он не всегда хочет умирвать по обычному TERM сигналу, иногда надо его убивать по сигналу KILL), в таком случае поможет просто
kill -9 <зависший процесс FFMPEG>.
Кстати, у Вас в строке запуска ffmpeg не совсем верно указаны параметры.
-codec copy - говорит о том, что все кодеки (аудио, видео, субтитры и т. п.) надо копировать. Вместо этого лучше укажите точно
-vcodec copy -an
Далее - уберите вывод от ffmpeg (-v 0), всё равно его никто не смотрит.
Можно ещё сделать ffmpeg ещё более молчаливым (-nostats -hide_banner).
Ну и скажите самому ffmpeg  падать через определённый промежуток времени по таймауту, подберите экспериментально (http://ffmpeg.org/ffmpeg-all.html#toc-rtsp).
Результирующая строка запуска получится что-то типа такого
ffmpeg -v 0 -nostats -hide_banner -timeout 5 -i <RTSP source> -vcodec copy -an -f flv <RTMP destination>.

И потом, если Вам не нужен nginx для стриминга - то не лучше ли вести запись напрямую при помощи ffmpeg?
Он это делает вполне неплохо:
ffmpeg -v 0 -timeout 5 -i <RTSP source> -vcodec copy -an -f flv /path/where/store/archive/cam1-`date "date "+%Y-%m-%d--%H-%M-%S"`.flv

По опыту - push работает намного стабильнее, чем pull. Это касается всех медиасерверов, с которыми я работал (nginx-rtmp, wowza, nimblestreamer).
Причём в лабораторных условиях всё достаточно гладко, а в реальном мире, особенно на большом количестве потоков всё намного грустнее.


вторник, 16 августа 2016 г., 10:41:56 UTC+3 пользователь Вячеслав Поспелов написал:

tos

unread,
Aug 16, 2016, 4:16:08 AM8/16/16
to nginx-rtmp-ru
опечатка, для архива надо так
ffmpeg -v 0 -timeout 5 -i <RTSP source> -vcodec copy -an -f flv /path/where/store/archive/cam1-`date "+%Y-%m-%d--%H-%M-%S"`.flv

вторник, 16 августа 2016 г., 11:14:15 UTC+3 пользователь tos написал:

Вячеслав Поспелов

unread,
Aug 16, 2016, 10:12:11 AM8/16/16
to nginx-rtmp-ru
Исправил строку с ffmpeg, как было написано - результата не дало, как я понял это просто оптимизация ffmpeg. По поводу " -timeout" - тоже не помогло, не падает от по таймауту, если обрыв был около 2-5 минут или более. Если 2 раза послать команду "killall ffmpeg", то процесс записи возобновляется. Решил попробовать сделать скрипт, нормальный ли это выход из ситуации? Вот код:

#!/bin/bash

ip_address1
=192.168.0.125
counts
=0 # делать рестарт после указанного числа проверок, 0=всегда

while [ 1 ]; do # объявляем бесконечный цикл

 
if ping -q -c 1 -n $ip_address1 # проверяем пингуется ли камера
 
then

 
while ping -q -c 1 -n $ip_address1 # если пингуется, - ждем пока перестанет пинговаться
   
do
   echo
'online'
   sleep
1
   
done

 
fi

  echo
'offline'
  count
=1

 
while ! ping -q -c 1 -n $ip_address1 # ждем когда появится пинг от камеры
   
do
   echo
'offline'
   count
=$(( $count + 1 ))
   
done

 
if [ "$count" -gt "$counts" ]
 
then
   service nginx stop
# когда появился пинг от камеры - перезагружаем nginx, убиваем ffmpeg
   killall
-INT ffmpeg
   killall ffmpeg
   service nginx start
 
fi

done

exit 0



вторник, 16 августа 2016 г., 11:16:08 UTC+3 пользователь tos написал:

tos

unread,
Aug 16, 2016, 3:53:48 PM8/16/16
to nginx-rtmp-ru
Замените
kill -INT ffmpeg
на
kill -KILL ffmpeg (или kill -9 ffmpeg, что одно и тоже), тогда не придётся делать это 2-жды.
И не трогайте nginx, он не виноват. Nginx рестартует процесс, вызванный через exec только в случае его падения. Никаких других проверок нет.
Потому лучше это делать отдельными инструментами.
Кстати, насколько я понял из Вашего скрипта, во время проблем с трансляцией камера даже не пингуется, так?
Если камера не пингуется (нет потока по RTSP) то ffmpeg должен вывалиться по таймауту.
Запустите это в терминале, чтобы проверить поведение.
ffmpeg -timeout 5 -i <RTSP source> -vcodec copy -an -f flv <RTMP destination>

вторник, 16 августа 2016 г., 17:12:11 UTC+3 пользователь Вячеслав Поспелов написал:

Вячеслав Поспелов

unread,
Aug 17, 2016, 7:17:06 AM8/17/16
to nginx-rtmp-ru
Добрый день.
Заменил "killall -INT ffmpeg" на "kill -KILL ffmpeg". Проверю - отпишусь. Может быть надо было так: "killall -KILL ffmpeg"?

Кстати, насколько я понял из Вашего скрипта, во время проблем с трансляцией камера даже не пингуется, так?
 - Нет, дело не в этом. Скрипт направлен на то, чтобы отследить потерю-восстановление связи с камерой (например ее отключили с розетки, а потом включили через время, или отключили Ethernet-кабель, а потом подключили обратно), и после восстановления связи он должен сделать все, чтобы запись с камеры продолжилась.

Запустите это в терминале, чтобы проверить поведение.
Запустил, только не в терминале, а добавил вывод ffmpeg в log-файл.

Значит, если в "/etc/nginx/nginx.conf" строка такая:
exec_static /usr/local/bin/ffmpeg -timeout 5 -i rtsp://admin:123...@192.168.0.126:1006/mpeg4 -vcodec copy -an -f flv rtmp://localhost:1935/cam1/stream 2>>/mnt/cam1.log;

То запись не идет, вот содержимое  log-файла:
 
ffmpeg version 3.1.1 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.8.3 (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11) 20140106 (prerelease)
  configuration: --enable-cross-compile --cross-prefix=/home/pi/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- --arch=armhf --target-os=$
  libavutil      55. 28.100 / 55. 28.100
  libavcodec     57. 48.101 / 57. 48.101
  libavformat    57. 41.100 / 57. 41.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 47.100 /  6. 47.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
[rtsp @ 0x1835260] Unable to open RTSP for listening
rtsp://admin:123...@192.168.0.126:1006/mpeg4: Cannot assign requested address


Но, если в "/etc/nginx/nginx.conf" в этой строке убрать "-timeout 5":

exec_static /usr/local/bin/ffmpeg -i rtsp://admin:123...@192.168.0.126:1006/mpeg4 -vcodec copy -an -f flv rtmp://localhost:1935/cam1/stream 2>>/mnt/cam1.log;

То запись идет, вот содержимое  log-файла:

ffmpeg version 3.1.1 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.8.3 (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11) 20140106 (prerelease)
  configuration: --enable-cross-compile --cross-prefix=/home/pi/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- --arch=armhf --target-os=linux --prefix=/home/pi/ffmpeg/build --enable-gpl --enable-libx264 --enable-libx265 --enable-libmp3lame --enable-libfdk-aac --enable-nonfree --extra-cflags=-I/home/pi/ffmpeg/build/include --extra-ldflags=-L/home/pi/ffmpeg/build/lib --extra-libs=-ldl --pkg-config-flags=--static
  libavutil      55. 28.100 / 55. 28.100
  libavcodec     57. 48.101 / 57. 48.101
  libavformat    57. 41.100 / 57. 41.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 47.100 /  6. 47.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
[rtsp @ 0x1835210] max delay reached. need to consume packet
[rtsp @ 0x1835210] RTP: missed 15 packets
[h264 @ 0x1838110] left block unavailable for requested intra mode
[h264 @ 0x1838110] error while decoding MB 0 11, bytestream 51023
[h264 @ 0x1838110] concealing 2769 DC, 2769 AC, 2769 MV errors in I frame
[rtsp @ 0x1835210] max delay reached. need to consume packet
[rtsp @ 0x1835210] RTP: missed 4 packets
Input #0, rtsp, from 'rtsp://admin:123...@192.168.0.126:1006/mpeg4':
  Metadata:
    title           : RTSP/RTP stream from Network Video Server
    comment         : mpeg4
  Duration: N/A, start: 0.080000, bitrate: N/A
    Stream #0:0: Video: h264 (Main), yuv420p, 1280x720, 25 tbr, 90k tbn, 180k tbc
[tcp @ 0x1838840] Connection to tcp://localhost:1935 failed (Connection refused), trying next address
[flv @ 0x1897280] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
Output #0, flv, to 'rtmp://localhost:1935/cam1/stream':
  Metadata:
    title           : RTSP/RTP stream from Network Video Server
    comment         : mpeg4
    encoder         : Lavf57.41.100
    Stream #0:0: Video: h264 ([7][0][0][0] / 0x0007), yuv420p, 1280x720, q=2-31, 25 tbr, 1k tbn, 90k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[rtsp @ 0x1835210] max delay reached. need to consume packet
[rtsp @ 0x1835210] RTP: missed 3 packets
frame=   43 fps=0.0 q=-1.0 size=     620kB time=00:00:02.20 bitrate=2309.4kbits/s speed=4.23x    
...




 

вторник, 16 августа 2016 г., 22:53:48 UTC+3 пользователь tos написал:

tos

unread,
Aug 17, 2016, 8:18:10 AM8/17/16
to nginx-rtmp-ru


среда, 17 августа 2016 г., 14:17:06 UTC+3 пользователь Вячеслав Поспелов написал:
Добрый день.
Заменил "killall -INT ffmpeg" на "kill -KILL ffmpeg". Проверю - отпишусь. Может быть надо было так: "killall -KILL ffmpeg"?

Да, опечатка, если Вам не надо убивать все процессы (killall), то надо написать
kill -9 <FFMPEG PID>
Кстати, насколько я понял из Вашего скрипта, во время проблем с трансляцией камера даже не пингуется, так?
 - Нет, дело не в этом. Скрипт направлен на то, чтобы отследить потерю-восстановление связи с камерой (например ее отключили с розетки, а потом включили через время, или отключили Ethernet-кабель, а потом подключили обратно), и после восстановления связи он должен сделать все, чтобы запись с камеры продолжилась.

В принципе это лишнее, при отсутствии потока  ffmpeg должен сам отвалиться, и задача контролирующего скрипта/демона - вовремя поднять его.

Запустите это в терминале, чтобы проверить поведение.
Запустил, только не в терминале, а добавил вывод ffmpeg в log-файл.

Значит, если в "/etc/nginx/nginx.conf" строка такая:
exec_static /usr/local/bin/ffmpeg -timeout 5 -i rtsp://admin:123...@192.168.0.126:1006/mpeg4 -vcodec copy -an -f flv rtmp://localhost:1935/cam1/stream 2>>/mnt/cam1.log;

То запись не идет, вот содержимое  log-файла:

Но, если в "/etc/nginx/nginx.conf" в этой строке убрать "-timeout 5":

exec_static /usr/local/bin/ffmpeg -i rtsp://admin:123...@192.168.0.126:1006/mpeg4 -vcodec copy -an -f flv rtmp://localhost:1935/cam1/stream 2>>/mnt/cam1.log;

То запись идет, вот содержимое  log-файла:
запуск в терминале позволит Вам подобрать нужные параметры, в первую очередь timeout, я об этом писал, скорее всего таймаут в Вашем случае надо увеличить, а запуская ffmpeg не напрямую,
Вы не видите его поведение онлайн, в первую очередь - упал он или нет.
Не занимайтесь бездумным копипастом, почитайте документацию.

кстати, раз уж Вы всё равно используете raspberry - если прицепить к ней камеру по интерфейсу CSI, её саму можно использовать как камеру, с записью, причём в неплохом качестве.

Вячеслав Поспелов

unread,
Aug 17, 2016, 8:48:27 AM8/17/16
to nginx-rtmp-ru
почитайте документацию
Читал, в том то и дело что не про ffmpeg а про nginx-rtmp. Я в nginx-rtmp и в ffmpeg новичок, можно еще 2 вопроса?

1. Есть ли в nginx-rtmp опция для удаления самого старого файла из указанной папки, когда свободное место на диске, на котором лежит эта папка менее, например, 1 Гб? Потому что когда место на диске закончилось, он создает новые файлы по 0 байт а старые не затирает. Там есть опция "record_max_size 51200K;", но она просто делает файлы по 50 Мб, - не то что нужно.

2. nginx-rtmp не записывает файлы на съемный диск с файловой системой FAT32 (/mnt/disc), как сделать так чтобы он писал на этот диск? 
К примеру Midnight Commander при копировании *.flv файлов из "/mnt" в "/mnt/disc" выдает ошибку "Cannot chown target file "/mnt/disc/strea~--15-33-46.flv"
Operation not permitted (1)", но там есть кнопка "Skip all", после ее нажатия копируются все файлы.

среда, 17 августа 2016 г., 15:18:10 UTC+3 пользователь tos написал:

tos

unread,
Aug 17, 2016, 9:18:17 AM8/17/16
to nginx-rtmp-ru


среда, 17 августа 2016 г., 15:48:27 UTC+3 пользователь Вячеслав Поспелов написал:
почитайте документацию
Читал, в том то и дело что не про ffmpeg а про nginx-rtmp. Я в nginx-rtmp и в ffmpeg новичок, можно еще 2 вопроса?
Вы бы озвучили Вашу задачу, а то запросто окажется, что Вы пытаетесь микроскопом гвозди забивать :(
 

1. Есть ли в nginx-rtmp опция для удаления самого старого файла из указанной папки, когда свободное место на диске, на котором лежит эта папка менее, например, 1 Гб? Потому что когда место на диске закончилось, он создает новые файлы по 0 байт а старые не затирает. Там есть опция "record_max_size 51200K;", но она просто делает файлы по 50 Мб, - не то что нужно.

nginx не контролирует уже записанные файлы, это не его задача. Используйте внешние инструменты, хотя бы find

2. nginx-rtmp не записывает файлы на съемный диск с файловой системой FAT32 (/mnt/disc), как сделать так чтобы он писал на этот диск? 
К примеру Midnight Commander при копировании *.flv файлов из "/mnt" в "/mnt/disc" выдает ошибку "Cannot chown target file "/mnt/disc/strea~--15-33-46.flv"
Operation not permitted (1)", но там есть кнопка "Skip all", после ее нажатия копируются все файлы.

покажите вывод команд
mount
ls -la /mnt

Вячеслав Поспелов

unread,
Aug 17, 2016, 10:22:26 AM8/17/16
to nginx-rtmp-ru
Вы бы озвучили Вашу задачу, а то запросто окажется, что Вы пытаетесь микроскопом гвозди забивать :(
Мне нужно организовать запись RTSP-стримов с 5-ти IP-камер в файлы *.flv на Винт, который в кармане, который подключен через USB к микрокомпьютеру, который в одной локалке с этими камерами. вот...

Используйте внешние инструменты, хотя бы find 
вы имеете в виду внешний скрипт в котором используется find?

покажите вывод команд mount, ls -la /mnt 

mount
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
none on /dev type devtmpfs (rw,relatime,size=380812k,nr_inodes=95203,mode=755)
/dev/mmcblk0p2 on / type ext4 (rw,noatime,nodiratime,errors=remount-ro,data=ordered)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
/dev/sda1 on /mnt/disc type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=ascii,shortname=mixed,quiet,errors=continue)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,relatime)
/dev/mmcblk0p1 on /media/boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=ascii,shortname=mixed,errors=continue)
rpc_pipefs on /run/rpc_pipefs type rpc_pipefs (rw,relatime)
nfsd on /proc/fs/nfsd type nfsd (rw,relatime)
tmpfs on /run/user/107 type tmpfs (rw,nosuid,nodev,relatime,size=102716k,mode=700,uid=107,gid=113)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=102716k,mode=700,uid=1000,gid=1000)

 ls -la /mnt
total 88
drwxrwxrwx  4 root     root     12288 Aug 17 17:02 .
drwxr-xr-x 21 root     root      4096 Aug  4 16:22 ..
-rw-r--r--  1 root     root      1702 Aug 17 16:35 11.sh
-rw-r--r--  1 orangepi orangepi     0 Aug 17 17:10 cam1.log
-rw-r--r--  1 root     root         0 Aug 17 17:10 cam2.log
-rw-r--r--  1 root     root         0 Aug 17 17:10 cam3.log
drwxr-xr-x  2 root     root     32768 Aug 17 17:11 disc
drwxrwxrwx  2 root     root     32768 Aug 17 16:34 mp4


 

среда, 17 августа 2016 г., 16:18:17 UTC+3 пользователь tos написал:

tos

unread,
Aug 17, 2016, 4:48:16 PM8/17/16
to nginx-rtmp-ru

среда, 17 августа 2016 г., 17:22:26 UTC+3 пользователь Вячеслав Поспелов написал:
Вы бы озвучили Вашу задачу, а то запросто окажется, что Вы пытаетесь микроскопом гвозди забивать :(
Мне нужно организовать запись RTSP-стримов с 5-ти IP-камер в файлы *.flv на Винт, который в кармане, который подключен через USB к микрокомпьютеру, который в одной локалке с этими камерами. вот...
в принципе оно у Вас уже всё и так на спичках, потому Ваш вариант не самый худший.
Можно было бы писать прямо при помощи ffmpeg, но это будет такое же примерно по надёжности решение, а так можно по крайней мере проверить, что стрим идёт.

Используйте внешние инструменты, хотя бы find 
вы имеете в виду внешний скрипт в котором используется find?

да, что-то типа
find /mnt/disk +mtime 7 -delete
только прежде чем копипастить - прочитайте всё же документацию, чтобы понимать, что значит каждый их ключей :(
 
покажите вывод команд mount, ls -la /mnt 


 ls -la /mnt
total 88
drwxr-xr-x  2 root     root     32768 Aug 17 17:11 disc

У Вас в этот каталог запись разрешена только руту.
Покажите Ваш /etc/fstab
 

Вячеслав Поспелов

unread,
Aug 18, 2016, 3:13:20 AM8/18/16
to nginx-rtmp-ru
Покажите Ваш /etc/fstab
Здравствуйте, вот мой /etc/fstab
/dev/mmcblk0p2  /  ext4  errors=remount-ro,noatime,nodiratime  0 1
/dev/mmcblk0p1  /media/boot  vfat  defaults  0 0
tmpfs /tmp  tmpfs nodev,nosuid,mode=1777  0 0
UUID=6DF7-F18F /mnt/disc vfat quiet 0 0



среда, 17 августа 2016 г., 23:48:16 UTC+3 пользователь tos написал:

tos

unread,
Aug 18, 2016, 11:41:03 AM8/18/16
to nginx-rtmp-ru
service nginx stop
killall -9 nginx
umount /mnt/disc
chmod a+rwX /mnt/desc
mount -a
service nginx start

PS. Вообще это азы...

четверг, 18 августа 2016 г., 10:13:20 UTC+3 пользователь Вячеслав Поспелов написал:

Вячеслав Поспелов

unread,
Aug 19, 2016, 3:26:59 AM8/19/16
to nginx-rtmp-ru
Здравствуйте. Спасибо большое за ответы!

PS. Вообще это азы...
может и так, я же говорю, что новичок в этих делах

четверг, 18 августа 2016 г., 18:41:03 UTC+3 пользователь tos написал:

Вячеслав Поспелов

unread,
Aug 19, 2016, 3:34:29 AM8/19/16
to nginx-rtmp-ru
После суток записи обнаружил записанные файлы разных размеров - от 0 байт до 220 мегабайт, хотя в настройках ставил запись по 1 часу на каждый файл, а это примерно 1,5 гигабайт на файл. Посмотрел загрузку процессора командой "top" и обнаружил там процесс kswapd0, который грузит процессор на 99,9-100%, в чем может быть проблема? Неужели это из-за nginx?

четверг, 18 августа 2016 г., 18:41:03 UTC+3 пользователь tos написал:

tos

unread,
Aug 20, 2016, 2:40:44 PM8/20/16
to nginx-rtmp-ru
А что подмонтировано для записи?
Похоже Вы ошиблись с выбором инструмента - Ваша "малинка" боюсь что не справится с записью потоков, в первую очередь из-за дисковой подсистемы.

пятница, 19 августа 2016 г., 10:34:29 UTC+3 пользователь Вячеслав Поспелов написал:

Вячеслав Поспелов

unread,
Aug 25, 2016, 9:29:40 AM8/25/16
to nginx-rtmp-ru
А что подмонтировано для записи?
Винт 80 Гб в кармане подключенный к Orange Pi PC, на котором и установлен nginx. Когда то устанавливал Nimble Streamer в надежде писать ним, но триал закончился и он видимо мешал работе компьютера. Сделал apt-get remove nimble и процесс kswapd0 перестал загружать на 100% процессор.

Но файлы все равно иногда попадаются "неполные", должны быть 225 Мб, а попадается по 138 Мб, другие тоже должны быть по 187 Мб, а попадаются тоже по 138 Мб, воспроизвести их тоже не получается до конца. Процессор при этом загружен на 30-40%, памяти вроде хватает.

В чем еще может быть проблема?

из-за дисковой подсистемы
что вы имеете в виду? что нужно изменить? 

суббота, 20 августа 2016 г., 21:40:44 UTC+3 пользователь tos написал:

tos

unread,
Aug 25, 2016, 3:01:00 PM8/25/16
to nginx-rtmp-ru


четверг, 25 августа 2016 г., 16:29:40 UTC+3 пользователь Вячеслав Поспелов написал:
А что подмонтировано для записи?
Винт 80 Гб в кармане подключенный к Orange Pi PC, на котором и установлен nginx. Когда то устанавливал Nimble Streamer в надежде писать ним, но триал закончился и он видимо мешал работе компьютера. Сделал apt-get remove nimble и процесс kswapd0 перестал загружать на 100% процессор.

Открою Вам секррет - nimblestreamer для работы не требует лицензии. Лицензия нужна только для панели управления им.
Другое дело, что nimblestreamer пишет архив мелкими чанками, что создаёт немалую нагрузку на диск даже на одном канале.
 
Но файлы все равно иногда попадаются "неполные", должны быть 225 Мб, а попадается по 138 Мб, другие тоже должны быть по 187 Мб, а попадаются тоже по 138 Мб, воспроизвести их тоже не получается до конца. Процессор при этом загружен на 30-40%, памяти вроде хватает.

В чем еще может быть проблема?

Запускайте ffmpeg в консоли и смотрите какие он ошибки пишет. Если у Вас источник нестабильный, то проблемы гарантированы, и Вам постоянно придётся с этим бороться. Лучше всё же писать архив сразу ffmpeg-ом и сразу чанками для HLS (тогда при падении ffmpeg-а будет потеряно всего несколько чанков). Примерно как это делает nimblestreamer.
Но Ваш диск (а 80Г говорит о том, что это какой-то древнючий PATA) не позволит нормально работать.

Вообще Вы бы попробовали Вашу задачу на  нормальном железе с нормальным диском, чтобы найти проблему.

Вячеслав Поспелов

unread,
Aug 26, 2016, 7:14:49 AM8/26/16
to nginx-rtmp-ru
nimblestreamer для работы не требует лицензии. Лицензия нужна только для панели управления им.
Я это и имел в виду. Не знаю как это связано, но когда закончился триал на WMSPanel начались проблемы, связанные с Nimble Streamer

Лучше всё же писать архив сразу ffmpeg-ом и сразу чанками для HLS
Можете немножко подробнее пояснить что вы имеете в виду? У нас есть требования к записываемым файлам, они должны быть в контейнерах mp4 или flv с видео кодеками h264, hevc или vp6. Можно ли при этом писать эти файлы "чанками для HLS"?

четверг, 25 августа 2016 г., 22:01:00 UTC+3 пользователь tos написал:
Reply all
Reply to author
Forward
0 new messages