43 Commits

Author SHA1 Message Date
Akash Bora
8916a44d19 Update VERSION.txt 2025-11-13 18:09:31 +05:30
Akash Bora
070fe14d94 Update VERSIONPY.txt 2025-08-09 15:52:51 +05:30
Akash Bora
20fbf397f7 Update VERSION.txt 2025-05-03 12:48:35 +05:30
Akash Bora
9096f52501 Update VERSIONPY.txt 2024-10-14 20:06:06 +05:30
Akash Bora
822f07bd00 Update VERSION.txt 2024-10-10 13:25:04 +05:30
Akash Bora
bafbc227e7 Update VERSION.txt 2024-06-15 18:07:52 +05:30
Akash Bora
f2a5469d2a Update VERSIONPY.txt 2024-02-04 20:19:10 +05:30
Akash Bora
0c235845c9 Update VERSION.txt 2024-02-04 20:19:01 +05:30
Akash Bora
ab0c01a0cb Update VERSION.txt
October Update
2023-10-19 13:31:20 +05:30
Akash Bora
a3d048c551 Update VERSIONPY.txt 2023-07-19 20:50:07 +05:30
Akash Bora
fad00fb691 Update VERSIONPY.txt 2023-06-28 20:54:23 +05:30
Akash Bora
42dcda6b6a Update VERSION.txt 2023-06-28 20:53:37 +05:30
Akash Bora
b67d78d4c4 Update VERSIONPY.txt 2023-04-30 22:42:26 +05:30
Akash Bora
aaa962cccd Update VERSION.txt 2023-04-30 16:14:53 +05:30
Akash Bora
dccddad32e Update VERSIONPY.txt 2022-12-09 21:46:09 +05:30
Akash Bora
e13b90de9a Update VERSION.txt 2022-12-09 16:31:25 +05:30
Akash Bora
705f1a13e4 Create VERSIONPY.txt 2022-12-01 10:57:41 +05:30
Akash Bora
f3d02d2103 Delete VERSIONPY.txt 2022-12-01 10:55:47 +05:30
Akash Bora
3cd6463673 Update VERSIONPY.txt 2022-12-01 10:55:25 +05:30
Akash Bora
a547d55e40 Update VERSIONPY.txt 2022-12-01 10:51:48 +05:30
Akash Bora
be3fe7eca0 Update VERSION.txt 2022-08-15 14:26:24 +05:30
Akash Bora
da99f290a1 Update VERSION.txt 2022-07-18 14:48:58 +05:30
Akash Bora
b92d8aa466 Update README.md 2022-07-13 19:37:00 +05:30
Akash Bora
f037ed9c62 Create VERSIONPY.txt 2022-07-13 19:36:40 +05:30
Akash Bora
1c7ad79020 Update README.md 2022-06-19 13:32:16 +05:30
Akash Bora
31c7ec72a6 Update VERSION.txt 2022-06-17 13:41:20 +05:30
Akash Bora
99fbf7a570 Update VERSION.txt 2022-06-17 13:41:05 +05:30
Akash Bora
fb1eb5d11b Update VERSION.txt 2022-06-17 12:52:47 +05:30
Akash Bora
5e25dea5cd Update VERSION.txt 2022-06-17 12:52:10 +05:30
Akash Bora
8c6ed2151f Add files via upload 2022-06-17 12:28:57 +05:30
Akash Bora
e00fffc154 Update README.md 2022-06-17 12:27:42 +05:30
Akash Bora
6fc5ec0459 Update README.md 2022-06-17 12:27:06 +05:30
Akash Bora
b8afc1e227 Create README.md 2022-06-17 12:26:39 +05:30
Akash Bora
6915092e08 Delete Readme.md 2022-06-17 12:25:55 +05:30
Akash Bora
6e2130c294 Delete LICENSE 2022-06-17 12:25:28 +05:30
Akash Bora
eaa5267462 Delete Python Version directory 2022-06-17 12:25:18 +05:30
Akash Bora
fa93ff8308 Update Readme.md 2022-05-17 19:21:29 +05:30
Akash Bora
18f485150f Update Readme.md 2022-05-17 19:21:20 +05:30
Akash Bora
49b5d45195 Update Readme.md 2022-05-17 19:20:45 +05:30
Akash Bora
b483724612 Update LICENSE 2022-05-15 12:34:32 +05:30
Akascape
a569e3bac9 Update Readme.md 2021-10-30 22:28:10 +05:30
Akascape
879dec1337 Update ReadmeforPython.txt 2021-10-30 22:27:19 +05:30
Akascape
abb1b4bff8 Update ReadmeforPython.txt 2021-10-30 22:26:54 +05:30
10 changed files with 3 additions and 483 deletions

