infrastructure/pkgs/kat-tv/default.nix
2021-08-10 20:36:12 +01:00

168 lines
4.6 KiB
Nix

{ pkgs ? import <nixpkgs> { }, lib }: with lib; with pkgs.gst_all_1; let
queue_frame = {
element."queue" = {
leaky = "downstream";
flush-on-eos = true;
max-size-buffers = 3;
};
};
queue_data = {
element.queue = {
leaky = "downstream";
};
};
videoconvert_cpu = {
element.videoconvert = {
n-threads = 4;
dither = 0;
chroma-resampler = 0;
chroma-mode = 3;
};
};
videoconvert_gpu = [
# TODO: vulkancolorconvert?
"glupload"
"glcolorconvert"
"gldownload"
];
cameracapture = {
element."v4l2src" = {
device = "/dev/videomew";
saturation = 100;
brightness = 100;
extra-controls = "c,exposure_auto=3";
};
};
v4l2src = [
cameracapture
{
caps."image/jpeg" = {
width = 1280;
height = 720;
framerate = "30/1"; # "10/1"
};
}
];
filesrc = [
{
element.filesrc = {
location = "rawvid.mkv";
};
}
"matroskademux"
];
denoise = {
element.frei0r-filter-hqdn3d = {
spatial = 0.175; #0.325;
temporal = 0.06; #0.11;
};
};
encodeopts = {
speed-preset = "ultrafast";
tune = "zerolatency";
pass = "qual";
#psy-tune = "film";
#noise-reduction=0;
quantizer = 27;
bitrate = 8192;
rc-lookahead = 6;
};
encode_intra = [
{
element.x264enc = {
intra-refresh = true;
key-int-max = 0;
} // encodeopts;
}
{
caps."video/x-h264" = {
profile = "high-4:2:2-intra";
};
}
"h264parse"
];
encode_high = [
{
element.x264enc = {
key-int-max = 150;
} // encodeopts;
}
{
caps."video/x-h264" = {
profile = "high";
};
}
"h264parse"
];
rtmpsink = [
queue_data
"flvmux"
{
element.rtmp2sink = {
location = "rtmp://192.168.1.223:1935/stream/kattv";
};
}
];
filesink = [
"matroskamux"
{
element.filesink = {
location = "out.mkv";
};
}
];
videosink = "autovideosink";
pipeline = v4l2src ++ [
#filesrc
"jpegtrunc"
{ element.matroskamux.streamable = true; }
{
element.tcpclientsink = {
host = "192.168.1.223";
port = "4953";
sync = false;
};
}
];
#gst-launch-1.0 $camera ! $videoconvert ! $queue ! $denoise ! $encode ! $outfile
env = {
FREI0R_PATH = "${pkgs.frei0r}/lib/frei0r-1";
GST_PLUGIN_SYSTEM_PATH_1_0 = with pkgs.gst_all_1; lib.makeSearchPath "lib/gstreamer-1.0" [
gstreamer
gst-plugins-base
gst-plugins-good
gst-plugins-bad
gst-plugins-ugly
pkgs.gst-jpegtrunc
];
};
shell = pkgs.mkShell (env // {
nativeBuildInputs = [ gstreamer kattv ];
});
in
{
inherit shell pipeline env;
}
#!/usr/bin/env bash
/*
#encode='x264enc intra-refresh=true key-int-max=0 speed-preset=superfast tune=zerolatency pass=qual psy-tune=film noise-reduction=250 quantizer=23 rc-lookahead=15 ! video/x-h264,profile=high-4:2:2-intra ! h264parse'
#encode="x264enc intra-refresh=true key-int-max=0 $encodeopts ! video/x-h264,profile=high-4:2:2-intra ! h264parse ! $bufqueue"
encode="x264enc key-int-max=50 $encodeopts ! video/x-h264,profile=high-4:2:2 ! h264parse ! $bufqueue"
# original pipeline:
# gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw,format=YUY2,width=1280,height=800,framerate=10/1" ! videoconvert ! x264enc intra-refresh=true key-int-max=0 speed-preset=superfast tune=zerolatency pass=qual psy-tune=film noise-reduction=250 quantizer=23 rc-lookahead=15 ! video/x-h264,profile=high-4:2:2-intra ! h264parse ! flvmux ! rtmpsink location="rtmp://kittywit.ch/kattv/meowlymeowl live=1"
#gst-launch-1.0 filesrc location=rawvid.mkv ! mkvdemux ! "video/x-raw,format=YUY2,width=1280,height=800,framerate=10/1" ! videoconvert ! x264enc intra-refresh=true key-int-max=0 speed-preset=superfast tune=zerolatency pass=qual psy-tune=film noise-reduction=250 quantizer=23 rc-lookahead=15 ! video/x-h264,profile=high-4:2:2-intra ! h264parse ! flvmux ! filesink location=out.flv
#gst-launch-1.0 filesrc location=rawvid.mkv ! matroskademux ! "video/x-raw,format=YUY2,width=1280,height=800,framerate=10/1" ! videoconvert ! "video/x-raw,format=RGBA" ! frei0r-filter-hqdn3d spatial=0.35 temporal=0.115 ! videoconvert ! autovideosink
outfile='flvmux ! filesink location=out.flv'
#gst-launch-1.0 $camera ! $videoconvert ! $denoise ! autovideosink
gst-launch-1.0 $camera ! $videoconvert ! $queue ! $denoise ! $encode ! $outfile
#gst-launch-1.0 $camera ! $videoconvert ! $encode ! $outfile
*/