Ich habe auf einem RPi 3 einen kürzlich selbst erstellen FFMPEG -Build am Laufen, nur liefert er mir für das Streaming eines HDMI-Grabbers noch nicht das richtige Ergebnis. So sieht die ganze Sache aus:
1. Audio
arecord -l
**** Liste der Hardware-Geräte (CAPTURE) ****
Karte 1: Grabber [HDMI Grabber], Gerät 0: USB Audio [USB Audio]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
2. Video
v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : Motion-JPEG
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Alles anzeigen
Der Grabber ist also das einzige Gerät, das dranhängt und videomäßig liefert es MJPEG in vier verschiedenen Modi.
Deswegen will ich auf die folgende Weise einen Stream des unveränderten (damit der RPi auslastungsmäßig idealerweise nicht viel von diesem Stream mitbekommt) Videos im lokalen Netz von diesem RPi betreiben:
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i plughw:1,0 -c:v copy -b:v 1000k -q:v 1 -f mpegts udp://HOSTNAME:12345
ffmpeg version 4.0.2 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 6.3.0 (Raspbian 6.3.0-18+rpi1+deb9u1) 20170516
configuration: --prefix=/usr --enable-gpl --enable-nonfree --enable-static --enable-libtheora --enable-libvorbis --enable-omx --enable-omx-rpi --enable-mmal --enable-libxcb --enable-libfreetype --enable-libass --enable-gnutls --disable-opencl --enable-libcdio --enable-libbluray --extra-cflags='-march=armv8-a+crc -mfpu=neon-fp-armv8 -mtune=cortex-a53' --enable-libx264 --enable-libfdk-aac --enable-libmp3lame
libavutil 56. 14.100 / 56. 14.100
libavcodec 58. 18.100 / 58. 18.100
libavformat 58. 12.100 / 58. 12.100
libavdevice 58. 3.100 / 58. 3.100
libavfilter 7. 16.100 / 7. 16.100
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
libpostproc 55. 1.100 / 55. 1.100
[mjpeg @ 0x1e31230] No JPEG data found in image
Last message repeated 1 times
Input #0, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 3485.192004, bitrate: N/A
Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 1920x1080, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
Guessed Channel Layout for Input Stream #1.0 : stereo
Input #1, alsa, from 'plughw:1,0':
Duration: N/A, start: 1542558774.751541, bitrate: 1536 kb/s
Stream #1:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #1:0 -> #0:1 (pcm_s16le (native) -> mp2 (native))
Press [q] to stop, [?] for help
Output #0, mpegts, to 'udp://HOSTNAME:12345':
Metadata:
encoder : Lavf58.12.100
Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 1920x1080, q=2-31, 1000 kb/s, 30 fps, 30 tbr, 90k tbn, 1000k tbc
Stream #0:1: Audio: mp2, 48000 Hz, stereo, s16, 384 kb/s
Metadata:
encoder : Lavc58.18.100 mp2
[alsa @ 0x1e32490] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
frame= 2061 fps= 30 q=-1.0 Lsize= 185606kB time=00:01:08.66 bitrate=22145.0kbits/s speed= 1x
Alles anzeigen
HOSTNAME ist der Netzwerkname des Zielrechners, auf Port 12345 soll der Stream geliefert werden. Der Stream wird gestartet und läuft dann auch weiter (letzte Zeile oben), auf dem Zielrechner (Win 10) öffne ich über vlc den Stream udp://@:12345 und höre leider nur den Ton. Wie muss ich den Videoteil konfigurieren, damit der ohne große Auslastung des kleinen RPis (keine Transcodierung) aber mit Bild und Ton auch beim Ziel ankommt?
Ich habe nun schon einige Stunden damit verbracht, da wäre ein Hinweis eines FFMPEG-Insiders sehr willkommen.
Mit cvlc hat es vom selben Rechner bereits funktioniert, aber da tritt immer ein Fehler auf, der mittlerweile nach gewisser Zeit (5 - 10 Minuten) zu ruckligen Bildern führt. Das war der Grund, es direkt über FFMPEG zu versuchen.
Vielen Dank im Voraus!