familyfriendlymikey / mpv-cut

An mpv plugin for cutting videos incredibly quickly.
141 stars 10 forks source link

Cut output file bigger in size #30

Closed janskyview closed 3 weeks ago

janskyview commented 1 month ago

I made a cut out of a .mp4 video that totals 1.63G and the output file is a 40GB file. What am I doing wrong?

familyfriendlymikey commented 1 month ago

Did you make a custom action, or are you using the ENCODE action?

janskyview commented 1 month ago

This is my slicing.lua:

local msg = require "mp.msg" local utils = require "mp.utils" local options = require "mp.options"

local cut_pos = nil local copy_audio = true local o = { target_dir = ".", vcodec = "rawvideo", acodec = "pcm_s16le", prevf = "", vf = "format=yuv444p16$hqvf,scale=in_color_matrix=$matrix,format=bgr24", hqvf = "", postvf = "", opts = "", ext = "avi", command_template = [[ ffmpeg -v warning -y -stats -ss $shift -i "$in" -t $duration -c:v $vcodec -c:a $acodec $audio -vf $prevf$vf$postvf $opts "$out.$ext" ]], } options.read_options(o)

function timestamp(duration) local hours = duration / 3600 local minutes = duration % 3600 / 60 local seconds = duration % 60 return string.format("%02d:%02d:%02.03f", hours, minutes, seconds) end

function osd(str) return mp.osd_message(str, 3) end

function get_homedir() -- It would be better to do platform detection instead of fallback but -- it's not that easy in Lua. return os.getenv("HOME") or os.getenv("USERPROFILE") or "" end

function log(str) local logpath = utils.join_path( o.target_dir:gsub("~", get_homedir()), "mpv_slicing.log") f = io.open(logpath, "a") f:write(string.format("# %s\n%s\n", os.date("%Y-%m-%d %H:%M:%S"), str)) f:close() end

function escape(str) -- FIXME(Kagami): This escaping is NOT enough, see e.g. -- https://stackoverflow.com/a/31413730 -- Consider using utils.subprocess instead. return str:gsub("\", "\\"):gsub('"', '\"') end

function trim(str) return str:gsub("^%s+", ""):gsub("%s+$", "") end

function get_csp() local csp = mp.get_property("colormatrix") if csp == "bt.601" then return "bt601" elseif csp == "bt.709" then return "bt709" elseif csp == "smpte-240m" then return "smpte240m" else local err = "Unknown colorspace: " .. csp osd(err) error(err) end end

function get_outname(shift, endpos) local name = mp.getproperty("filename") local dotidx = name:reverse():find(".", 1, true) if dotidx then name = name:sub(1, -dotidx-1) end name = name:gsub(" ", "") name = name:gsub(":", "-") name = name .. string.format(".%s-%s", timestamp(shift), timestamp(endpos)) return name end

function cut(shift, endpos) local cmd = trim(o.command_template:gsub("%s+", " ")) local inpath = escape(utils.join_path( utils.getcwd(), mp.get_property("stream-path"))) local outpath = escape(utils.join_path( o.target_dir:gsub("~", get_homedir()), get_outname(shift, endpos)))

cmd = cmd:gsub("$shift", shift)
cmd = cmd:gsub("$duration", endpos - shift)
cmd = cmd:gsub("$vcodec", o.vcodec)
cmd = cmd:gsub("$acodec", o.acodec)
cmd = cmd:gsub("$audio", copy_audio and "" or "-an")
cmd = cmd:gsub("$prevf", o.prevf)
cmd = cmd:gsub("$vf", o.vf)
cmd = cmd:gsub("$hqvf", o.hqvf)
cmd = cmd:gsub("$postvf", o.postvf)
cmd = cmd:gsub("$matrix", get_csp())
cmd = cmd:gsub("$opts", o.opts)
-- Beware that input/out filename may contain replacing patterns.
cmd = cmd:gsub("$ext", o.ext)
cmd = cmd:gsub("$out", outpath)
cmd = cmd:gsub("$in", inpath, 1)

msg.info(cmd)
log(cmd)
os.execute(cmd)

end

function toggle_mark() local pos = mp.get_property_number("time-pos") if cut_pos then local shift, endpos = cut_pos, pos if shift > endpos then shift, endpos = endpos, shift end if shift == endpos then osd("Cut fragment is empty") else cut_pos = nil osd(string.format("Cut fragment: %s - %s", timestamp(shift), timestamp(endpos))) cut(shift, endpos) end else cut_pos = pos osd(string.format("Marked %s as start position", timestamp(pos))) end end

function toggle_audio() copy_audio = not copy_audio osd("Audio capturing is " .. (copy_audio and "enabled" or "disabled")) end

mp.add_key_binding("c", "slicing_mark", toggle_mark) mp.add_key_binding("a", "slicing_audio", toggle_audio)

Thank you

On 07/10 02:42, Mikey wrote:

Did you make a custom action, or are you using the ENCODE action?

-- Reply to this email directly or view it on GitHub: https://github.com/familyfriendlymikey/mpv-cut/issues/30#issuecomment-2396428710 You are receiving this because you authored the thread.

Message ID: @.***>

familyfriendlymikey commented 1 month ago

Seems like you're not using my script

familyfriendlymikey commented 1 month ago

If it's your own script, just try printing out the final ffmpeg command and then running that manually.