Difference between revisions of "Streaming webcam"

From HoerupWiki
Jump to: navigation, search
(FFmpeg)
(FFserver)
 
(17 intermediate revisions by the same user not shown)
Line 8: Line 8:
 
ffserver kan håndtere flere streams, enten flere kamera eller samme kamera i fx. flere kvaliteter.
 
ffserver kan håndtere flere streams, enten flere kamera eller samme kamera i fx. flere kvaliteter.
  
==Opsæt==
+
'''Bemærk at alt herunder er overhovedet ikke testet i mere end et par minutter, det var et impuls test-opsæt'''
Lokalt : webcam + pc med ffmpeg, internetlinje med nok upload til en enkelt stream.
 
  
Server : ffserver, internetlinje stor nok til den indkommende stream + alle seere.
+
==Overblik==
 +
'''Lokalt''': webcam + pc med ffmpeg, internetlinje med nok upload til en enkelt stream. I teorien burde en raspberry Pi med usb cam kunne levere en 720p stream i 2mbps.
  
Web : Hjemmesiden skal simpelt bare embedde en flashplayer som bliver leveret af serveren.
+
'''Server''': ffserver, internetlinje stor nok til den indkommende stream + alle seere. Kræver ikke meget CPU, kun masser af båndbredde.
  
 +
'''Web''': Hjemmesiden skal simpelt bare embedde en flashplayer som bliver leveret af serveren. Den kan være på alm. webhotel, da ffserver laver alt arbejdet.
  
==FFserver==
+
===FFserver===
Vi starter lige med ffserver, her er min testconfig med en 800kb stream, 15 fps i 640x480, uden lyd.
+
Vi starter lige med ffserver, her er min testconfig med en 800kb stream, 25 fps i 640x480, uden lyd.
 
Bemærk at ACL skal tillade IP fra webcam-computeren.
 
Bemærk at ACL skal tillade IP fra webcam-computeren.
  
 +
'''/etc/ffserver.conf'''
 
  <Feed feed1.ffm>
 
  <Feed feed1.ffm>
 
   # ffmpeg http://localhost:8090/feed1.ffm
 
   # ffmpeg http://localhost:8090/feed1.ffm
Line 32: Line 34:
 
   Format swf
 
   Format swf
 
   VideoCodec flv
 
   VideoCodec flv
   VideoFrameRate 15
+
   VideoFrameRate 25
 
   VideoBufferSize 80000
 
   VideoBufferSize 80000
 
   VideoBitRate 800
 
   VideoBitRate 800
Line 42: Line 44:
 
  </Stream>
 
  </Stream>
  
==FFmpeg==
+
https://ffmpeg.org/ffserver.html
 +
 
 +
===FFmpeg===
 
I mit opsæt har jeg et netværkskamera (Axis overvågningskamera)
 
I mit opsæt har jeg et netværkskamera (Axis overvågningskamera)
  
 
Feed:
 
Feed:
  ffmpeg -ar 48000 -ac 2 -f s16le -i /dev/zero -i "rtsp://192.168.8.xx:554/mpeg4/media.amp" -r 15 http://localhost:8090/feed1.ffm
+
  ffmpeg -ar 48000 -ac 2 -f s16le -i /dev/zero -r 25 -i "rtsp://192.168.8.xx:554/mpeg4/media.amp" http://localhost:8090/feed1.ffm
  
 
Vigtigt at force frameraten på input her, ellers spammer den soruce, det er både usb-kamera og netværks kamera. '''-ar 48000 -ac 2 -f s16le -i /dev/zero''' laver et null-audio input, bemærk at mange mp4 og flv formater KRÆVER en lydkanal, også selvom der kun er stilhed.
 
Vigtigt at force frameraten på input her, ellers spammer den soruce, det er både usb-kamera og netværks kamera. '''-ar 48000 -ac 2 -f s16le -i /dev/zero''' laver et null-audio input, bemærk at mange mp4 og flv formater KRÆVER en lydkanal, også selvom der kun er stilhed.
  
 
Praktisk talt alt der kan inputtes i ffmpeg kan bruges til stream, se mere på http://ffmpeg.org/ - bemærk at det er ffserver der bestemmer komprimeringerne, så alle output options i ffmpeg er overflødige.
 
Praktisk talt alt der kan inputtes i ffmpeg kan bruges til stream, se mere på http://ffmpeg.org/ - bemærk at det er ffserver der bestemmer komprimeringerne, så alle output options i ffmpeg er overflødige.
 +
 +
'''Webcam Linux''': -f video4linux2 -i /dev/video0
 +
 +
'''Webcam Windows''': -f vfwcap -0
 +
 +
Men brug direct-show til windows
 +
https://trac.ffmpeg.org/wiki/Capture/Webcam
 +
 +
===Webpage===
 +
Den nemme måde at embedde et SWF objekt er :
 +
 +
<object width="640" height="480">
 +
    <param name="movie" value="http://SERVER_HOST:8090/test.swf">
 +
    <embed src="http://SERVER_HOST:8090/test.swf" width="640" height="480">
 +
    </embed>
 +
