Last active
October 26, 2019 17:58
-
-
Save ikanoano/e276413c23a33164cca2363d4f9942ed to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# https://devblogs.nvidia.com/nvidia-ffmpeg-transcoding-guide/ | |
ga=$(pactl list sources | grep Name | sed 's/.*Name: //' | grep analog-stereo | grep -v monitor) | |
vo=$(pactl list sources | grep Name | sed 's/.*Name: //' | grep USB) | |
vc=$(pactl list sources | grep Name | sed 's/.*Name: //' | grep analog-stereo.monitor) | |
qp=36 | |
input_pre="-use_wallclock_as_timestamps 1 -thread_queue_size 1024" | |
soundin="-f pulse $input_pre -i $ga" | |
numsound=1 | |
soundfilter_body="[1:a]volume=5dB[ag];" # for game | |
soundfilter_post="[ag]" | |
caption="game" | |
gop="-g 15 -strict_gop 1" | |
ll="info" | |
while [[ $# -gt 0 ]] | |
do | |
case $1 in | |
--caption) | |
caption="$2" | |
shift # past argument | |
shift # past value | |
;; | |
--qp) | |
qp="$2" | |
shift # past argument | |
shift # past value | |
;; | |
--voice) | |
soundin="$soundin -f pulse ${input_pre} -i $vo" | |
numsound=$((numsound+1)) | |
soundfilter_body="$soundfilter_body \ | |
[${numsound}:a]volume=9dB,compand=.3|.3:.8|.8:-900/-900|-38.1/-900|-38/-38|20/20:.01:0:-90:.1[av];" | |
soundfilter_post="${soundfilter_post}[av]" | |
shift # past argument | |
;; | |
--monitor) | |
soundin="$soundin -f pulse $input_pre -i $vc" | |
numsound=$((numsound+1)) | |
soundfilter_body="$soundfilter_body [${numsound}:a]volume=16dB[am];" | |
soundfilter_post="${soundfilter_post}[am]" | |
shift # past argument | |
;; | |
--debug) | |
ll="debug" | |
shift # past argument | |
;; | |
--live) | |
read -p "Do you really want to stream live video on youtube? <y/N> " prompt | |
if [[ ! $prompt =~ ^[yY](es)*$ ]]; then exit 1; fi | |
dst="\ | |
-f flv pipe: | \ | |
ffmpeg -err_detect ignore_err -re -i - -c copy \ | |
-f fifo -fifo_format flv -map 0:v -map 0:a -queue_size 4096 \ | |
-drop_pkts_on_overflow 1 -attempt_recovery 1 -recovery_wait_time 1 \ | |
`cat ~/streamurl`" | |
gop="-g 1" | |
shift # past argument | |
;; | |
*) | |
echo "??? $1" | |
exit 1 | |
;; | |
esac | |
done | |
soundfilter="${soundfilter_body}${soundfilter_post}amix=inputs=${numsound}[aout]" | |
start=$(date +%H:%M) | |
file="/tmp/cap_${caption}_${start}.mp4" | |
dst=${dst:-"-movflags faststart $file"} | |
set -x | |
eval "ffmpeg -hide_banner -loglevel ${ll} -threads 2 -vsync:v passthrough \ | |
-hwaccel cuvid -c:v mjpeg_cuvid -resize 1280x720 \ | |
${input_pre} -i 'udp://127.0.0.1:4096?overrun_nonfatal=1&pkt_size=9000&fifo_size=4096&timeout=100000' \ | |
${soundin} \ | |
-r 30 -c:v h264_nvenc -profile:v high -preset slow \ | |
-surfaces 40 -rc-lookahead 30 -bf 2 \ | |
-temporal-aq 1 -spatial-aq 1 -b_ref_mode:v middle \ | |
-rc:v constqp -qp ${qp@Q} -minrate 10 -maxrate 6M -bufsize 12M \ | |
-flags cgop $gop -coder:v cabac \ | |
-filter_complex ${soundfilter@Q} \ | |
-c:a aac -ac 2 -ar 48000 -b:a 192k \ | |
-map 0:v -map '[aout]' \ | |
${dst}" | |
set +x | |
end=$(date +%H:%M) | |
mv $file "/tmp/cap_${caption}_${start}-${end}.mp4" | |
#-temporal-aq 1 -spatial-aq 1 -b_ref_mode:v middle -weighted_pred 1 | |
#-b:a 192k -q:a 2 | |
#Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]: | |
# General capabilities: delay | |
# Threading capabilities: none | |
# Supported pixel formats: yuv420p nv12 p010le yuv444p p016le yuv444p16le bgr0 rgb0 cuda | |
#h264_nvenc AVOptions: | |
# -preset <int> E..V..... Set the encoding preset (from 0 to 11) (default medium) | |
# default E..V..... | |
# slow E..V..... hq 2 passes | |
# medium E..V..... hq 1 pass | |
# fast E..V..... hp 1 pass | |
# hp E..V..... | |
# hq E..V..... | |
# bd E..V..... | |
# ll E..V..... low latency | |
# llhq E..V..... low latency hq | |
# llhp E..V..... low latency hp | |
# lossless E..V..... | |
# losslesshp E..V..... | |
# -profile <int> E..V..... Set the encoding profile (from 0 to 3) (default main) | |
# baseline E..V..... | |
# main E..V..... | |
# high E..V..... | |
# high444p E..V..... | |
# -level <int> E..V..... Set the encoding level restriction (from 0 to 51) (default auto) | |
# 4.1 E..V..... | |
# -rc <int> E..V..... Override the preset rate-control (from -1 to INT_MAX) (default -1) | |
# constqp E..V..... Constant QP mode | |
# vbr E..V..... Variable bitrate mode | |
# cbr E..V..... Constant bitrate mode | |
# cbr_ld_hq E..V..... Constant bitrate low delay high quality mode | |
# cbr_hq E..V..... Constant bitrate high quality mode | |
# vbr_hq E..V..... Variable bitrate high quality mode | |
# -rc-lookahead <int> E..V..... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0) | |
# -surfaces <int> E..V..... Number of concurrent surfaces (from 0 to 64) (default 0) | |
# -cbr <boolean> E..V..... Use cbr encoding mode (default false) | |
# -2pass <boolean> E..V..... Use 2pass encoding mode (default auto) | |
# -gpu <int> E..V..... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any) | |
# any E..V..... Pick the first device available | |
# list E..V..... List the available devices | |
# -delay <int> E..V..... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX) | |
# -no-scenecut <boolean> E..V..... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false) | |
# -forced-idr <boolean> E..V..... If forcing keyframes, force them as IDR frames. (default false) | |
# -b_adapt <boolean> E..V..... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true) | |
# -spatial-aq <boolean> E..V..... set to 1 to enable Spatial AQ (default false) | |
# -temporal-aq <boolean> E..V..... set to 1 to enable Temporal AQ (default false) | |
# -zerolatency <boolean> E..V..... Set 1 to indicate zero latency operation (no reordering delay) (default false) | |
# -nonref_p <boolean> E..V..... Set this to 1 to enable automatic insertion of non-reference P-frames (default false) | |
# -strict_gop <boolean> E..V..... Set 1 to minimize GOP-to-GOP rate fluctuations (default false) | |
# -aq-strength <int> E..V..... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8) | |
# -cq <float> E..V..... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0) | |
# -aud <boolean> E..V..... Use access unit delimiters (default false) | |
# -bluray-compat <boolean> E..V..... Bluray compatibility workarounds (default false) | |
# -init_qpP <int> E..V..... Initial QP value for P frame (from -1 to 51) (default -1) | |
# -init_qpB <int> E..V..... Initial QP value for B frame (from -1 to 51) (default -1) | |
# -init_qpI <int> E..V..... Initial QP value for I frame (from -1 to 51) (default -1) | |
# -qp <int> E..V..... Constant quantization parameter rate control method (from -1 to 51) (default -1) | |
# -weighted_pred <int> E..V..... Set 1 to enable weighted prediction (from 0 to 1) (default 0) | |
# -coder <int> E..V..... Coder type (from -1 to 2) (default default) | |
# default E..V..... | |
# auto E..V..... | |
# cabac E..V..... | |
# cavlc E..V..... | |
# ac E..V..... | |
# vlc E..V..... | |
# -b_ref_mode <int> E..V..... Use B frames as references (from 0 to 2) (default disabled) | |
# disabled E..V..... B frames will not be used for reference | |
# each E..V..... Each B frame will be used for reference | |
# middle E..V..... Only (number of B frames)/2 will be used for reference | |
#Decoder mjpeg_cuvid [Nvidia CUVID MJPEG decoder]: | |
# General capabilities: delay avoidprobe hardware | |
# Threading capabilities: none | |
# Supported hardware devices: cuda | |
# Supported pixel formats: cuda nv12 p010le p016le | |
#mjpeg_cuvid AVOptions: | |
# -deint <int> .D.V..... Set deinterlacing mode (from 0 to 2) (default weave) | |
# weave .D.V..... Weave deinterlacing (do nothing) | |
# bob .D.V..... Bob deinterlacing | |
# adaptive .D.V..... Adaptive deinterlacing | |
# -gpu <string> .D.V..... GPU to be used for decoding | |
# -surfaces <int> .D.V..... Maximum surfaces to be used for decoding (from 0 to INT_MAX) (default 25) | |
# -drop_second_field <boolean> .D.V..... Drop second field when deinterlacing (default false) | |
# -crop <string> .D.V..... Crop (top)x(bottom)x(left)x(right) | |
# -resize <string> .D.V..... Resize (width)x(height) | |
# |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment