Last active
April 27, 2024 13:53
-
-
Save vincejv/cfc6d9734894a19bf0bde2cd986def7f to your computer and use it in GitHub Desktop.
MKV Tool Commands for Subs
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
# 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