</object>
 +
 +
Men jeg ville kigge på https://code.google.com/p/swfobject/ for en smartere implementering med plugin-detection.
 +
 +
http://stackoverflow.com/questions/137326/how-to-embed-a-swf-file-in-a-html-page
 +
 +
==Diverse==
 +
===Overlay===
 +
Overlay må være noget i den her stil : Har testet, kan ikke få det til at virke lige nu.
 +
 +
ffmpeg -i input.mp4 -i image.png \
 +
-filter_complex "[0:v][1:v] overlay=25:25" \
 +
-pix_fmt yuv420p -c:a copy \
 +
output.mp4
 +
 +
'''overlay=25:25''' er positionen af overlay, husk at bruge png for transperens.
 +
 +
http://video.stackexchange.com/questions/12105/add-an-image-in-front-of-video-using-ffmpeg
 +
https://ffmpeg.org/ffmpeg-filters.html#overlay-1

Latest revision as of 19:24, 2 October 2015

Stream af webcam med ffmpeg+ffserver til webpage.

Introduktion

Opsættet er simpelt, man har et webcam på en lokation som skal streames til en hjemmeside hvor der potentionelt kan være rigtig mange ssere uden at det skal tvinge den lokale internetlinje i knæ, eller blotlægge den lokale IP adresse.

Derfor streamer man en enkelt stream lokalt op til en server, som så kan levere flere streams til de besøgende.

ffserver kan håndtere flere streams, enten flere kamera eller samme kamera i fx. flere kvaliteter.

Bemærk at alt herunder er overhovedet ikke testet i mere end et par minutter, det var et impuls test-opsæt

Overblik

Lokalt: webcam + pc med ffmpeg, internetlinje med nok upload til en enkelt stream. I teorien burde en raspberry Pi med usb cam kunne levere en 720p stream i 2mbps.

Server: ffserver, internetlinje stor nok til den indkommende stream + alle seere. Kræver ikke meget CPU, kun masser af båndbredde.

Web: Hjemmesiden skal simpelt bare embedde en flashplayer som bliver leveret af serveren. Den kan være på alm. webhotel, da ffserver laver alt arbejdet.

FFserver

Vi starter lige med ffserver, her er min testconfig med en 800kb stream, 25 fps i 640x480, uden lyd. Bemærk at ACL skal tillade IP fra webcam-computeren.

/etc/ffserver.conf

<Feed feed1.ffm>
  # ffmpeg http://localhost:8090/feed1.ffm
  File /tmp/feed1.ffm
  FileMaxSize 5M
  ACL allow 127.0.0.1
  ACL allow 192.168.8.0 192.168.255.255
</Feed>
<Stream test.swf>
  Feed feed1.ffm
  Format swf
  VideoCodec flv
  VideoFrameRate 25
  VideoBufferSize 80000
  VideoBitRate 800
  VideoQMin 1
  VideoQMax 5
  VideoSize 640x480
  PreRoll 0
  Noaudio
</Stream>

https://ffmpeg.org/ffserver.html

FFmpeg

I mit opsæt har jeg et netværkskamera (Axis overvågningskamera)

Feed:

ffmpeg -ar 48000 -ac 2 -f s16le -i /dev/zero -r 25 -i "rtsp://192.168.8.xx:554/mpeg4/media.amp" http://localhost:8090/feed1.ffm

Vigtigt at force frameraten på input her, ellers spammer den soruce, det er både usb-kamera og netværks kamera. -ar 48000 -ac 2 -f s16le -i /dev/zero laver et null-audio input, bemærk at mange mp4 og flv formater KRÆVER en lydkanal, også selvom der kun er stilhed.

Praktisk talt alt der kan inputtes i ffmpeg kan bruges til stream, se mere på http://ffmpeg.org/ - bemærk at det er ffserver der bestemmer komprimeringerne, så alle output options i ffmpeg er overflødige.

Webcam Linux: -f video4linux2 -i /dev/video0

Webcam Windows: -f vfwcap -0

Men brug direct-show til windows https://trac.ffmpeg.org/wiki/Capture/Webcam

Webpage

Den nemme måde at embedde et SWF objekt er :

<object width="640" height="480">
   <param name="movie" value="http://SERVER_HOST:8090/test.swf">
   <embed src="http://SERVER_HOST:8090/test.swf" width="640" height="480">
   </embed>
</object>

Men jeg ville kigge på https://code.google.com/p/swfobject/ for en smartere implementering med plugin-detection.

http://stackoverflow.com/questions/137326/how-to-embed-a-swf-file-in-a-html-page

Diverse

Overlay

Overlay må være noget i den her stil : Har testet, kan ikke få det til at virke lige nu.

ffmpeg -i input.mp4 -i image.png \
-filter_complex "[0:v][1:v] overlay=25:25" \
-pix_fmt yuv420p -c:a copy \
output.mp4

overlay=25:25 er positionen af overlay, husk at bruge png for transperens.

http://video.stackexchange.com/questions/12105/add-an-image-in-front-of-video-using-ffmpeg https://ffmpeg.org/ffmpeg-filters.html#overlay-1