21
LICENSE
View File

@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2021 Akascape
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,414 +0,0 @@
import os
from tkinter import *
from tkinter import ttk, messagebox, filedialog
import tkinter
import sys
import imageio
import random
import re
import struct
import time
import webbrowser
from itertools import chain, repeat
def resource_path0(relative_path):
base_path = getattr(
sys,
'_MEIPASS',
os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base_path, relative_path)
def openfile():
global file
file=tkinter.filedialog.askopenfilename(filetypes =[('MP4', '*.mp4'),('AVI', '*.avi'),('GIF','*.gif'),('MOV','*.mov')])
if(len(file)>1):
LocationError.config(text=file, fg="green")
OpeningFile['text']='Open Again'
OpeningFile['bg']='#D0CECE'
else:
LocationError.config(text="Choose Video To Datamosh", fg="red")
OpeningFile['text']='OPEN'
OpeningFile['bg']='#82CC6C'
def convert(inputpath,targetformat):
global outputpath
try:
Wait.config(text="Converting the Video...", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15))
root.update()
outputpath=os.path.splitext(inputpath)[0]+'_datamoshed'+targetformat
reader=imageio.get_reader(inputpath)
fps=reader.get_meta_data()['fps']
writer= imageio.get_writer(outputpath, fps=fps)
for frames in reader:
writer.append_data(frames)
#print(f'Frame {frames}')
#print("Converted")
writer.close()
try:
Datamosh(outputpath)
except:
pass
except Exception:
messagebox.showerror("FAILED","The video file or the input data have \n some issues!")
Wait.place_forget()
os.remove(outputpath)
datamoshbtn['state']=NORMAL
def Step1():
try:
if (len(file)>=1):
Wait.place(relx=0.5,rely=0.85,anchor='center')
root.update()
extension=os.path.splitext(file)[1]
datamoshbtn['state']=DISABLED
datamoshbtn['cursor']='watch'
if extension==".avi":
Datamosh(file)
else:
targetformat=".avi"
convert(file,targetformat)
else:
messagebox.showerror("OOPS","Please choose the video again!")
except:
messagebox.showerror("OOPS","Please choose the video!")
datamoshbtn['state']=NORMAL
datamoshbtn['cursor']=''
def Datamosh(Inputfile):
if os.path.splitext(outputpath)[1]==".avi":
filein = Inputfile
countframes = int(Countframe.get())
positframes = int(Positframe.get())
firstframe = int(firstframes.get())
choice = modechoices.get()
kill = float(killframe.get())
if(choice==modes[0]):
mode="bloom"
elif(choice==modes[1]):
mode="invert"
elif(choice==modes[2]):
mode="jiggle"
elif(choice==modes[3]):
mode="overlap"
elif(choice==modes[4]):
mode="pulse"
elif(choice==modes[5]):
mode="reverse"
elif(choice==modes[6]):
mode="random"
else:
messagebox.showerror("OOPS","Please Select the Correct Mode!")
os.remove(outputpath)
os.kill(Datamosh())
Wait.place_forget()
datamoshbtn['state']=NORMAL
datamoshbtn['cursor']=''
if filein is None or os.path.exists(filein) == False:
messagebox.showerror("ERROR","Input File is Missing!")
Wait.place_forget()
os.remove(outputpath)
datamoshbtn['state']=NORMAL
os.kill(Datamosh())
datamoshbtn['cursor']=''
#define temp directory and files
temp_nb = random.randint(10000, 99999)
temp_dir = "temp-" + str(temp_nb)
temp_hdrl = temp_dir +"/hdrl.bin"
temp_movi = temp_dir +"/movi.bin"
temp_idx1 = temp_dir +"/idx1.bin"
os.mkdir(temp_dir)
#Define constrain function for jiggle :3
def constrain(val, min_val, max_val):
return min(max_val, max(min_val, val))
def bstream_until_marker(bfilein, bfileout, marker=0, startpos=0):
chunk = 1024
filesize = os.path.getsize(bfilein)
if marker :
marker = str.encode(marker)
with open(bfilein,'rb') as rd:
with open(bfileout,'ab') as wr:
for pos in range(startpos, filesize, chunk):
rd.seek(pos)
buffer = rd.read(chunk)
if marker:
if buffer.find(marker) > 0 :
marker_pos = re.search(marker, buffer).start() # position is relative to buffer glitchedframes
marker_pos = marker_pos + pos # position should be absolute now
split = buffer.split(marker, 1)
wr.write(split[0])
return marker_pos
else:
wr.write(buffer)
else:
wr.write(buffer)
#make 3 files, 1 for each chunk
movi_marker_pos = bstream_until_marker(filein, temp_hdrl, "movi")
idx1_marker_pos = bstream_until_marker(filein, temp_movi, "idx1", movi_marker_pos)
bstream_until_marker(filein, temp_idx1, 0, idx1_marker_pos)
with open(temp_movi,'rb') as rd:
chunk = 1024
filesize = os.path.getsize(temp_movi)
frame_table = []
for pos in range(0, filesize, chunk):
rd.seek(pos)
buffer = rd.read(chunk)
#build first list with all adresses
for m in (re.finditer(b'\x30\x31\x77\x62', buffer)): # find iframes
if audio : frame_table.append([m.start() + pos, 'sound'])
for m in (re.finditer(b'\x30\x30\x64\x63', buffer)): # find b frames
frame_table.append([m.start() + pos, 'video'])
#then remember to sort the list
frame_table.sort(key=lambda tup: tup[0])
l = []
l.append([0,0, 'void'])
max_frame_size = 0
#build tuples for each frame index with frame sizes
for n in range(len(frame_table)):
if n + 1 < len(frame_table):
frame_size = frame_table[n + 1][0] - frame_table[n][0]
else:
frame_size = filesize - frame_table[n][0]
max_frame_size = max(max_frame_size, frame_size)
l.append([frame_table[n][0],frame_size, frame_table[n][1]])
# variables that make shit work
clean = []
final = []
# keep first video frame or not
if firstframe :
for x in l :
if x[2] == 'video':
clean.append(x)
break
# clean the list by killing "big" frames
for x in l:
if x[1] <= (max_frame_size * kill) :
clean.append(x)
# FX modes
if mode == "random":
Wait.config(text="Applying Effect: Random", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15))
root.update()
final = random.sample(clean,len(clean))
if mode == "reverse":
Wait.config(text="Applying Effect: Reverse", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15))
root.update()
final = clean[::-1]
if mode == "invert":
Wait.config(text="Applying Effect: Invert", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15))
root.update()
final = sum(zip(clean[1::2], clean[::2]), ())
if mode == 'bloom':
Wait.config(text="Applying Effect: Bloom", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15))
root.update()
repeat = int(countframes)
frame = int(positframes)
## split list
lista = clean[:frame]
listb = clean[frame:]
## rejoin list with bloom
final = lista + ([clean[frame]]*repeat) + listb
if mode == 'pulse':
Wait.config(text="Applying Effect: Pulse", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15))
root.update()
pulselen = int(countframes)
pulseryt = int(positframes)
j = 0
for x in clean:
i = 0
if(j % pulselen == 0):
while i < pulselen :
final.append(x)
i = i + 1
else:
final.append(x)
j = j + 1
if mode == "jiggle":
Wait.config(text="Applying Effect: Jiggle", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15))
root.update()
amount = int(positframes)
final = [clean[constrain(x+int(random.gauss(0,amount)),0,len(clean)-1)] for x in range(0,len(clean))]
if mode == "overlap":
Wait.config(text="Applying Effect: Overlap", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15))
root.update()
pulselen = int(countframes)
pulseryt = int(positframes)
clean = [clean[i:i+pulselen] for i in range(0,len(clean),pulseryt)]
final = [item for sublist in clean for item in sublist]
time.sleep(2)
#name new file
cname = '-c' + str(countframes) if int(countframes) > 1 else ''
pname = '-n' + str(positframes) if int(positframes) > 1 else ''
fileout= filein[:-4] + '-' + mode + cname + pname + '.avi'
#delete old file
if os.path.exists(fileout):
os.remove(fileout)
bstream_until_marker(temp_hdrl, fileout)
with open(temp_movi,'rb') as rd:
filesize = os.path.getsize(temp_movi)
with open(fileout,'ab') as wr:
wr.write(struct.pack('<4s', b'movi'))
for x in final:
if x[0] != 0 and x[1] != 0:
rd.seek(x[0])
wr.write(rd.read(x[1]))
bstream_until_marker(temp_idx1, fileout)
export=exportbox.get()
def removefileout():
if os.path.exists(fileout):
os.remove(fileout)
messagebox.showinfo("DONE","Datamoshed video is ready!")
Wait.place_forget()
datamoshbtn['state']=NORMAL
datamoshbtn['cursor']=''
else:
pass
if os.path.exists(outputpath):
os.remove(outputpath)
else:
pass
os.remove(temp_hdrl)
os.remove(temp_movi)
os.remove(temp_idx1)
os.rmdir(temp_dir)
if(export==exportchoices[0]):
Wait.config(text="Moshed Video is Ready!", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15))
root.update()
messagebox.showinfo("DONE","Datamoshed video is ready!")
Wait.place_forget()
datamoshbtn['state']=NORMAL
datamoshbtn['cursor']=''
elif(export==exportchoices[1]):
targetformat=".mp4"
convert(fileout,targetformat)
removefileout()
elif(export==exportchoices[2]):
targetformat=".gif"
convert(fileout,targetformat)
removefileout()
elif(export==exportchoices[3]):
targetformat=".mov"
convert(fileout,targetformat)
removefileout()
elif(export==exportchoices[4]):
targetformat=".mkv"
convert(fileout,targetformat)
removefileout()
elif(export==exportchoices[5]):
targetformat=".wmv"
convert(fileout,targetformat)
removefileout()
else:
messagebox.showerror("OOPS","Please Select the Correct Format!")
os.remove(outputpath)
os.kill(Datamosh())
Wait.place_forget()
datamoshbtn['state']=NORMAL
datamoshbtn['cursor']=''
else:
Wait.config(text="Moshed Video is Ready!", fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15))
root.update()
def toggle():
if var.get() == 0:
Disableadvanced()
else:
Enableadvanced()
def Enableadvanced():
countlabel['fg']="green"
positlabel['fg']="green"
firstflabel['fg']="green"
killlabel['fg']="green"
Countframe['state']=NORMAL
Positframe['state']=NORMAL
firstframes['state']=NORMAL
killframe['state']=NORMAL
def Disableadvanced():
countlabel['fg']="grey"
positlabel['fg']="grey"
firstflabel['fg']="grey"
killlabel['fg']="grey"
Countframe['state']=DISABLED
Positframe['state']=DISABLED
firstframes['state']=DISABLED
killframe['state']=DISABLED
def info():
messagebox.showinfo("Help",
"Datamosher Pro is made for those who want to datamosh their video files and achieve that glitch effect."
"\nHow To Use:\n➤First input the video you want to datamosh."
"\n➤Choose the desired datamosh mode, then select the export format."
"\n➤Use advance options for different modes (For more info about the advanced options, go to our Github page)."
"\n➤Then just click on the datamosh button, then wait for a few seconds."
"\n➤After converting, your video will be moshed and you can find the video in the directory."
"\n➤Note that if you mosh the same files in the same location again, then the new moshed file will replace the old file."
"\n\nDeveloper: Akash Bora (a.k.a. Akascape)\nIf you have any issue then contact me on Github.")
def callback(url):
webbrowser.open_new_tab("https://github.com/Akascape/Datamosher-Pro-GUI-.git")
root=Tk()
root.title("Datamosher Pro")
root.resizable(width=False, height=False)
root.geometry("500x450")
root.configure(bg='#FFFFFF')
root.columnconfigure(0,weight=1)
icopath=resource_path0("icon.ico")
root.wm_iconbitmap(icopath)
path=resource_path0("label.png")
LabelIMG=PhotoImage(file=path)
headlabel=Label(root,image=LabelIMG,borderwidth=0, highlightthickness=0, padx=0,pady=0)
headlabel.grid()
LocationError=Label(root,text="Choose Video To Datamosh",fg="red",bg='#FFFFFF')
LocationError.grid()
OpeningFile= Button(root, width=60,bg="#82CC6C",fg="white", text="OPEN",highlightthickness=1,borderwidth=0.2,relief="groove",command=openfile)
OpeningFile.grid()
chooselabel=Label(root,text="Select Mode:",font="Aharoni",bg='#FFFFFF')
chooselabel.place(x=80,y=115,anchor='center')
modes=["Bloom","Invert","Jiggle", "Overlap","Pulse", "Reverse", "Random"]
modechoices=ttk.Combobox(root,values=modes, font="Verdana 12", width=7)
modechoices.current(0)
modechoices.place(x=130,y=104)
exportchoices=["AVI(RAW)","MP4","GIF","MOV","MKV","WMV"]
exportlabel=Label(root,text="Export Format:",font="Aharoni",bg='#FFFFFF')
exportlabel.place(x=270,y=105)
exportbox=ttk.Combobox(root,values=exportchoices, font="Verdana 10", width=8)
exportbox.current(1)
exportbox.place(x=380,y=104)
var = IntVar()
var.set(0)
advancedbox=Checkbutton(root, text="Advanced",bg="#FFFFFF", command=toggle,variable=var,onvalue=1, offvalue=0)
advancedbox.place(x=70,y=150, anchor='center')
var1=IntVar()
var1.set(1)
countlabel=Label(root,text="Glitch Freqency",fg="grey",bg='#FFFFFF')
countlabel.place(x=40,y=165)
Countframe=Entry(root,bg="light blue",width=10,borderwidth=3, textvariable=var1,state=DISABLED)
Countframe.place(x=140,y=165)
var2=IntVar()
var2.set(1)
positlabel=Label(root,text="Frames Frequency",fg="grey",bg='#FFFFFF')
positlabel.place(x=270,y=165)
Positframe=Entry(root,bg="light blue",width=10,borderwidth=3, textvariable=var2, state=DISABLED)
Positframe.place(x=380,y=165)
var3=IntVar()
var3.set(1)
firstflabel=Label(root,text="Ignored Frames",fg="grey",bg='#FFFFFF')
firstflabel.place(x=40,y=200)
firstframes=Entry(root,bg="light blue",width=10,borderwidth=3, textvariable=var3, state=DISABLED)
firstframes.place(x=140,y=200)
var4=DoubleVar()
var4.set(0.7)
killlabel=Label(root,text="Kill Frames",fg="grey",bg='#FFFFFF')
killlabel.place(x=270,y=200)
killframe=Entry(root,bg="light blue",width=10,borderwidth=3, textvariable=var4, state=DISABLED)
killframe.place(x=380,y=200)
global Wait
Wait=Label(root,text="",fg="#6D76CD",bg='#FFFFFF', font=("Aharoni",15))
infobtn=Button(root, width=2,bg="#FFFFFF",fg="black", text="",font=(10),relief="sunken",cursor='hand2', highlightthickness=0,borderwidth=0,padx=0,pady=0,command=info)
infobtn.place(x=475,y=425)
dev=Label(root, text='Developed by Akascape | For more info, visit:',bg='#FFFFFF',fg="#6D76CD", font=("Impact",10))
dev.place(x=5,y=430)
link=Label(root, text="Datamosher Pro Github",font=('Impact',10),bg='#FFFFFF',fg="#6D76CD", cursor="hand2")
link.place(x=245,y=430)
link.bind("<Button-1>", lambda e:
callback("https://github.com/Akascape/Datamosher-Pro-GUI-.git"))
path0=resource_path0("button.png")
buttonIMG=PhotoImage(file=path0)
datamoshbtn=Button(root,image=buttonIMG,borderwidth=0, highlightthickness=0, padx=0,pady=0,command=Step1)
datamoshbtn.place(x=100,y=270)
root.mainloop()
#DEVELOPER: AKASH BORA (a.k.a Akascape)
#Version=1.0

