Skip to content

Commit 3edc1ec

Browse files
committed
Add support for specifying video format in clip.sh between H264/HEVC
1 parent e23651c commit 3edc1ec

File tree

1 file changed

+28
-4
lines changed

1 file changed

+28
-4
lines changed

clip.sh

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
# ARG_OPTIONAL_SINGLE([start-seconds],[s],[Seconds to start at],[60])
66
# ARG_OPTIONAL_SINGLE([length-seconds],[l],[Clip length],[30])
77
# ARG_OPTIONAL_SINGLE([target-mb],[m],[Target converted file size in MB],[50])
8+
# ARG_OPTIONAL_SINGLE([format],[],[h264 or hevc],[h264])
89
# ARG_OPTIONAL_SINGLE([jwt-token],[j],[JWT Auth token to use (get token from https://jwt.comma.ai)])
910
# ARG_OPTIONAL_SINGLE([smear-amount],[],[Amount of seconds to smear the clip start by before recording starts],[3])
1011
# ARG_OPTIONAL_SINGLE([ntfysh],[n],[ntfy.sh topic to post to when clip has completed rendering])
@@ -51,6 +52,7 @@ _positionals=()
5152
_arg_start_seconds="60"
5253
_arg_length_seconds="30"
5354
_arg_target_mb="50"
55+
_arg_format="h264"
5456
_arg_jwt_token=
5557
_arg_smear_amount="3"
5658
_arg_ntfysh=
@@ -70,11 +72,12 @@ _arg_nv_direct_encoding="off"
7072
print_help()
7173
{
7274
printf '%s\n' "See README at https://github.com/nelsonjchen/op-replay-clipper/"
73-
printf 'Usage: %s [-s|--start-seconds <arg>] [-l|--length-seconds <arg>] [-m|--target-mb <arg>] [-j|--jwt-token <arg>] [--smear-amount <arg>] [-n|--ntfysh <arg>] [--data-dir <arg>] [-r|--speedhack-ratio <arg>] [-c|--video-cwd <arg>] [--vnc <arg>] [-o|--output <arg>] [--(no-)metric] [--(no-)hidden-dongle-id] [--(no-)nv-hardware-rendering] [--(no-)nv-hybrid-encoding] [--(no-)nv-fast-encoding] [--(no-)nv-direct-encoding] [-h|--help] <route_id>\n' "$0"
75+
printf 'Usage: %s [-s|--start-seconds <arg>] [-l|--length-seconds <arg>] [-m|--target-mb <arg>] [--format <arg>] [-j|--jwt-token <arg>] [--smear-amount <arg>] [-n|--ntfysh <arg>] [--data-dir <arg>] [-r|--speedhack-ratio <arg>] [-c|--video-cwd <arg>] [--vnc <arg>] [-o|--output <arg>] [--(no-)metric] [--(no-)hidden-dongle-id] [--(no-)nv-hardware-rendering] [--(no-)nv-hybrid-encoding] [--(no-)nv-fast-encoding] [--(no-)nv-direct-encoding] [-h|--help] <route_id>\n' "$0"
7476
printf '\t%s\n' "<route_id>: comma connect route id, segment id is ignored (hint, put this in quotes otherwise your shell might misinterpret the pipe) "
7577
printf '\t%s\n' "-s, --start-seconds: Seconds to start at (default: '60')"
7678
printf '\t%s\n' "-l, --length-seconds: Clip length (default: '30')"
7779
printf '\t%s\n' "-m, --target-mb: Target converted file size in MB (default: '50')"
80+
printf '\t%s\n' "--format: h264 or hevc (default: 'h264')"
7881
printf '\t%s\n' "-j, --jwt-token: JWT Auth token to use (get token from https://jwt.comma.ai) (no default)"
7982
printf '\t%s\n' "--smear-amount: Amount of seconds to smear the clip start by before recording starts (default: '3')"
8083
printf '\t%s\n' "-n, --ntfysh: ntfy.sh topic to post to when clip has completed rendering (no default)"
@@ -133,6 +136,14 @@ parse_commandline()
133136
-m*)
134137
_arg_target_mb="${_key##-m}"
135138
;;
139+
--format)
140+
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
141+
_arg_format="$2"
142+
shift
143+
;;
144+
--format=*)
145+
_arg_format="${_key##--format=}"
146+
;;
136147
-j|--jwt-token)
137148
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
138149
_arg_jwt_token="$2"
@@ -349,6 +360,7 @@ TARGET_MB=$_arg_target_mb
349360
TARGET_BYTES=$((($TARGET_MB) * 1024 * 1024))
350361
TARGET_BITRATE=$(($TARGET_BYTES * 8 / $RECORDING_LENGTH))
351362
TARGET_BITRATE_PLUS_SMEAR=$(($TARGET_BYTES * 8 / $RECORDING_LENGTH_PLUS_SMEAR))
363+
VIDEO_FORMAT=$_arg_format
352364
VNC_PORT=$_arg_vnc
353365
# Data dir is used to pass in a pre-downloaded data dir to replay
354366
DATA_DIR=$_arg_data_dir
@@ -363,6 +375,12 @@ else
363375
ROUTE_INFO=$(curl --fail https://api.commadotai.com/v1/route/$URL_ROUTE/)
364376
fi
365377

378+
# Check if format is valid
379+
if [ "$VIDEO_FORMAT" != "h264" ] && [ "$VIDEO_FORMAT" != "hevc" ]; then
380+
echo "Invalid format $VIDEO_FORMAT. Must be h264 or hevc."
381+
exit 1
382+
fi
383+
366384
ROUTE_INFO_GIT_REMOTE=$(echo "$ROUTE_INFO" | jq -r '.git_remote')
367385
ROUTE_INFO_GIT_BRANCH=$(echo "$ROUTE_INFO" | jq -r '.git_branch')
368386
ROUTE_INFO_GIT_COMMIT=$(echo "$ROUTE_INFO" | jq -r '.git_commit' | cut -c1-8)
@@ -539,15 +557,21 @@ DRAW_TEXT_FILTER="drawtext=textfile=/tmp/overlay.txt:reload=1:fontcolor=white:fo
539557

540558
BUFSIZE=$(($TARGET_BITRATE * 2))
541559

560+
# Set vcodec to hevc if format is hevc
561+
VCODEC="h264_nvenc"
562+
if [ "$VIDEO_FORMAT" = "hevc" ]; then
563+
VCODEC="hevc_nvenc"
564+
fi
565+
542566
if [ "$NVIDIA_DIRECT_ENCODING" = "on" ]; then
543567
# Directly encode with nvidia hardware to the target file
544568
# Good for setups where the video renders fast.
545-
eatmydata ffmpeg -framerate "$RECORD_FRAMERATE" -video_size 1920x1080 -f x11grab -draw_mouse 0 -i :0.0 -ss "$SMEAR_AMOUNT" -vcodec h264_nvenc -preset llhp -b:v "$TARGET_BITRATE" -maxrate "$TARGET_BITRATE" -bufsize "$BUFSIZE" -r 20 -filter:v "setpts=$SPEEDHACK_AMOUNT*PTS,scale=1920:1080,$DRAW_TEXT_FILTER" -y -t "$RECORDING_LENGTH" "$VIDEO_OUTPUT"
569+
eatmydata ffmpeg -framerate "$RECORD_FRAMERATE" -video_size 1920x1080 -f x11grab -draw_mouse 0 -i :0.0 -ss "$SMEAR_AMOUNT" -vcodec $VCODEC -b:v "$TARGET_BITRATE" -maxrate "$TARGET_BITRATE" -bufsize "$BUFSIZE" -r 20 -filter:v "setpts=$SPEEDHACK_AMOUNT*PTS,scale=1920:1080,$DRAW_TEXT_FILTER" -y -t "$RECORDING_LENGTH" "$VIDEO_OUTPUT"
546570
cleanup
547571
elif [ "$NVIDIA_HYBRID_ENCODING" = "on" ]; then
548572
# Directly encode with nvidia hardware to the target file with the smear amount also recorded.
549573
# Then lop it off with copy mode.
550-
eatmydata ffmpeg -framerate "$RECORD_FRAMERATE" -video_size 1920x1080 -f x11grab -draw_mouse 0 -i :0.0 -vcodec h264_nvenc -preset llhp -b:v "$TARGET_BITRATE" -maxrate "$TARGET_BITRATE" -bufsize "$BUFSIZE" -g 20 -r 20 -filter:v "setpts=$SPEEDHACK_AMOUNT*PTS,scale=1920:1080,$DRAW_TEXT_FILTER" -y -t "$RECORDING_LENGTH_PLUS_SMEAR" "$VIDEO_RAW_OUTPUT"
574+
eatmydata ffmpeg -framerate "$RECORD_FRAMERATE" -video_size 1920x1080 -f x11grab -draw_mouse 0 -i :0.0 -vcodec $VCODEC -b:v "$TARGET_BITRATE" -maxrate "$TARGET_BITRATE" -bufsize "$BUFSIZE" -g 20 -r 20 -filter:v "setpts=$SPEEDHACK_AMOUNT*PTS,scale=1920:1080,$DRAW_TEXT_FILTER" -y -t "$RECORDING_LENGTH_PLUS_SMEAR" "$VIDEO_RAW_OUTPUT"
551575
cleanup
552576
ffmpeg -y -ss "$SMEAR_AMOUNT" -i "$VIDEO_RAW_OUTPUT" -vcodec copy -movflags +faststart -f MP4 "$VIDEO_OUTPUT"
553577
elif [ "$NVIDIA_FAST_ENCODING" = "on" ]; then
@@ -556,7 +580,7 @@ elif [ "$NVIDIA_FAST_ENCODING" = "on" ]; then
556580
ffmpeg -framerate "$RECORD_FRAMERATE" -video_size 1920x1080 -f x11grab -draw_mouse 0 -i :0.0 -vcodec libx264rgb -crf 0 -preset ultrafast -r 20 -filter:v "setpts=$SPEEDHACK_AMOUNT*PTS,scale=1920:1080,$DRAW_TEXT_FILTER" -y -t "$RECORDING_LENGTH_PLUS_SMEAR" "$VIDEO_RAW_OUTPUT"
557581
# The setup is no longer needed. Just transcode now.
558582
cleanup
559-
ffmpeg -hwaccel auto -i "$VIDEO_RAW_OUTPUT" -ss "$SMEAR_AMOUNT" -c:v h264_nvenc -b:v "$TARGET_BITRATE" -y -pix_fmt yuv420p -movflags +faststart -f MP4 "$VIDEO_OUTPUT"
583+
ffmpeg -hwaccel auto -i "$VIDEO_RAW_OUTPUT" -ss "$SMEAR_AMOUNT" -c:v $VCODEC -b:v "$TARGET_BITRATE" -y -pix_fmt yuv420p -movflags +faststart -f MP4 "$VIDEO_OUTPUT"
560584
else
561585
# Complete CPU rendering
562586
ffmpeg -framerate "$RECORD_FRAMERATE" -video_size 1920x1080 -f x11grab -draw_mouse 0 -i :0.0 -vcodec libx264rgb -crf 0 -preset ultrafast -r 20 -filter:v "setpts=$SPEEDHACK_AMOUNT*PTS,scale=1920:1080,$DRAW_TEXT_FILTER" -y -t "$RECORDING_LENGTH_PLUS_SMEAR" "$VIDEO_RAW_OUTPUT"

0 commit comments

Comments
 (0)