Skip to content

Instantly share code, notes, and snippets.

@ikanoano
Last active October 26, 2019 17:58
Show Gist options
  • Save ikanoano/e276413c23a33164cca2363d4f9942ed to your computer and use it in GitHub Desktop.
Save ikanoano/e276413c23a33164cca2363d4f9942ed to your computer and use it in GitHub Desktop.
#!/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