View File

@@ -1,6 +0,0 @@
#Read this to use the python version.
<br>This version is comparitively lower in size and works the same inside python environment. To use this version, just download the zip file and extract this folder and then double click on the Datamosher Prp.py to open the program, then use the software as describes in the Readme.md or click the "i" button inside the software.
<br>Note that you must have the required modules installed. Most of the modules that are used are installed by default, but only one module you need to install separately is Imageio.
<br>To install that module, open CMD or other terminal and type "pip install Imageio" and "pip install Imageio-ffmpeg, then it will be installed and you can open Datamosher Pro.py
<br>Do not delete or move any assets that are linked with the main file or else it will show error.
<br>So, this is all about the python version, you can now Datamosh your videos!

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

1
README.md Normal file
View File

@@ -0,0 +1 @@
# Some important sub-files for Datamosher-Pro will be downloaded from this branch

View File

@@ -1,42 +0,0 @@
# Datamosher Pro
<br>Datamoshing is an effect that really looks cool and if you also want to make this glitch effect with your videos, you are in the right place!
![icon](https://user-images.githubusercontent.com/89206401/138873267-16f152e7-b61a-4fc2-a215-1cb66a004f13.png)
<br>➤Why I made this?
<br>I was also looking for good datamoshing softwares, you can either have to use those old softwares like Avidemux or have to look for some paid plugins, but I created my own GUI based application that is Datamosher Pro which is a free project. It contains 7 different effects and more will be added in future, you can also help to make new effects. With Datamosher Pro, you can quickly and easily datamosh your videos(supports mp4, gif, avi, etc).
<br>
<br>➤How to Install?
<br>You can either use the python based version for viewing logs and changing source code if you want, but if you are looking for faster renders then download the executable version of Datamosher Pro from the release page(https://github.com/Akascape/Datamosher-Pro-GUI-/releases/tag/Datamosher_Pro.exe)
<br>There is no malware or difference in the exe version(as the same python version is converted to .exe using Auto-Py-To-Exe Converter).
<br>Note: For python users, make sure you have all the assets with the python file and Imageio module installed in your system if not then open CMD and type"pip install imageio" and it will be installed.
<br>
<br>➤How to Use?
<br>•Input the video file first (supported formats- mp4, gif, avi + more will be added if you demand")
<br>•Choose the desired datamosh mode, then select the export format"
<br>•Use advance options to get more accurate results"
<br>•Then just click on the datamosh button, then wait for a few seconds"
<br>•Then your video will be moshed, see the video in the directory"
<br>•Note that if you mosh the same files in the same location again, then the new moshed file will replace the old file.
<br>
<br>➤Effects Info:
<br>(c is Glitch Frequency and n is Frame Frequency)
<br>random - randomizes frame order
<br>reverse - reverse frame order
<br>invert - switches each consecutive frame witch each other
<br>bloom - duplicates c times p-frame number n
<br>pulse - duplicates groups of c p-frames every n frames
<br>overlap - copy group of c frames taken from every nth position
<br>jiggle - take frame from around current position. n parameter is spread size.
<br>
<br>➤How to use Advanced Options?
<br>The advanced tab is very useful and you can use it to get accurate results.
<br>Glitch Frequency - tells how often to glitch (for modes that support it)
<br>Frame Frequency - tells how many frames in the glitch (for modes that support it)
<br>Ignored First Frame - tells whether to keep first video frames
<br>Kill frames - tells max framesize to kill while cleaning
<br>You can try around changing the values from 50-100 and see the results, you can visit https://github.com/itsKaspar/tomato.git to view more examples about the advanced tab.
<br>
<br>➤User Interface:
<br>![Screenshot 2021-10-26 220159](https://user-images.githubusercontent.com/89206401/138922164-4c78f673-050e-4513-a3d2-6208e836cabc.png)
<br>
<br>➤More Info about this project:
<br>The effects are all inspired from ItsKaspar's https://github.com/itsKaspar/tomato.git but it can only handle .avi file structure, but in Datamosher Pro you can use any video file type including mp4, avi, gif. The files are first converted to avi file using Imageio without losing any quality and then the effect is applied and then again the corrupted file is converted to stable version using the same process so that the output video can be directly used by other softwares without any error. A raw form option is also available if needed. You will not find this type of GUI program anywhere, I hope there is no error in the software but if you saw any bug then raise an issue. All the logo and designs are created by me. <br>Thanks! Made by Akash Bora (a.k.a Akascape).

1
VERSION.txt Normal file
View File

@@ -0,0 +1 @@
2.9

1
VERSIONPY.txt Normal file
View File

@@ -0,0 +1 @@
2.4