Videostreaming: Unterschied zwischen den Versionen
(13 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 6: | Zeile 6: | ||
Der Ausloeser fuer diesen Beitrag ist die Moeglichkeit zu schaffen, von einem System geringer Leistung (RasPi,NAO...) mit angeschlossener Kamera, das Videobild ueber eine Netzwerkverbindung moeglichst in einem Browser, oder Viewer-Marke-Eigenbau fluessig anzuzeigen. | Der Ausloeser fuer diesen Beitrag ist die Moeglichkeit zu schaffen, von einem System geringer Leistung (RasPi,NAO...) mit angeschlossener Kamera, das Videobild ueber eine Netzwerkverbindung moeglichst in einem Browser, oder Viewer-Marke-Eigenbau fluessig anzuzeigen. | ||
+ | |||
+ | Da das eigentliche Ziel eine ressourcenschnonende Uebertragung von Videomaterial von z.B. RasPI, NAO, ... zu OpenCV ist kann der [https://www.it-jim.com/blog/gstreamer-for-computer-vision-and-audio-processing/ Artikel] recht interessant sein. | ||
+ | |||
+ | =Dateiformate= | ||
+ | |||
+ | Auch Videodateitypen, oder auch Datei-Container. Ein Container enthält das Video, Audiodaten und ggf. weitere Informationen wie Untertitel oder Metadaten. | ||
+ | [https://de.wikipedia.org/wiki/Containerformat] | ||
+ | Fuer mich nach wie vor von Interesse | ||
+ | MPEG-1 und MPEG-2 (m2p, mpg, mpeg, ts) | ||
+ | MPEG-4 (mp4, m4v) | ||
+ | Matroska (mkv) | ||
+ | HTML5 (WebM) | ||
+ | |||
+ | Instagram | ||
+ | Videoformat: MP4 oder MOV | ||
+ | Audio: AAC | ||
+ | Video-Codec: H.264 | ||
+ | Framerate: maximal 30 Bilder pro Sekunde (fps) | ||
+ | Maximale Dateigröße: 15 MB | ||
+ | |||
+ | YouTube | ||
+ | Videoformat: MP4 | ||
+ | Audio: AAC-LC | ||
+ | Video-Codec: H.264 | ||
+ | Framerate: selbe Framerate wie bei der Aufnahme, gängig sind 24, 25, 30, 48, 50 und 60 Bilder pro Sekunde | ||
+ | Maximale Dateigröße: 256 GB | ||
+ | |||
+ | WhatsApp | ||
+ | TODO | ||
+ | |||
+ | |||
Um mich der Sache zu naehern, hier eine Sammlung der ausprobierten Befehle. | Um mich der Sache zu naehern, hier eine Sammlung der ausprobierten Befehle. | ||
− | + | ||
=Versuch und Irrtum= | =Versuch und Irrtum= | ||
+ | |||
+ | Das man nicht blind im Nebel stochert. | ||
+ | |||
+ | v4l2-ctl --list-formats | ||
+ | ioctl: VIDIOC_ENUM_FMT | ||
+ | Index : 0 | ||
+ | Type : Video Capture | ||
+ | Pixel Format: 'YUYV' | ||
+ | Name : YUYV 4:2:2 | ||
+ | |||
+ | |||
+ | v4l2-ctl -d /dev/video0 --list-framesizes=YUYV | ||
+ | ioctl: VIDIOC_ENUM_FRAMESIZES | ||
+ | Size: Discrete 640x480 | ||
+ | Size: Discrete 160x120 | ||
+ | Size: Discrete 176x144 | ||
+ | Size: Discrete 320x240 | ||
+ | Size: Discrete 352x288 | ||
+ | |||
+ | v4l2-ctl -L | ||
+ | brightness 0x00980900 (int) : min=0 max=255 step=1 default=124 value=124 | ||
+ | contrast 0x00980901 (int) : min=0 max=255 step=1 default=145 value=145 | ||
+ | saturation 0x00980902 (int) : min=0 max=255 step=1 default=75 value=75 | ||
+ | hue 0x00980903 (int) : min=-127 max=127 step=1 default=0 value=0 | ||
+ | gamma 0x00980910 (int) : min=1 max=8 step=1 default=4 value=4 | ||
+ | gain 0x00980913 (int) : min=0 max=65535 step=1 default=16 value=16 | ||
+ | power_line_frequency 0x00980918 (menu) : min=0 max=2 default=1 value=1 | ||
+ | 0: Disabled | ||
+ | 1: 50 Hz | ||
+ | 2: 60 Hz | ||
+ | sharpness 0x0098091b (int) : min=0 max=255 step=1 default=10 value=10 | ||
+ | |||
+ | gst-device-monitor-1.0 | ||
+ | Device found: | ||
+ | |||
+ | name : \_SB_.PCI0.EUS1-4.1.4:1.0-18ec:3399 | ||
+ | class : Source/Video | ||
+ | caps : video/x-raw, format=YUY2, width=160, height=120 | ||
+ | video/x-raw, format=YUY2, width=176, height=144 | ||
+ | video/x-raw, format=YUY2, width=320, height=240 | ||
+ | video/x-raw, format=YUY2, width=352, height=288 | ||
+ | video/x-raw, format=YUY2, width=640, height=480 | ||
+ | gst-launch-1.0 libcamerasrc camera-name="\\_SB_.PCI0.EUS1-4.1.4:1.0-18ec:3399" ! ... | ||
+ | |||
+ | Einmal YUYV 4:2:2 und jetzt YUY2 | ||
+ | |||
+ | packed 4:2:2 YUV | ||
+ | |||
+ | +--+--+--+--+ +--+--+--+--+ | ||
+ | |Y0|U0|Y1|V0| |Y2|U2|Y3|V2| ... | ||
+ | +--+--+--+--+ +--+--+--+--+ | ||
+ | |||
+ | Component 0: Y | ||
+ | depth: 8 | ||
+ | pstride: 2 | ||
+ | offset: 0 | ||
+ | |||
+ | Component 1: U | ||
+ | depth: 8 | ||
+ | offset: 1 | ||
+ | pstride: 4 | ||
+ | |||
+ | Component 2: V | ||
+ | depth 8 | ||
+ | offset: 3 | ||
+ | pstride: 4 | ||
+ | |||
+ | Image | ||
+ | default rstride: RU4 (width * 2) | ||
+ | default size: rstride (image) * height | ||
+ | |||
+ | |||
==1== | ==1== | ||
Zeile 42: | Zeile 145: | ||
gst-launch-1.0 webmmux name=mux ! filesink location=test.webm v4l2src device=/dev/video0 ! videoconvert ! vp8enc ! queue ! mux.video_0 | gst-launch-1.0 webmmux name=mux ! filesink location=test.webm v4l2src device=/dev/video0 ! videoconvert ! vp8enc ! queue ! mux.video_0 | ||
− | Video war mit deutlicher Verzoegerung im Browser zu sehen. | + | Video war mit deutlicher Verzoegerung im Browser zu sehen. Der Name mux wird dann ganz am Ende als Referenz benutzt mux.video oder mux.audio. |
+ | Damit erklaert sich auch die hier "falsche" Reihenfolge der Pipe. | ||
+ | |||
+ | |||
+ | ==5== | ||
+ | |||
+ | gst-launch-1.0 v4l2src device=/dev/video0 ! queue ! x264enc ! mp4mux ! filesink location=video.mp4 | ||
+ | |||
+ | |||
+ | ==6== | ||
+ | ffmpegcolorspace wurde durch videoconvert ersetzt. | ||
+ | |||
+ | gst-launch-1.0 v4l2src ! videoconvert ! jpegenc ! avimux ! filesink location=output.avi | ||
+ | |||
+ | Fuehrt beim Firefox zum Download. | ||
+ | |||
+ | |||
+ | ==7== | ||
+ | Erzeugt zwar eine mp4-Dartei. Das Abspielen gelingt aber weder mit VLC noch MPlayer. | ||
+ | |||
+ | st-launch-1.0 v4l2src ! videoconvert ! x264enc ! mp4mux ! filesink location=video.mp4 -e | ||
+ | |||
+ | |||
+ | ==8== | ||
+ | |||
+ | gst-launch-1.0 -v v4l2src ! videoconvert ! rtpvrawpay ! udpsink host="127.0.0.1" port=5000 | ||
+ | |||
+ | Geht irgendwie, aber kein brauchbares Bild. VLC bleibt schwarz. | ||
+ | Mplayer bringt Stream not seekable! und auch kein Bild | ||
+ | |||
+ | |||
+ | gst-launch-1.0 -v udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, width=(string)640, height=(string)480, payload=(int)96, sampling=(string)RGBA, depth=(string)8, a-framerate=30/1" ! rtpvrawdepay ! videoconvert ! queue ! xvimagesink sync=false | ||
+ | |||
+ | ==9== | ||
+ | |||
+ | gst-launch-1.0 -e -v v4l2src ! videoconvert ! videoscale ! videorate ! "video/x-raw,format=I420,width=640,height=480,framerate=30/1" ! x264enc key-int-max=15 ! rtph264pay ! udpsink host=localhost port=5000 | ||
+ | |||
+ | Da ist der Server bei ueber 100% CPU-Last. Das erklaert die leichte Verzoegerung. | ||
+ | |||
+ | gst-launch-1.0 -v udpsrc uri=udp://localhost:5000 ! application/x-rtp,media=video,clock-rate=90000,encoding-name=H264,payload=96 ! rtph264depay ! avdec_h264 ! autovideosink |
Aktuelle Version vom 5. März 2023, 20:58 Uhr
Inhaltsverzeichnis
Allgemeines
Wie selbstvestaendlich benutzt man Videostreaming von Youtube, Prime, ....
Irgendwie werde ich das Gefuehl aber nicht los, sobald die Anforderung zu simpel wird kommen einem nicht geahnte Schwierigkeiten in die Quere. Da spielt der Liebingsplayer eine Video nicht ab, weil der passende Codec nicht lizenziert oder installiert ist, die Latenzen machen das fluessige schauen unmoeglich, die Rechenleistung des Rechners reicht nicht aus um die Anforderungen eines Codec zu bedienen und und und ...
Der Ausloeser fuer diesen Beitrag ist die Moeglichkeit zu schaffen, von einem System geringer Leistung (RasPi,NAO...) mit angeschlossener Kamera, das Videobild ueber eine Netzwerkverbindung moeglichst in einem Browser, oder Viewer-Marke-Eigenbau fluessig anzuzeigen.
Da das eigentliche Ziel eine ressourcenschnonende Uebertragung von Videomaterial von z.B. RasPI, NAO, ... zu OpenCV ist kann der Artikel recht interessant sein.
Dateiformate
Auch Videodateitypen, oder auch Datei-Container. Ein Container enthält das Video, Audiodaten und ggf. weitere Informationen wie Untertitel oder Metadaten. [1] Fuer mich nach wie vor von Interesse MPEG-1 und MPEG-2 (m2p, mpg, mpeg, ts) MPEG-4 (mp4, m4v) Matroska (mkv) HTML5 (WebM)
Videoformat: MP4 oder MOV Audio: AAC Video-Codec: H.264 Framerate: maximal 30 Bilder pro Sekunde (fps) Maximale Dateigröße: 15 MB
YouTube
Videoformat: MP4 Audio: AAC-LC Video-Codec: H.264 Framerate: selbe Framerate wie bei der Aufnahme, gängig sind 24, 25, 30, 48, 50 und 60 Bilder pro Sekunde Maximale Dateigröße: 256 GB
TODO
Um mich der Sache zu naehern, hier eine Sammlung der ausprobierten Befehle.
Versuch und Irrtum
Das man nicht blind im Nebel stochert.
v4l2-ctl --list-formats ioctl: VIDIOC_ENUM_FMT Index : 0 Type : Video Capture Pixel Format: 'YUYV' Name : YUYV 4:2:2
v4l2-ctl -d /dev/video0 --list-framesizes=YUYV ioctl: VIDIOC_ENUM_FRAMESIZES Size: Discrete 640x480 Size: Discrete 160x120 Size: Discrete 176x144 Size: Discrete 320x240 Size: Discrete 352x288
v4l2-ctl -L brightness 0x00980900 (int) : min=0 max=255 step=1 default=124 value=124 contrast 0x00980901 (int) : min=0 max=255 step=1 default=145 value=145 saturation 0x00980902 (int) : min=0 max=255 step=1 default=75 value=75 hue 0x00980903 (int) : min=-127 max=127 step=1 default=0 value=0 gamma 0x00980910 (int) : min=1 max=8 step=1 default=4 value=4 gain 0x00980913 (int) : min=0 max=65535 step=1 default=16 value=16 power_line_frequency 0x00980918 (menu) : min=0 max=2 default=1 value=1 0: Disabled 1: 50 Hz 2: 60 Hz sharpness 0x0098091b (int) : min=0 max=255 step=1 default=10 value=10
gst-device-monitor-1.0 Device found:
name : \_SB_.PCI0.EUS1-4.1.4:1.0-18ec:3399 class : Source/Video caps : video/x-raw, format=YUY2, width=160, height=120 video/x-raw, format=YUY2, width=176, height=144 video/x-raw, format=YUY2, width=320, height=240 video/x-raw, format=YUY2, width=352, height=288 video/x-raw, format=YUY2, width=640, height=480 gst-launch-1.0 libcamerasrc camera-name="\\_SB_.PCI0.EUS1-4.1.4:1.0-18ec:3399" ! ...
Einmal YUYV 4:2:2 und jetzt YUY2
packed 4:2:2 YUV
+--+--+--+--+ +--+--+--+--+ |Y0|U0|Y1|V0| |Y2|U2|Y3|V2| ... +--+--+--+--+ +--+--+--+--+
Component 0: Y depth: 8 pstride: 2 offset: 0
Component 1: U depth: 8 offset: 1 pstride: 4
Component 2: V depth 8 offset: 3 pstride: 4
Image default rstride: RU4 (width * 2) default size: rstride (image) * height
1
gst-launch-1.0 v4l2src device="/dev/video0" ! autovideoconvert ! autovideosink sync=false
Das sync=false am Ende laesst das Video erst fluessig erscheinen.
2
gst-launch-1.0 v4l2src device="/dev/video0" ! videoconvert ! clockoverlay ! x264enc tune=zerolatency ! mpegtsmux ! hlssink playlist-root=http://192.168.178.10/gstreamer/hlstest location=/mnt/SERVER/WWW/gstreamer/hlstest/segment_%05d.ts target-duration=5 max-files=5
Ein HTML5 Player gibt diesen Stream nicht wieder.
Es gibt in HTML5 folgende Einschraenkung, .ts ist da nicht dabei. .mp4 = H.264 + AAC .ogg/.ogv = Theora + Vorbis .webm = VP8 + Vorbis
3
gst-launch-1.0 webmmux name=mux ! filesink location=test.webm \ videotestsrc num-buffers=250 ! video/x-raw,framerate=25/1 ! videoconvert ! vp8enc ! queue ! mux.video_0 \ audiotestsrc samplesperbuffer=44100 num-buffers=10 ! audio/x-raw,rate=44100 ! vorbisenc ! queue ! mux.audio_0
Zum Probieren ganz hilfreich, da "Fehler" bei der Quelle(nangabe) wegfallen.
4
gst-launch-1.0 webmmux name=mux ! filesink location=test.webm v4l2src device=/dev/video0 ! videoconvert ! vp8enc ! queue ! mux.video_0
Video war mit deutlicher Verzoegerung im Browser zu sehen. Der Name mux wird dann ganz am Ende als Referenz benutzt mux.video oder mux.audio. Damit erklaert sich auch die hier "falsche" Reihenfolge der Pipe.
5
gst-launch-1.0 v4l2src device=/dev/video0 ! queue ! x264enc ! mp4mux ! filesink location=video.mp4
6
ffmpegcolorspace wurde durch videoconvert ersetzt.
gst-launch-1.0 v4l2src ! videoconvert ! jpegenc ! avimux ! filesink location=output.avi
Fuehrt beim Firefox zum Download.
7
Erzeugt zwar eine mp4-Dartei. Das Abspielen gelingt aber weder mit VLC noch MPlayer.
st-launch-1.0 v4l2src ! videoconvert ! x264enc ! mp4mux ! filesink location=video.mp4 -e
8
gst-launch-1.0 -v v4l2src ! videoconvert ! rtpvrawpay ! udpsink host="127.0.0.1" port=5000
Geht irgendwie, aber kein brauchbares Bild. VLC bleibt schwarz. Mplayer bringt Stream not seekable! und auch kein Bild
gst-launch-1.0 -v udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, width=(string)640, height=(string)480, payload=(int)96, sampling=(string)RGBA, depth=(string)8, a-framerate=30/1" ! rtpvrawdepay ! videoconvert ! queue ! xvimagesink sync=false
9
gst-launch-1.0 -e -v v4l2src ! videoconvert ! videoscale ! videorate ! "video/x-raw,format=I420,width=640,height=480,framerate=30/1" ! x264enc key-int-max=15 ! rtph264pay ! udpsink host=localhost port=5000
Da ist der Server bei ueber 100% CPU-Last. Das erklaert die leichte Verzoegerung.
gst-launch-1.0 -v udpsrc uri=udp://localhost:5000 ! application/x-rtp,media=video,clock-rate=90000,encoding-name=H264,payload=96 ! rtph264depay ! avdec_h264 ! autovideosink