Skip to content

Instantly share code, notes, and snippets.

@vincejv
Last active April 27, 2024 13:53
Show Gist options
  • Save vincejv/cfc6d9734894a19bf0bde2cd986def7f to your computer and use it in GitHub Desktop.
Save vincejv/cfc6d9734894a19bf0bde2cd986def7f to your computer and use it in GitHub Desktop.
MKV Tool Commands for Subs
# Change title and audio track languaage
mkvpropedit --edit info --set "title=The movie" --edit track:a1 --set language=tl input.mkv
# Rename track title
mkvpropedit *.mkv -e track:a1 -s name="Surround"
# Add encoding settings
for i in *.mkv; do mkvpropedit "$i" --tags track:v1:tags.xml; done
# Copy from public to uploads folder
for i in *.mkv; do mkdir "/data/torrents/uploads/${i%.*}"; done
for i in *.mkv; do mv "$i" "/data/torrents/uploads/${i%.*}"; done
# Merge subs
mkvmerge -o output.mkv input.mkv --language 0:eng --track-name 0:English subs.srt
# Merge subs but not make it default
mkvmerge -o output.mkv input.mkv --language 0:eng --track-name 0:English subs.srt --default-track-flag 0:no
# Change default track
mkvpropedit "${file}" --edit track:2 --set flag-default=0
mkvpropedit "${file}" --edit track:3 --set flag-default=1
# more: https://www.reddit.com/r/mkvtoolnix/comments/qqgc41/set_default_track_without_specifying_defaulttrack/
# Delay subs
# itsoffset format
# 120 120 seconds
# 120.2 120.2 seconds or 120 seconds 200 miliseconds
# 1200ms 1200 milliseconds
# 1300us 1300 microseconds
ffmpeg -itsoffset 2 -i subtitles.srt -c copy subtitles_delayed.srt
# --service IWT -pr -st -g NOGRP
# Proper encode
ffmpeg -i input.mkv -b:v 5M -crf 18 -c:a copy output.mkv
# Encode to HEVC/AAC
ffmpeg -i input.mkv -c:v libx265 -c:a aac -tag:v hvc1 -crf 20 -preset medium out.mkv
# NuBz v2 encode
for i in *.mkv; do ffmpeg -y -i "$i" -map 0 -c:a copy -c:s copy -pix_fmt yuv420p10le -c:v libx265 -tag:v hvc1 -crf 22 -preset slow "/home/vince/encodes/${i%.*}.mkv"; done
# via docker
for i in /data/full/path/*.mkv; do j="${i%.*}" && k=$(echo $(basename $j)) && ffmpeg -y -i "$i" -map 0 -c:a copy -c:s copy -pix_fmt yuv420p10le -c:v libx265 -tag:v hvc1 -crf 22 -preset slow "/config/${k}.mkv"; done
# NuBz v2 fast encode no rect, no amp
for i in *.mkv; do ffmpeg -y -i "$i" -map 0 -c:a copy -c:s copy -pix_fmt yuv420p10le -c:v libx265 -tag:v hvc1 -crf 22 -x265-params "rect=0:amp=0:sao=0:mcstf=0:sbrc=0:eob=0:eos=0:open-gop=0:min-keyint=24:keyint=240:ctu=32:strong-intra-smoothing=0:merange=25:psy-rd=1.00:psy-rdoq=2.00:cbqpoffs=-1:crqpoffs=-1:aq-mode=1:deblock=-3\:-3" -preset slow "/home/vince/encodes/${i%.*}.mkv"; done
# via docker
for i in /data/full/path/*.mkv; do j="${i%.*}" && k=$(echo $(basename $j)) && ffmpeg -y -i "$i" -map 0 -c:a copy -c:s copy -pix_fmt yuv420p10le -c:v libx265 -tag:v hvc1 -crf 22 -x265-params "rect=0:amp=0:sao=0:mcstf=0:sbrc=0:eob=0:eos=0:open-gop=0:min-keyint=24:keyint=240:ctu=32:strong-intra-smoothing=0:merange=25:psy-rd=1.00:psy-rdoq=2.00:cbqpoffs=-1:crqpoffs=-1:aq-mode=1:deblock=-3\:-3" -preset slow "/config/${k}.mkv"; done
# NuBz v2 slow encode but HQ encode
for i in *.mkv; do ffmpeg -y -i "$i" -map 0 -c:a copy -c:s copy -pix_fmt yuv420p10le -c:v libx265 -tag:v hvc1 -crf 22 -x265-params "rect=0:amp=0:open-gop=0:cutree=0:rskip=0:ctu=64:min-cu-size=8:rdoq-level=2:max-merge=5:rc-lookahead=60:ref=4:bframes=16:rd=3:subme=5:merange=57:high-tier=1:range=limited:aud=1:repeat-headers=1" -preset slow "/home/vince/encodes/${i%.*}.mkv"; done
# via docker
for i in /data/full/path/*.mkv; do j="${i%.*}" && k=$(echo $(basename $j)) && ffmpeg -y -i "$i" -map 0 -c:a copy -c:s copy -pix_fmt yuv420p10le -c:v libx265 -tag:v hvc1 -crf 22 -x265-params "rect=0:amp=0:open-gop=0:cutree=0:rskip=0:ctu=64:min-cu-size=8:rdoq-level=2:max-merge=5:rc-lookahead=60:ref=4:bframes=16:rd=3:subme=5:merange=57:high-tier=1:range=limited:aud=1:repeat-headers=1" -preset slow "/config/${k}.mkv"; done
# Scale down from 4k to 1080p with NuBz v2 encode
for i in *.mkv; do ffmpeg -i "$i" -map 0 -c:a copy -c:s copy -vf "scale=-2:1080:flags=lanczos" -sws_flags lanczos+print_info -pix_fmt yuv420p10le -c:v libx265 -tag:v hvc1 -crf 22 -preset slow "${i%.*}.1080p.mkv"; done
# via docker
for i in /data/full/path/*.mkv; do j="${i%.*}" && k=$(echo $(basename $j)) && ffmpeg -y -i "$i" -map 0 -c:a copy -c:s copy -vf "scale=-2:1080:flags=lanczos" -sws_flags lanczos+print_info -pix_fmt yuv420p10le -c:v libx265 -tag:v hvc1 -crf 22 -preset slow "/config/${k}.mkv"; done
# Restore other tracks
for i in *.mkv; do ffmpeg -i "/data/input/${i%.*}.mkv" -i "$i" -map_metadata 0 -map 1:v -map 0:a -c copy -map 0:s ${i%.*}-NuBz.mkv; done
# Restore original subs
# Input 0: Source | Input 1: Encode
for i in *.mkv; do ffmpeg -i "/data/original/${i%.*}.mkv" -i "$i" -map_metadata 1 -map 1:v -map 1:a -c copy -map 0:s ${i%.*}-NuBz.mkv; done
# SRT to ass deliberately
for i in *.mkv; ffmpeg -i "/data/original/${i%.*}.mkv" -i "$i" -map_metadata 1 -map 1:v -map 1:a -c copy -map 0:s -c:s ass ${i%.*}-NuBz.mkv; done
# Post-process
for i in *.mkv; do sd mkvpropedit --add-track-statistics-tags "$i"; done
for i in *.mkv; do sd mkvpropedit "$i" --chapters ""; done
# Convert the first audio track to eac3
ffmpeg -i input.mkv -map_metadata 0 -map 0:v -map 0:a -map 0:s -c:v copy -c:a copy -c:s copy -c:a:0 ac3 encoded.mkv
# Opus 5.1
ffmpeg -i input.mkv -map_metadata 0 -map 0:v -map 0:a -map 0:s -c:v copy -c:a copy -c:s copy -c:a:0 libopus -ac 6 -b:a 256k encoded.mkv
# Keep the second audio track
# first, get audio track info so we know which one to keep
mkvmerge -i input.mkv
#File 'input.mkv': container: Matroska
#Track ID 1: video (V_MPEG4/ISO/AVC)
#Track ID 2: audio (A_AAC)
#Track ID 3: audio (A_AAC) <----------- for example, let's keep this one
#Track ID 4: audio (A_AAC)
mkvmerge -o output.mkv --audio-tracks 3 input.mkv
# Extract audio
ffmpeg -i input.mkv -vn -acodec copy out_aud.aac
# Extract subs
mkvextract tracks input.mkv 0:out_subs.srt
# Merge track
mkvmerge -o out.mkv --language 0:ja input.mkv --language 0:eng --track-name "1:English" out_aud.aac
# Extract MKV Track
mkvextract input.mkv tracks 3:out_3.aac
# Keep MKV track 0,1,2
mkvmerge -o out.mkv -a 0,1,2 input.mkv
# Batch edit
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
# Batch Merge audio
for i in *.mkv; do mkvmerge -o "${i%.*}_out.mkv" --language 0:ja "$i" --language 0:eng --track-name "1:English" "${i%.*}.aac"; done
# Batch upload using l4g
for i in *; do uass "$i" -pr -ua --category tv -tmdb 539 --year 2004 -tk OE; done
# Hard sub
ffmpeg -i video.mkv -vf subtitles=video.mkv:si=0 out.mp4 -preset ultrafast
# crop border (detect then process)
ffmpeg -ss 90 -i input.mkv -vframes 10 -vf cropdetect -f null -
ffmpeg -i input.mp4 -vf crop=1280:720:0:0 -c:a copy output.mp4
# crop and hard sub (sample and actual)
ffmpeg -i video.mkv -ss 0 -t 30 -vf "subtitles=video.mkv:si=0,crop=1920:816:0:132" -preset ultrafast out.mp4
ffmpeg -i video3.mkv -vf "crop=1920:816:0:132,subtitles=video3.mkv:si=0" -ac 2 -movflags +faststart -preset ultrafast out3.mp4
for i in *.mkv; do ffmpeg -i "$i" -vf "crop=1920:864:0:108,subtitles="$i":si=0" -ac 2 -movflags +faststart -preset veryfast "${i%.*}.mp4"; done
for i in /data/full/path/*.mkv; do j="${i%.*}" && k=$(echo $(basename $j)) && ffmpeg -y -i "$i" -vf "crop=1920:864:0:108,subtitles="$i":si=0" -ac 2 -movflags +faststart -preset veryfast "/config/${k}.mkv"; done
# screenshot
ffmpeg -ss 01:23:45 -i input.mkv -frames:v 1 -q:v 2 output.jpg
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment