فيديو من كاميرا المراقبة على الموقع مجانا وبدون SMS

كانت هناك حاجة لعرض الفيديو من الكاميرا على الموقع عبر الإنترنت. رأيت عدة خيارات (سأكمل الخيارات من التعليقات ، إن وجدت):

  • امنح صلاحية الوصول إلى الكاميرا. مجرد منح الوصول إلى الكاميرا لا يستحق ذلك لأسباب أمنية. ستستلقي الكاميرا بالفعل عند حمولة صغيرة جدًا.
  • خدمة تجارية. نحن نمنحهم حق الوصول إلى الكاميرا والمال ، فهم يعطوننا رابطًا للنشر على الموقع. يحل مشكلة توافق الكاميرا ومتصفح المستخدم وأداء القناة وتوافرها
  • في مرافقهم. بين المستخدم والكاميرا ، يتم وضع شيء مسؤول عن توافق المتصفح والأداء وإمكانية الوصول. نحن نحل المشاكل بأنفسنا.

سننظر في هذا الخيار أدناه. لأن " الفلاش مات " أو " الفلاش على وشك الموت " ، لم يتم النظر في خيار وضع مشغل الفلاش على الموقع. لم يؤد المسار الشائك لإيجاد الحلول على الإنترنت إلى حل جاهز. كان عليّ اختراع دراجة.

المزيد من الاختراعات تحت القط.

وصف الدراجة الناتجة بمزيد من التفصيل:


  • دارات كاميرا CCTV عبر بروتوكول rtsp .
  • يأخذ ffmpeg دفق فيديو من الكاميرا وينشئ فيديو للعرض من خلال علامة الفيديو لمعيار html5 .
  • يوفر nginx الملفات التي تم إنشاؤها للمستخدمين
  • عرض الفيديو على الصفحة باستخدام hls ، بشكل أدق ، هذا التنفيذ

المزيد عن الإعدادات


في كل دفق من الكاميرا ، تحتاج إلى تشغيل ffmpeg لتحويل rtsp إلى ملفات يفهمها hls .

ffmpeg ودفق مع الصوت


/usr/bin/ffmpeg \
  -i  rtsp://<     ONVIF Device Manager>  \
  -ar 44100 \
  -acodec aac -ac 1 -strict -2 -crf 18 \
  -c:v copy -preset ultrafast \
  -flags -global_header \
  -fflags flush_packets -tune zerolatency \
-hls_time 1 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments -start_number 0 \
  /tmp/www/index1.m3u8
يكتب ffmpeg عند بدء التشغيل 25 إطارًا في الثانية عند FullHD
Guessed Channel Layout for  Input Stream #0.1 : mono
Input #0, rtsp, from 'rtsp://192.168.X.X:554/user=admin_password=tlJwpbo6_channel=1_stream=0.sdp?':
  Metadata:
    title           : RTSP Session
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: h264 (Baseline), yuv420p, 1920x1080, 25 fps, 9 tbr, 90k tbn, 50 tbc
    Stream #0:1: Audio: pcm_alaw, 8000 Hz, 1 channels, s16, 64 kb/s
Output #0, hls, to '/tmp/www/index1.m3u8':
  Metadata:
    title           : RTSP Session
    encoder         : Lavf56.25.101
    Stream #0:0: Video: h264, yuv420p, 1920x1080, q=2-31, 25 fps, 9 tbr, 90k tbn, 25 tbc
    Stream #0:1: Audio: aac, 44100 Hz, mono, fltp, 128 kb/s
    Metadata:
      encoder         : Lavc56.26.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (pcm_alaw (native) -> aac (native))
, .
noname.

كيف يعمل:


نأخذ دفقًا ، دون تحويل الشفرة ، وننشئ ملفات وقائمة للتشغيل في المجلد / tmp / www / .

nginx


نحن نختصر الملف الافتراضي لحزمة دبيان على سبيل المثال:

/ etc / nginx / sites -abled / default
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        access_log off;
        error_log /dev/null;
        root /tmp/www;
        index index.html;
        server_name _;
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
}

صفحة مثال مع فيديو:

/tmp/www/index.html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/hls.js/latest/hls.min.js"></script>
<video id="video"></video>
<script>
  if(Hls.isSupported()) {
    var video = document.getElementById('video');
    var hls = new Hls();
    hls.loadSource('/index1.m3u8');
    hls.attachMedia(video);
    hls.on(Hls.Events.MANIFEST_PARSED,function() {
      video.play();
  });
 }
</script>

يجب وضع البرنامج النصي محليًا ، ولا يحتوي على تبعيات خارجية. تعرف على المزيد حول إعدادات HLS .

كيف يعمل:


متصل hls على الصفحة ويقوم بتشغيل الملفات من index1.m3u8 القائمة. يتم تحديث القائمة والملفات من قبل ffmpeg.

ماذا حدث:


  • يعمل ؛
  • الحمل الأكبر هو ffmpeg ، على معالج Atom منذ ثلاث سنوات ؛
    • دقة الكاميرا Full HD بدون صوت - 1 ٪ ؛
    • دقة كاميرا Full HD بصوت - 5 ٪ ؛

  • عدد عمليات nginx - المشاهدة حسب التحميل والقناة المتاحة. لم نتمكن من رؤية الحمل على المعالج - ليس هناك حاجة كبيرة لتحميل الملفات الصغيرة.
  • يمكن وضع خادم مع ffmpeg و nginx في أي مكان ، وليس بالضرورة على استضافة أو في موقع الكاميرات ؛
  • يعتمد التأخير من الدفق على عدد الملفات في القائمة وحجم الملف (بالثواني). على سبيل المثال ، لا يؤثر التأخير لمدة 10 ثوانٍ على عرض عملية بناء مبنى شاهق ؛
  • يتم وضع ملفات الفيديو بشكل أفضل على ملفات tmpfs ، وهي صغيرة وغالباً ما يتم استبدالها ؛
  • يجب وضع جميع الخدمات في حاوية. جميع الحزم هي معيار ل FROM debian:jessie؛
  • نتيجة للعملية ، يتعطل ffmpeg في بعض الأحيان ، تحتاج إلى مراقبته وإعادة تشغيله في حالة تعطله.

    أعلى الإخراج من الحاوية:
    top - 11:05:20 up 6 days, 12:15,  0 users,  load average: 1.29, 1.09, 1.03
    Tasks:  17 total,   1 running,  16 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 38.8 us,  1.0 sy,  0.0 ni, 59.6 id,  0.0 wa,  0.0 hi,  0.5 si,  0.0 st
    KiB Mem:  16359132 total, 16027988 used,   331144 free,   782968 buffers
    KiB Swap:  6369276 total,     3776 used,  6365500 free. 12784916 cached Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
      281 root      20   0  341040  29192  19632 S   4.7  0.2  10:08.39 ffmpeg
       16 root      20   0  315888  27944  18984 S   1.0  0.2   2:50.95 ffmpeg
        9 root      20   0   46916  15128   6408 S   0.3  0.1   0:58.04 supervisord
  • يمكنك مشاهدته على أجهزة سطح المكتب والأجهزة المحمولة مع المتصفحات الحديثة ؛
  • في المستقبل المنظور لن يتطلب التدخل.

المراجع:


» تنفيذ hls
» عرض hls
» ffmpeg
» nginx
» النص الموسع والموسع للمقالة على مدونتي

Source: https://habr.com/ru/post/ar401107/


All Articles