Run it
Copy the script and paste it into your executor.
targetFPS =
uiWidth, uiHeight = ,
playerRoot =
framesSub = playerRoot ..
copiedGifName = playerRoot ..
maxAutoFrames =
tryAutoFFmpeg =
CoreGui = :()
RunService = :()
(fn) (fn) ==
(p) (isfile) ok,res = (isfile,p) ok res
(p) (readfile) ok,res = (readfile,p) ok res
(p,d) (writefile) ok,res = (writefile,p,d) ok
(p) (isfolder) ok,res = (isfolder,p) ok res
(p) (makefolder) (makefolder,p)
screen = .()
screen.Name =
screen.ResetOnSpawn =
screen.Parent = CoreGui
main = .(, screen)
main.Size = .(, uiWidth, , uiHeight)
main.Position = .(, , , )
main.BackgroundColor3 = .(,,)
main.BorderSizePixel =
mainCorner = .(, main)
mainCorner.CornerRadius = .(,)
title = .(, main)
title.Size = .(, , , )
title.Position = .(,,,)
title.BackgroundTransparency =
title.Text =
title.TextColor3 = .(,,)
title.Font = .Font.SourceSansBold
title.TextSize =
titleCorner = .(, title)
titleCorner.CornerRadius = .(,)
input = .(, main)
input.Size = .(, -, , )
input.Position = .(, , , )
input.PlaceholderText =
input.Text =
input.ClearTextOnFocus =
input.Font = .Font.SourceSans
input.TextSize =
input.BackgroundColor3 = .(,,)
input.TextColor3 = .(,,)
input.BorderSizePixel =
inputCorner = .(, input)
inputCorner.CornerRadius = .(,)
btn = .(, main)
btn.Size = .(, , , )
btn.Position = .(, , , )
btn.Text =
btn.Font = .Font.SourceSansSemibold
btn.TextSize =
btn.BackgroundColor3 = .(,,)
btn.TextColor3 = .(,,)
btn.BorderSizePixel =
btnCorner = .(, btn)
btnCorner.CornerRadius = .(,)
playBtn = .(, main)
playBtn.Size = .(, , , )
playBtn.Position = .(, , , )
playBtn.Text =
playBtn.Font = .Font.SourceSansSemibold
playBtn.TextSize =
playBtn.BackgroundColor3 = .(,,)
playBtn.TextColor3 = .(,,)
playBtn.BorderSizePixel =
playCorner = .(, playBtn)
playCorner.CornerRadius = .(,)
stopBtn = .(, main)
stopBtn.Size = .(, , , )
stopBtn.Position = .(, , , )
stopBtn.Text =
stopBtn.Font = .Font.SourceSansSemibold
stopBtn.TextSize =
stopBtn.BackgroundColor3 = .(,,)
stopBtn.TextColor3 = .(,,)
stopBtn.BorderSizePixel =
stopCorner = .(, stopBtn)
stopCorner.CornerRadius = .(,)
status = .(, main)
status.Size = .(, -, , )
status.Position = .(, , , )
status.TextWrapped =
status.BackgroundTransparency =
status.BackgroundColor3 = .(,,)
status.TextColor3 = .(,,)
status.Font = .Font.SourceSans
status.TextSize =
status.Text =
statusCorner = .(, status)
statusCorner.CornerRadius = .(,)
img = .(, screen)
squareSize = .(, .(, .(.(.CurrentCamera.ViewportSize.X, .CurrentCamera.ViewportSize.Y) * )))
img.Size = .(, squareSize, , squareSize)
img.Position = .(, -squareSize/, , -squareSize/)
img.BackgroundTransparency =
img.ScaleType = .ScaleType.Fit
img.Image =
imgCorner = .(, img)
imgCorner.CornerRadius = .(,)
(gifPath, outFolder, fps, w, h)
cmd = .(, gifPath, fps, w, h, outFolder)
(outFolder) (outFolder)
() == (.execute) ==
ok, res = (() .(cmd) )
ok
, .. outFolder ..
, .. cmd
,
(folder)
list = {}
framesTxtPath = folder ..
(framesTxtPath)
content = (framesTxtPath)
content
line content:()
line = line:()
line ~= .(list, line)
list
i = , maxAutoFrames
png = .(, folder, i)
jpg = .(, folder, i)
(png)
.(list, png)
(jpg)
.(list, jpg)
i ==
list
playing =
stopRequested =
playbackThread
()
playing =
stopRequested =
playbackThread
playbackThread:()
playbackThread =
(frames, fps)
frames #frames ==
status.Text =
playing =
stopRequested =
= / (fps targetFPS)
playbackThread
playbackThread:()
playbackThread =
playbackThread = RunService.Heartbeat:((dt) )
(()
playing stopRequested
i = , #frames
stopRequested
src = frames[i]
ok = (() img.Image = src )
ok
(() img.Image = .. src )
t0 = ()
() - t0 <
stopRequested
()
playing stopRequested
playing =
stopRequested =
)
(filename)
filename filename:()
status.Text =
status.Text =
(playerRoot) (playerRoot)
(framesSub) (framesSub)
given = filename
found =
sourcePath =
(given)
found =
sourcePath = given
tryList = { given, .. given, .. given }
_,p (tryList)
(p)
found =
sourcePath = p
found
status.Text =
status.Text =
data = (sourcePath)
data
status.Text =
ok = (copiedGifName, data)
ok
status.Text =
status.Text =
tryAutoFFmpeg
status.Text =
okff, msg = (copiedGifName, framesSub, targetFPS, squareSize, squareSize)
okff
status.Text =
()
status.Text = .. copiedGifName .. .. targetFPS .. .. squareSize .. .. squareSize .. .. framesSub .. .. framesSub
()
frames = (framesSub)
#frames ==
status.Text = .. framesSub
status.Text = .. (#frames) ..
()
img.Image = frames[]
(frames, targetFPS)
btn.MouseButton1Click:(() (input.Text) )
input.FocusLost:((enterPressed) enterPressed (input.Text) )
playBtn.MouseButton1Click:(()
playing
frames = (framesSub)
#frames ==
status.Text =
(frames, targetFPS)
)
stopBtn.MouseButton1Click:(() () status.Text = )
(readfile)
status.Text =
Gif player (open source) How it works: Download a gif from tenor Put the gif inside your executors folder and put the gif name Click play And the gif will be played in 1:1 ratio. Idk if this is working or not

Universal