Skip to content

Instantly share code, notes, and snippets.

View philhartung's full-sized avatar

Philipp Hartung philhartung

View GitHub Profile
@philhartung
philhartung / ptz.js
Last active March 5, 2024 23:47
Script to Control an ONVIF PTZ Camera with a Logitech Extreme 3D Pro
const hid = require('node-hid');
const { Cam } = require('onvif');
const yargs = require('yargs/yargs');
const { hideBin } = require('yargs/helpers');
const argv = yargs(hideBin(process.argv))
.option('hostname', {
alias: 'h',
describe: 'Server hostname',
demandOption: true,
@philhartung
philhartung / histogram.bat
Last active November 28, 2022 23:19
ffmpeg scripts for OBS on Windows
ffplay.exe -f dshow -i video="OBS Virtual Camera" -vf "format=yuva444p,split=2[a][b];[a]histogram=c=7:fgopacity=0.9[aa];[b][aa]overlay"
@philhartung
philhartung / aes67-multiply.js
Last active August 23, 2022 12:32
Easily multiply an AES67 Stream for load testing. SDP has to be adjusted accordingly
const dgram = require('dgram');
const process = require('process');
const sdp = require('./sdp');
let client = dgram.createSocket({ type: 'udp4', reuseAddr: true });
let clients = [];
if(!process.argv[2] || !(parseInt(process.argv[2]) > 0)){
console.log('$ node multiply 12');
@philhartung
philhartung / ebur.sh
Last active April 21, 2023 21:23
EBUR128 loudness meter using ffplay, 800x480 resolution for Raspberry Pi touchscreen
#/bin/sh
ffplay -exitonkeydown -exitonmousedown -fs -fflags nobuffer -probesize 32 -analyzeduration 1 -f lavfi -i "amovie=default:f=alsa,asplit=2[sv][eb];\
[sv]showvolume=b=0:o=v:w=480:h=23[sv-v];\
[eb]ebur128=video=1:size=754x480[eb-v][out1];\
[eb-v][sv-v]hstack=2[out0]"
@philhartung
philhartung / aes67.py
Created December 8, 2021 15:33
Simple AES67 implementation using gstreamer. Does not implement any discovery.
import sys
import gi
gi.require_version('Gst', '1.0')
gi.require_version('GstNet', '1.0')
from gi.repository import Gst, GstNet, GObject, GLib
Gst.init([])
mainloop = GLib.MainLoop()
@philhartung
philhartung / sine.js
Last active June 9, 2021 21:56
Generate sine wave audio and output it to default audiodevice
const { RtAudio, RtAudioFormat } = require('audify');
const rtAudio = new RtAudio();
// constants
const samplerate = 48000;
const ffp = 48;
// audio device
let audioOutput = {
deviceId: rtAudio.getDefaultOutputDevice(),
@philhartung
philhartung / ptpanalyzer.js
Last active February 13, 2022 06:56
First draft of AES67 RTP timestamp analyzer tool. Prints RTP to PTP timestamp difference min/avg/max in console
const dgram = require('dgram');
const chalk = require('chalk');
const ptpv2 = require('ptpv2');
let interface = '10.0.0.12';
//let multicastAddr = '239.69.161.58';
let multicastAddr = '239.69.80.114';
let samplerate = 48000;
let client = dgram.createSocket({ type: 'udp4', reuseAddr: true });
@philhartung
philhartung / stream.sh
Last active October 2, 2023 12:33
Stream a video via network to OBS with low latency (<100ms)
#!/bin/sh
# host is the IP of the receiving computer
host="192.168.0.101"
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-h264, width=1920, height=1080, framerate=30/1 ! rtph264pay ! udpsink host=$host port=5004
#!/bin/sh
ffplay -fs -f v4l2 -i /dev/video2 -input_format mjpeg -video_size 1920x1080 -framerate 60.0 -vf "format=yuv444p,split=4[a][b][c][d];\
[a]histogram=c=1,scale=w=-1:h=1080,pad=1920:ih:(ow-iw)/2[aa];\
[b]scale=1920x1080[bb];\
[c]waveform=scale=ire,scale=1920x1080,\
drawbox=0:85:1920:3:GreenYellow:fill,\
drawtext=text=100:x=0:y=50:fontsize=35:fontcolor=GreenYellow,\
drawbox=0:317:1920:3:GreenYellow:fill,\
drawtext=text=75:x=0:y=282:fontsize=35:fontcolor=GreenYellow,\
drawbox=0:546:1920:3:GreenYellow:fill,\
@philhartung
philhartung / aes67_play.sh
Last active January 29, 2023 17:50
Play a AES67 stream
#!/bin/sh
gst-launch-1.0 udpsrc address=239.69.161.58 port=5004 multicast-iface=eth0 !\
application/x-rtp, clock-rate=48000, channels=2 !\
rtpjitterbuffer !\
rtpL24depay !\
audioconvert !\
audioresample !\
autoaudiosink