Camlink 4K på RPI4 och Linux arbetsstation
Hej!
/------------\
[skärm]<-+dp[datan]hdmi+--->[rpi4 (Fysisk hdmi-kabel)] -\
|sweclockers<3| +--> output.flv eller rtmp
|ljud via tcp+--->[rpi4 (Nätverk)] -----------/
\-------------/
Jag har lyckats få till det med Camlink 4K i Linux på en RPI4 i 1280x720 i 60fps. Är rätt förvånad hur bra det fungerar.
Hur man får bild ut på Displayport och HDMI samtidigt och använder standardverktyg som xrandr för att skejla output på arbetsstationen kanske inte är nån jättesvår att göra men tar med det ändå. Då jag har ganska gammalt grafikkort, ett Geforce GTX 780Ti så jag använder nouveau drivrutinen. Det finns visserligen äldre Nvidia drivrutiner som fortfarande fungerar men nej tack!
xrandr --output DVI-I-1 --off --output DVI-D-1 --off --output HDMI-1 --mode 1280x720 --pos 0x0 --rotate normal --output DP-1 --mode 1920x1080 --rate 200 --scale 0.6666x0.6666 --pos 0x0 --rotate normal
Nu har vi två outputs från skärmen, ett till den faktiskta skärmen som är inkopplad på DP-1 och till HDMI-1 som har kabeln kopplad mellan arbetsstationen och Camlink 4K kortet som sitter i Rasperry PI4.Det är dags att använda v4l2loopback på RPI4. Att spela in från camlink kortet direkt i Linux är alldelse för buggigt, och det är skönare att ha något som speglar från en enhet till en loopback enhet för att inspelning ska kunna ske när som helst.
hittacamlink.sh
#!/usr/bin/env bash
# Installera följande
# sudo apt install v4l2loopback-utils v4l2loopback-dkms
# Du kan starta om datorn eller bara kör en modprobe på kernel modulen.
# Skapa loopback kort
sudo modprobe v4l2loopback devices=1 exclusive_caps=1
# Hitta dummy kortet
V4LOOP=$(v4l2-ctl --list-devices | grep Dummy -A 1 | tail -n 1 | tr -d '\t')
[[ -z "$V4LOOP" ]] && echo "No v4l2 loop device found" && exit 1
echo "Video4Linux loop device is $V4LOOP"
# Hitta Elgato kortet.
ELGATO=$(v4l2-ctl --list-devices | grep 'Cam Link' -A 1 | tail -n 1 | tr -d '\t')
[[ -z "$ELGATO" ]] && echo "No Elgato Camlink device found" && exit 1
echo "Elgato Cam Link loop device is $ELGATO"
# Spela in till dummy interface (På RPI)
ffmpeg -f v4l2 -input_format yuyv422 -framerate 60 -video_size 1280x720 -i $ELGATO -pix_fmt yuyv422 -codec copy -f v4l2 $V4LOOP
Nu är det dags att använda den magiska raden för att streama/spela in på RPI4. I detta exempel har vi två input, ett som lyssnar på en tcp socket och tar emot data och en rad som spelar in från dummy/loopback v4l2 kortet.
sudo ffmpeg -loglevel -8 -i tcp://192.168.255.1:5900?listen -f v4l2 -itsoffset 1 -i /dev/video2 -r 60 -c:v h264_v4l2m2m -c:a aac -b:v 6000k -f flv output.flv
Det finns många sätt att skicka ljud mellan linuxmaskiner. Det som var mest smärtfritt för mig är att bara spela in från pulseaudio direkt från monitor enheten från arbetsstationen. Att köra två stycken ljudkort är alldelse för bökigt och kräver speciallösningar som bara är frustrerande och sjukt irreterande.
För att göra det så simpelt som möjligt. På arbetsstationen kör
pactl list sources|grep monitor
för att få fram korrekt monitor interface.
skickaljud.sh
ffmpeg -f pulse -ar 44100 -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor -f wav tcp://192.168.255.1:5900/dummy.wav
Nu när arbetsstationen börjar skicka ljud så spelar RPI4 in i 1280x720 i 60fps och tar emot ljudet via nätverket. Att ändra värdet av itsoffset till 1 eller 1.2 kan förbättre latensen på ljudet.
Det går naturligtvist att skicka strömmen direkt till twitch med tex denna rad, från RPI4: Jag skulle rekommendera att lägga det i en fil och köra filen så inte nyckeln blir exponerad publikt, -loglevel -8 tar bort all output från ffmpeg så inget syns.
twichstream.sh
sudo ffmpeg -loglevel -8 -i tcp://192.168.255.1:5900?listen -f v4l2 -itsoffset 1 -i /dev/video2 -r 60 -c:v h264_v4l2m2m -c:a aac -b:v 6000k -f flv "rtmp://live.twitch.tv/app/din_långa_nyckel"
Nu kanske det inte är tillåtet att köra 6000kbit till Twitch i 1280x720@60, men jag har gjort det. Läs användaravtalet bara
Operativsystemet som används på RPI4 Raspian 64bit. Arbetsstationen har mindre betydelse vad den använder eftersom det är samma sak med nouveau drivrutinen i alla olika typer av Linux. Hur som helst använder jag en typ av Linux som håller mig närmast till hjärtat. Debian eller Ubuntu är ett bra val!
<3