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"
7072print_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
349360TARGET_BYTES=$(( ($TARGET_MB ) * 1024 * 1024 ))
350361TARGET_BITRATE=$(( $TARGET_BYTES * 8 / $RECORDING_LENGTH ))
351362TARGET_BITRATE_PLUS_SMEAR=$(( $TARGET_BYTES * 8 / $RECORDING_LENGTH_PLUS_SMEAR ))
363+ VIDEO_FORMAT=$_arg_format
352364VNC_PORT=$_arg_vnc
353365# Data dir is used to pass in a pre-downloaded data dir to replay
354366DATA_DIR=$_arg_data_dir
@@ -363,6 +375,12 @@ else
363375 ROUTE_INFO=$( curl --fail https://api.commadotai.com/v1/route/$URL_ROUTE /)
364376fi
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+
366384ROUTE_INFO_GIT_REMOTE=$( echo " $ROUTE_INFO " | jq -r ' .git_remote' )
367385ROUTE_INFO_GIT_BRANCH=$( echo " $ROUTE_INFO " | jq -r ' .git_branch' )
368386ROUTE_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
540558BUFSIZE=$(( $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+
542566if [ " $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
547571elif [ " $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 "
553577elif [ " $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 "
560584else
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