From 85cd5a9d113de506c0722acaada68af56c9f9642 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 19 Sep 2022 16:19:41 +0200 Subject: [PATCH] Move scripts to script dir, add youtube-hls-stream script, fix twitch stream script --- README.md | 2 +- interactive.sh => scripts/interactive.sh | 2 +- list-sinks.sh => scripts/list-sinks.sh | 0 replay.sh => scripts/replay.sh | 2 +- .../toggle-recording-selected.sh | 0 .../twitch-stream-local-copy.sh | 2 +- twitch-stream.sh => scripts/twitch-stream.sh | 2 +- scripts/youtube-hls-stream.sh | 11 +++++++++++ src/main.cpp | 2 ++ 9 files changed, 18 insertions(+), 5 deletions(-) rename interactive.sh => scripts/interactive.sh (74%) rename list-sinks.sh => scripts/list-sinks.sh (100%) rename replay.sh => scripts/replay.sh (69%) rename toggle-recording-selected.sh => scripts/toggle-recording-selected.sh (100%) rename twitch-stream-local-copy.sh => scripts/twitch-stream-local-copy.sh (62%) rename twitch-stream.sh => scripts/twitch-stream.sh (61%) create mode 100755 scripts/youtube-hls-stream.sh diff --git a/README.md b/README.md index 6a796f8..08550ab 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ If you use a distro that isn't user friendly, such as fedora, then you can also Recording monitors requires a gpu with NvFBC support (note: this is not required when recording a single window!). Normally only tesla and quadro gpus support this, but by using [nvidia-patch](https://github.com/keylase/nvidia-patch) or [nvlax](https://github.com/illnyang/nvlax) you can do this on all gpus that support nvenc as well (gpus as old as the nvidia 600 series), provided you are not using outdated gpu drivers. # How to use -Run `interactive.sh` or run gpu-screen-recorder directly, for example: `gpu-screen-recorder -w $(xdotool selectwindow) -c mp4 -f 60 -a "$(pactl get-default-sink).monitor" -o test_video.mp4`\ +Run `scripts/interactive.sh` or run gpu-screen-recorder directly, for example: `gpu-screen-recorder -w $(xdotool selectwindow) -c mp4 -f 60 -a "$(pactl get-default-sink).monitor" -o test_video.mp4`\ Then stop the screen recorder with Ctrl+C, which will also save the recording.\ Send signal SIGUSR1 (`killall -SIGUSR1 gpu-screen-recorder`) to gpu-screen-recorder when in replay mode to save the replay. The paths to the saved files is output to stdout after the recording is saved.\ You can find the default output audio device (headset, speakers) with the command `pactl get-default-sink`. Add `monitor` to the end of that to use that as an audio input in gpu-screen-recorder.\ diff --git a/interactive.sh b/scripts/interactive.sh similarity index 74% rename from interactive.sh rename to scripts/interactive.sh index c02e7e9..63b0eae 100755 --- a/interactive.sh +++ b/scripts/interactive.sh @@ -14,4 +14,4 @@ read output_file_name output_dir=$(dirname "$output_file_name") mkdir -p "$output_dir" -./gpu-screen-recorder -w "$window_id" -c mp4 -f "$fps" -a "$selected_audio_input" -o "$output_file_name" +gpu-screen-recorder -w "$window_id" -c mp4 -f "$fps" -a "$selected_audio_input" -o "$output_file_name" diff --git a/list-sinks.sh b/scripts/list-sinks.sh similarity index 100% rename from list-sinks.sh rename to scripts/list-sinks.sh diff --git a/replay.sh b/scripts/replay.sh similarity index 69% rename from replay.sh rename to scripts/replay.sh index 6bbbb54..cf6c494 100755 --- a/replay.sh +++ b/scripts/replay.sh @@ -3,4 +3,4 @@ [ "$#" -ne 4 ] && echo "usage: replay.sh " && exit 1 active_sink="$(pactl get-default-sink).monitor" mkdir -p "$4" -./gpu-screen-recorder -w "$1" -c mp4 -f "$2" -a "$active_sink" -r "$3" -o "$4" +gpu-screen-recorder -w "$1" -c mp4 -f "$2" -a "$active_sink" -r "$3" -o "$4" diff --git a/toggle-recording-selected.sh b/scripts/toggle-recording-selected.sh similarity index 100% rename from toggle-recording-selected.sh rename to scripts/toggle-recording-selected.sh diff --git a/twitch-stream-local-copy.sh b/scripts/twitch-stream-local-copy.sh similarity index 62% rename from twitch-stream-local-copy.sh rename to scripts/twitch-stream-local-copy.sh index 1128a5e..dba9d15 100755 --- a/twitch-stream-local-copy.sh +++ b/scripts/twitch-stream-local-copy.sh @@ -4,4 +4,4 @@ [ "$#" -ne 4 ] && echo "usage: twitch-stream-local-copy.sh " && exit 1 active_sink="$(pactl get-default-sink).monitor" -./gpu-screen-recorder -w "$1" -c flv -f "$2" -a "$active_sink" | tee -- "$4" | ffmpeg -i pipe:0 -c:v copy -f flv -- "rtmp://live.twitch.tv/app/$3" +gpu-screen-recorder -w "$1" -c flv -f "$2" -a "$active_sink" | tee -- "$4" | ffmpeg -i pipe:0 -c copy -f flv -- "rtmp://live.twitch.tv/app/$3" diff --git a/twitch-stream.sh b/scripts/twitch-stream.sh similarity index 61% rename from twitch-stream.sh rename to scripts/twitch-stream.sh index 12928c9..cd4737a 100755 --- a/twitch-stream.sh +++ b/scripts/twitch-stream.sh @@ -2,4 +2,4 @@ [ "$#" -ne 3 ] && echo "usage: twitch-stream.sh " && exit 1 active_sink="$(pactl get-default-sink).monitor" -./gpu-screen-recorder -w "$1" -c flv -f "$2" -a "$active_sink" "rtmp://live.twitch.tv/app/$3" +gpu-screen-recorder -w "$1" -c flv -f "$2" -a "$active_sink" -o "rtmp://live.twitch.tv/app/$3" diff --git a/scripts/youtube-hls-stream.sh b/scripts/youtube-hls-stream.sh new file mode 100755 index 0000000..21619af --- /dev/null +++ b/scripts/youtube-hls-stream.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +[ "$#" -ne 3 ] && echo "usage: youtube-hls-stream.sh " && exit 1 +mkdir "youtube_stream" +cd "youtube_stream" +active_sink="$(pactl get-default-sink).monitor" +gpu-screen-recorder -w "$1" -c mpegts -f "$2" -a "$active_sink" | ffmpeg -i pipe:0 -c copy -f hls \ + -hls_time 2 -hls_flags independent_segments -hls_flags delete_segments -hls_segment_type mpegts -hls_segment_filename stream%02d.ts -master_pl_name stream.m3u8 out1 & +echo "Waiting until stream segments are created..." +sleep 10 +ffmpeg -i stream.m3u8 -c copy -- "https://a.upload.youtube.com/http_upload_hls?cid=$3©=0&file=stream.m3u8" diff --git a/src/main.cpp b/src/main.cpp index 25b34d4..c1ab013 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -533,6 +533,8 @@ static AVCodecContext *create_video_codec_context(AVFormatContext *av_format_con codec_context->max_b_frames = 0; codec_context->pix_fmt = AV_PIX_FMT_CUDA; codec_context->color_range = AVCOL_RANGE_JPEG; + if(use_hevc) + codec_context->codec_tag = MKTAG('h', 'v', 'c', '1'); switch(video_quality) { case VideoQuality::MEDIUM: codec_context->bit_rate = 10000000 + (codec_context->width * codec_context->height) / 2;