View Full Version : Avisynth w/ GScript and ImageReader - open a series of images
wiseant
19th August 2012, 01:54
Hi
I am trying to find out how to use GScript with ImageReader to open a series of images from a folder with the ability to process each image in a loop
".bilinearresize(1920,1080).converttoYUY2()" is just an example process
I tried this:
GScript("""
for (i=0,12) {
myfile="00"+string(i)+".bmp"
j=ImageReader(file="d:\Images\" + myfile).bilinearresize(1920,1080).converttoYUY2()
a=blankclip(24,1920,1080)
b=overlay(a,j,0,0)
b
}
""")
but this only shows 0012.bmp
I know I'm missing something here but I can't figure it out
TIA
gyth
19th August 2012, 02:51
Is it overlaying them all on the same clip, so only the top one, 12, shows up?
wiseant
19th August 2012, 03:02
gyth:
Yes - only the last one -> 0012.bmp shows up
StainlessS
19th August 2012, 03:59
GScript("""
picclip = 0 # dummy for now
for (i=0,12) { # first make a 13 frame clip (not a one frame clip 13 times)
myfile="00"+string(i)+".bmp"
j=ImageReader(file="d:\Images\" + myfile) # 1 Frame clip
# here make all j same if not all same colorspace/size etc
picclip = (IsClip(picclip)) ? picclip ++ j : j # Append to clip so far
}
# picclip is now a 13 frame clip
# resize/blankclip etc
""")
EDIT: Is untested. ImageReader could do the above on its own using start and end, without the loop (provided all same colorspace/size etc).
When you have a problem like that, you need to remove the stuff that is nothing to do with the
problem, ie the blankclip and resize etc. Minimize the prob, and it seems and is less formidable (perhaps even obvious).
.
wiseant
19th August 2012, 05:03
StainlessS:
Thanks for the info
The bmp's are not all the same size
What I am ultimately trying to do [if possible] is to open the first bitmap - determine its width and height - and based on this info choose a resize with borders that will = 1920x1080
(I'll do a preliminary check to make sure the width will not get resized to > 1920 and to make sure that the height will not get resize to > 1080
1. determine the width and height of the bmp
if image.height > 1080 then resize to 1080 - then resize image.width to new width = (1080/image.height) * image.width
2. then 1920-newwidth=y
borders to add = y/2
for example a bitmap 800x1200
I resize the height to 1080 - then make the width 1080/1200 * width = 720
y = 1920 - width
addborders(y/2,0,y/2,0)
In this case I would have a bmp that gets resized to 720x1080 then .addborders(600,0,600,0) = 1920x1080 bmp
StainlessS
19th August 2012, 05:16
Suggest either a separate Imagereader thing for 0000 to establish output size, before the loop, OR,
a condition within the loop for the first frame, eg if(i=0){ etc}
It may sound simplistic, but as far as programming is concerned, it is best to break down the problem
into its most basic parts, to the point it becomes obvious what to do.
EDIT: If you can repeatedly break down problems into two pieces or more, then you can become a master
programmer by doing the obvious.
Filker
19th August 2012, 14:06
Is there a way of reading the EXIF info in jpegs and rotate&resize based on that? Or at least read this info from a csv or xml flat file?
This freeware program can export EXIF infos to xml:
http://www.matirsoft.com/main/folder_viewer.htm
wiseant
19th August 2012, 22:30
StainlessS:
I came up with this script, if you feel like testing it.
No loops as yet, just wanted to make sure that any bmp would get resized properly
Obviously, just change "k=ImageReader(file="d:\Images\" + myfile)" to the drive and directory of your bmp's
This example will open 0022.bmp in d:\Images\
GScript("""
i=22
myfile="00"+string(i)+".bmp"
k=ImageReader(file="d:\Images\" + myfile)
iHeight=k.height
iWidth=k.width
if (iHeight>iWidth) {
iHeight1=1080
iWidth1=(1080*iWidth)/iHeight
x=1920-iWidth1
x1=x/2
if (iWidth1 % 2 >0) {
x1=(x/2) +1
}
k=k.bilinearresize(iWidth1,1080).addborders(x1,0,x/2,0)
}
if (iWidth>iHeight) {
iWidth1=1920
iHeight1=(1920*iHeight)/iWidth
y=1080-iHeight1
y1=y/2
if (iHeight1 % 2 >0) {
y1=(y/2) +1
}
k=k.bilinearresize(iWidth1,iHeight1).addborders(0,y1,0,y/2)
}
if (iHeight1 > 1080) {
iHeight1=1080
iWidth1=(1080*iWidth)/iHeight
x=1920-iWidth1
x1=x/2
if (iWidth1 % 2 >0) {
x1=(x/2) +1
}
k=k.bilinearresize(iWidth1,iHeight1).addborders(x1,0,x/2,0)
}
k
""")
subtitle(last,"original width=" + string(iWidth) +" " + "original height=" + string(iHeight),20,20)
subtitle(last,"new width=" + string(iWidth1) +" " + "new height=" + string(iHeight1),50,50)
StainlessS
20th August 2012, 02:36
Have a play with the below script, I have not touched (or even looked at really) the resizing logic.
Myself, I cant stand looking at code that is not properly indented, next time you post some code,
try going Advanced and select the code and click on the '#' to wrap the code in CODE tags.
# Edit below to suit
DIR = "D:\Images\"
BASENAME = "" # Base Filename
EXT = ".BMP" # Filename Extension
PICMIN = 1 # Start
PICMAX = 74 # End
MINDIGS = 4 # Minimum Digits
SUBS = True
FPS = 1.0
#DEBUG = True
Function MakePicName(String BaseName,String Ext,int Digs,int n) {GScript(""" S=String(n) While(StrLen(s)<Digs) {S="0"+S} Return BaseName+S+Ext """)}
GScript("""
picclip = 0 # dummy for now
For(i=PICMIN,PICMAX) {
myfile=MakePicName(BASENAME,EXT,MINDIGS,i)
#if(DEBUG){RT_Debug("TEST:",String(i)+")","ImageReader:-",myfile)}
k=ImageReader(file=DIR + myfile,end=0).ConvertToRGB24() # With Bmap, some come up as RGB24 bit some RGB32.
iHeight=k.height iWidth=k.width
#if(DEBUG){RT_Debug("TEST:",String(i)+")",myfile,"Width="+String(iWidth),"Height="+String(iHeight))}
if (iHeight > iWidth) {
iHeight1 = 1080
iWidth1 = (1080 * iWidth) / iHeight
x = 1920 - iWidth1
x1 = x/2
if (iWidth1 % 2 > 0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,1080).addborders(x1 , 0 , x / 2,0)
} else if (iWidth > iHeight) {
iWidth1 = 1920
iHeight1 = (1920*iHeight)/iWidth
y = 1080-iHeight1
y1 = y/2
if (iHeight1 % 2 >0) {
y1 = (y/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(0,y1,0,y/2)
}
if (iHeight1 > 1080) {
iHeight1 = 1080
iWidth1 = (1080*iWidth)/iHeight
x = 1920-iWidth1
x1 = x/2
if (iWidth1 % 2 >0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(x1,0,x/2,0)
}
if(SUBS) {
k=k.subtitle(String(i))
k=k.subtitle("original width=" + string(iWidth) +" " + "original height=" + string(iHeight)+ \
" FAR="+String(Float(iWidth)/iHeight,"%.2f"),20,20)
k=k.subtitle("new width=" + string(iWidth1) +" " + "new height=" + string(iHeight1)+ \
" FAR="+String(Float(iWidth1)/iHeight1,"%.2f"),20,50)
k=k.subtitle("out width=" + string(k.Width) +" " + "out height=" + string(k.Height)+ \
" FAR="+String(Float(k.Width)/k.Height,"%.2f"),20,70)
}
picclip = (IsClip(picclip)) ? picclip ++ k : k # Append to clip so far
}
""")
PicClip
AssumeFPS(FPS)
EDITED:
StainlessS
20th August 2012, 03:03
Oops, You can comment out the RT_Debug() line (although it is handy to debug compile time code [in RT_Stats plug]).
wiseant
20th August 2012, 03:18
StainlessS:
[didn't see your last post re comment out - but I did this already]
I copied your script and pasted into AvsP
Doesn't work for me
1. Script error: there is no function named "RT_Debug"
GScript line 6
GScript line 48
New File line 61
comment out line 18 RT_Debug("TEST:",myfile)
2. error: Could not open file D:\Images\0001.jpg
so, change EXT= ".JPG" to EXT= ".bmp"
3. error: Could not open file D:\Images\0001.bmp
my images range from 000.bmp, 001.bmp, .. 0073.bmp
4. then I batch renamed them to 0001.bmp, 0002.bmp ..
error: Could not open file D:\Images\0010.bmp
StainlessS
20th August 2012, 04:55
Yep, had already posted on the RT_Debug thing, the other starting defines were intended to be edited by you.
If you have both 3 and 4 digit names (as you described "my images range from 000.bmp, 001.bmp, .. 0073.bmp")
that would fail as it would look for 073.bmp not 0073.bmp (would fail in standard use ImageReader too even if all same size etc).
I converted/renamed my test jpg's as eg 0001.bmp to 0074.bmp, works just fine since I added a ConvertToRGB24,
some of my BMP's were coming up RGB24 and some RGB32.
Please try again with current script, has been edited.
Check that your bitmap is named as in error message (also check that you can load it in some viewer).
The error message was telling you that it is looking for a properly named file, ie 4 digits
(perhaps an imageReader problem, try a standard ImageReader call on that single file).
The RT_Debug thing is really rather handy to have if you are playing with compile time scripts, give it a whirl,
its in the RT_Stats thread last posted about a week ago.
wiseant
20th August 2012, 06:03
StainlessS:
Yes, the new script works
I am using IranView in Batch Rename mode, so I can just use Name Pattern: 00##
These images of mine were jpg's that I edited in Photoshop and saved as 24-bit bmp's - so all of them show RGB24
I look into RT_Debug tomorrow . . .
Thanks StainlessS
StainlessS
20th August 2012, 13:11
Good. :)
Filker has a requirement for the EXIF reader thing, I was thinking of adding a sort of RT_ReadTxtFileIntoString() type plug
to read any file contents into a string for compile/runtime scripts. Anyways, I just remembered something written by
Gavino (I think) about Import being able to import anything from a file.
In a script function, After checking file exists (if not return ""), then eg Return String(Import(FileName))
You could then parse eg the EXIF stuff in GScript.
@Filker Can you post an example for the EXIF csv format (XML feels a bit too complicated to do easily in small code).
EDIT: Above is rubbish.
StainlessS
20th August 2012, 17:15
Oh darn, previous post is rubbish, cannot use import to import as a string, I guess I misread/mis-remembered.
You can return a string from an imported script file but not the file itself, I guess I'll do the RT_ReadTxtFileIntoString() type plug.
Have just modded the RT_Stats RT_Debug plug, so that you could send eg a text file held in a string, to OutputDebugString,
it behaves as previously but parses linefeed carriage return to split the text into individual lines to be sent
to OutputDebugString. All other control codes are converted to space.
Was wanting to test it out by sending a good sized text file via the import thing, very disappointed that it dont work, so I'll
be getting straight into the RT_ReadTxtFileIntoString() type plug so I can test RT_Debug, should not take too long, probably
post some time within next 24.
Filker
20th August 2012, 18:00
Thank you for looking into this, StainlessS.
csv with exif data in attachment.
For what I want to do the relevant field is Orientation.
I found this source code that can read exif info from the jpegs:
http://sylvana.net/jpegcrop/jpegexiforient.c
http://sylvana.net/jpegcrop/exif_orientation.html
StainlessS
21st August 2012, 02:26
@Filker, looking forward to your attachment being approved.
Have nearly gotten that text reader plug working, see here:-
http://forum.doom9.org/showthread.php?t=165710
Once its working ok, it should be a doddle to parse your csv files. :)
wiseant
21st August 2012, 07:53
yo StainlessS:
I did some tests and made a couple of changes to my script - just added two variables -> canvaswidth and canvasheight
so replacing values in the script of 1920 and 1080 with canvaswidth and canvasheight respectively - allows the user to choose any final canvas size and the images will maintain their AR
It doesn't work right now if the canvasheight is greater than the canvaswidth - it does, but only so far - it did 800x900 but after that got incorrect image size spice error
so I'll need to create a portrait mode
this way the script can easily make slideshows in any resolution and fps - resize to 720x480 for dvd - or do a bluray compliant slide show - or youtube
also, if ImageReader is changed to AviSource/DirectShowSource/Mpeg2Source/... the script should be able to read a bunch of videos and resize them to a common resolution [except mixing interlaced/progressive material]
I have a couple ideas of importing video filenames from a folder without having to rename them - is this where your text reader plugin would work?
Filker
21st August 2012, 15:24
@Filker, looking forward to your attachment being approved.
Have nearly gotten that text reader plug working, see here:-
http://forum.doom9.org/showthread.php?t=165710
Once its working ok, it should be a doddle to parse your csv files. :)
That's great, it should be useful for another million things.
Here's the csv content:
Filename,IMG_9611.JPG
Make,Canon
Model,Canon EOS 500D
Orientation,Left bottom
XResolution,72
YResolution,72
ResolutionUnit,Inch
DateTime,2012:03:16 16:25:24
Artist,
YCbCrPositioning,Co-Sited
Copyright,
ExifOffset,360
ExposureTime,1/60 seconds
FNumber,4.50
ExposureProgram,Normal program
ISOSpeedRatings,400
ExifVersion,0221
DateTimeOriginal,2012:03:16 16:25:24
DateTimeDigitized,2012:03:16 16:25:24
ComponentsConfiguration,YCbCr
ShutterSpeedValue,1/64 seconds
ApertureValue,F 4.56
ExposureBiasValue,0
MeteringMode,Multi-segment
Flash,Flash fired, Compulsory flash mode
FocalLength,32 mm
UserComment,
SubsecTime,52
SubsecTimeOriginal,52
SubsecTimeDigitized,52
FlashPixVersion,0100
ColorSpace,sRGB
ExifImageWidth,4752
ExifImageHeight,3168
InteroperabilityOffset,8380
FocalPlaneXResolution,5315.44
FocalPlaneYResolution,5342.33
FocalPlaneResolutionUnit,Inch
CustomRendered,Normal process
ExposureMode,Auto
White Balance,Auto
SceneCaptureType,Standard
Filename,IMG_9612.JPG
Make,Canon
Model,Canon EOS 500D
Orientation,Top left
XResolution,72
YResolution,72
ResolutionUnit,Inch
DateTime,2012:03:16 16:25:31
Artist,
YCbCrPositioning,Co-Sited
Copyright,
ExifOffset,360
ExposureTime,1/60 seconds
FNumber,5.60
ExposureProgram,Normal program
ISOSpeedRatings,400
ExifVersion,0221
DateTimeOriginal,2012:03:16 16:25:31
DateTimeDigitized,2012:03:16 16:25:31
ComponentsConfiguration,YCbCr
ShutterSpeedValue,1/64 seconds
ApertureValue,F 5.66
ExposureBiasValue,0
MeteringMode,Multi-segment
Flash,Flash fired, Compulsory flash mode
FocalLength,55 mm
UserComment,
SubsecTime,17
SubsecTimeOriginal,17
SubsecTimeDigitized,17
FlashPixVersion,0100
ColorSpace,sRGB
ExifImageWidth,4752
ExifImageHeight,3168
InteroperabilityOffset,8380
FocalPlaneXResolution,5315.44
FocalPlaneYResolution,5342.33
FocalPlaneResolutionUnit,Inch
CustomRendered,Normal process
ExposureMode,Auto
White Balance,Auto
SceneCaptureType,Standard
StainlessS
21st August 2012, 21:48
@Filker, if you wanna check out RT_Stats 1.02 try here (or medifire account in sig:
http://forum.doom9.org/showthread.php?t=165479
StainlessS
21st August 2012, 22:10
Just had a brainwave, Am implementing RT_TxtQueryLines and RT_TxtGetLine plugs, should make parsing
any newline separated strings much easier.
StainlessS
22nd August 2012, 01:18
RT_Stats v1.02, below of from mediafire account in sig:
http://forum.doom9.org/showthread.php?t=165479
GScript("""
CVS=RT_ReadTxtFromFile("D:\AVS\exif9611.csv") # Read file into CVS string
LINES=RT_TxtQueryLines(CVS) # Query Number of lines in String
RT_Debug("Lines in CVS File ="+String(LINES)) # Show Lines
RT_Debug(" ") # Single char SPACE, Blank line Separator
For(i=0,Lines - 1) { # Line index is ZERO relative (like Frame, Framecount)
CVS_LINE = RT_TxtGetLine(CVS,i) # A single line from CVS file string
RT_Debug(String(i)+")",CVS_LINE) # Show it
}
""")
Return BlankClip() # Avoid Throw Error
RT_Debug Output
00000004 00:26:06 RT_Debug: Lines in CVS File =42
00000005 00:26:06 RT_Debug:
00000006 00:26:06 RT_Debug: 0) Filename,IMG_9611.JPG
00000007 00:26:06 RT_Debug: 1) Make,Canon
00000008 00:26:06 RT_Debug: 2) Model,Canon EOS 500D
00000009 00:26:06 RT_Debug: 3) Orientation,Left bottom
00000010 00:26:06 RT_Debug: 4) XResolution,72
00000011 00:26:06 RT_Debug: 5) YResolution,72
00000012 00:26:06 RT_Debug: 6) ResolutionUnit,Inch
00000013 00:26:06 RT_Debug: 7) DateTime,2012:03:16 16:25:24
00000014 00:26:06 RT_Debug: 8) Artist,
00000015 00:26:06 RT_Debug: 9) YCbCrPositioning,Co-Sited
00000016 00:26:06 RT_Debug: 10) Copyright,
00000017 00:26:06 RT_Debug: 11) ExifOffset,360
00000018 00:26:06 RT_Debug: 12) ExposureTime,1/60 seconds
00000019 00:26:06 RT_Debug: 13) FNumber,4.50
00000020 00:26:06 RT_Debug: 14) ExposureProgram,Normal program
00000021 00:26:06 RT_Debug: 15) ISOSpeedRatings,400
00000022 00:26:06 RT_Debug: 16) ExifVersion,0221
00000023 00:26:06 RT_Debug: 17) DateTimeOriginal,2012:03:16 16:25:24
00000024 00:26:06 RT_Debug: 18) DateTimeDigitized,2012:03:16 16:25:24
00000025 00:26:06 RT_Debug: 19) ComponentsConfiguration,YCbCr
00000026 00:26:06 RT_Debug: 20) ShutterSpeedValue,1/64 seconds
00000027 00:26:06 RT_Debug: 21) ApertureValue,F 4.56
00000028 00:26:06 RT_Debug: 22) ExposureBiasValue,0
00000029 00:26:06 RT_Debug: 23) MeteringMode,Multi-segment
00000030 00:26:06 RT_Debug: 24) Flash,Flash fired, Compulsory flash mode
00000031 00:26:06 RT_Debug: 25) FocalLength,32 mm
00000032 00:26:06 RT_Debug: 26) UserComment,
00000033 00:26:06 RT_Debug: 27) SubsecTime,52
00000034 00:26:06 RT_Debug: 28) SubsecTimeOriginal,52
00000035 00:26:06 RT_Debug: 29) SubsecTimeDigitized,52
00000036 00:26:06 RT_Debug: 30) FlashPixVersion,0100
00000037 00:26:06 RT_Debug: 31) ColorSpace,sRGB
00000038 00:26:06 RT_Debug: 32) ExifImageWidth,4752
00000039 00:26:06 RT_Debug: 33) ExifImageHeight,3168
00000040 00:26:06 RT_Debug: 34) InteroperabilityOffset,8380
00000041 00:26:06 RT_Debug: 35) FocalPlaneXResolution,5315.44
00000042 00:26:06 RT_Debug: 36) FocalPlaneYResolution,5342.33
00000043 00:26:06 RT_Debug: 37) FocalPlaneResolutionUnit,Inch
00000044 00:26:06 RT_Debug: 38) CustomRendered,Normal process
00000045 00:26:06 RT_Debug: 39) ExposureMode,Auto
00000046 00:26:06 RT_Debug: 40) White Balance,Auto
00000047 00:26:06 RT_Debug: 41) SceneCaptureType,Standard
StainlessS
22nd August 2012, 02:46
I have a couple ideas of importing video filenames from a folder without having to rename them - is this where your text reader plugin would work?
Sorry, I guess I missed that Q the 1st time I read it, was a bit busy.
I guess I could do a function that could take a directory/filename template,
with wildcard (as in DOS * and ? wild cards) and also take an output destination file to create a file list which could be read into
the text file reader thing, would perhaps return the number of filenames in file or 0 if none (no file o/p file then created).
would that do ?
EDIT: Yes, could read resultant filename list file (or any filename list) into the RT text reader thing.
wiseant
22nd August 2012, 03:18
StainlessS
OK - where do I get the RT text reader thing and how do I implement it?
TIA
StainlessS
22nd August 2012, 04:03
StainlessS
OK - where do I get the RT text reader thing and how do I implement it?
TIA
Three posts previous (beta, TAKE 2, 2nd within 24 hours, no incr of version - TAKE 2== second attempt, Take 2, added 2 more functions)
will read in a text file (possibly a list of filenames)
The wildcard thing will take a little longer (maybe 1/2 days).
EDIT: Text Reader Thing == RT_ReadTxtFromFile. Implementation, see 3 posts previous.
EDIT: with the wildcard thing, you could interrogate the current files in a dir,
but would still use RT_ReadTxtFromFile to get those filenames from the generated file,
that would I think be most flexible.
Filker
22nd August 2012, 17:10
Three posts previous (beta, TAKE 2, 2nd within 24 hours, no incr of version - TAKE 2== second attempt, Take 2, added 2 more functions)
will read in a text file (possibly a list of filenames)
The wildcard thing will take a little longer (maybe 1/2 days).
EDIT: Text Reader Thing == RT_ReadTxtFromFile. Implementation, see 3 posts previous.
EDIT: with the wildcard thing, you could interrogate the current files in a dir,
but would still use RT_ReadTxtFromFile to get those filenames from the generated file,
that would I think be most flexible.
I only found 1.01 in your mediafire folder, where's the link for 1.02?
I get "no function name RT_ReadTxtfromfile" trying to run the script with 1.01.
StainlessS
22nd August 2012, 19:31
Oops, I posted the wrong link, see here:
RT_Stats v1.02, below of from mediafire account in sig:
http://forum.doom9.org/showthread.php?t=165479
wiseant
22nd August 2012, 21:04
StainlessS:
I have edited the script to open video clips with DirectShowSource
To test it I just created some string variables and read them with the loop
I was able to join ten different clips together - it worked with all the resolutions that I tried - although they really should be all 29.97/30 or 23.976/24/25 fps
I haven't tried your RT_Stats plug as yet
v1="D:\VideoClip1.avi"
v2="D:\00_VideoII.avi"
v3="D:\Guess What Clip Three.avi"
count=3
fps=30000.0/1001.0
GScript("""
picclip = 0
canvaswidth =640
canvasheight =480
For(i=1,count) {
myfile=eval("v"+ string(i))
k=DirectshowSource(myfile).ConvertToYUY2()
iHeight=k.height iWidth=k.width
if (iHeight > iWidth) {
iHeight1 = canvasheight
iWidth1 = (canvasheight * iWidth) / iHeight
x = canvaswidth - iWidth1
x1 = x/2
if (iWidth1 % 2 > 0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,canvasheight).addborders(x1,0,x/2,0,$101010).assumefps(fps)
} else if (iWidth > iHeight) {
iWidth1 = canvaswidth
iHeight1 = (canvaswidth*iHeight)/iWidth
y = canvasheight-iHeight1
y1 = y/2
if (iHeight1 % 2 >0) {
y1 = (y/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(0,y1,0,y/2,$101010).assumefps(fps)
}
if (iHeight1 > canvasheight) {
iHeight1 = canvasheight
iWidth1 = (canvasheight*iWidth)/iHeight
x = canvaswidth-iWidth1
x1 = x/2
if (iWidth1 % 2 >0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(x1,0,x/2,0,$101010).assumefps(fps)
}
picclip = (IsClip(picclip)) ? picclip ++ k : k # Append to clip so far
}
""")
PicClip
so it should be easy to incorporate RT_Stats_25_.dll into this
StainlessS
23rd August 2012, 01:46
This is probably the my last post of any significance in this thread, I really need to get back to what I was doing,
but you should both be able to sort out any probs with the additional functions in RT_Stats v1.02 just updated.
@Filker,
csv scanning script:
GScript("""
result=RT_WriteFileList("d:\avs\*.csv","CSV.List") # Create a listing file of csv files
Assert((result!=0), "No CSV files found")
CSVLIST=RT_ReadTxtFromFile("CSV.List") # Get list of csv files
FILES=RT_TxtQueryLines(CSVLIST) # Query Number of lines in String ie number of CSV files.
RT_Debug("Found CSV files = " + String(FILES))
for(f=0,FILES-1) {
FN=RT_TxtGetLine(CSVLIST,f) # Filename of csv file
RT_Debug("Report for CSV File",FN)
CSV=RT_ReadTxtFromFile(FN) # Read csv file into CSV string
LINES=RT_TxtQueryLines(CSV) # Query Number of lines in CSV String
RT_Debug("Lines in File",FN,String(LINES)) # Show number of Lines in csv file
RT_Debug(" ") # Single char SPACE, Blank line Separator
For(i=0,LINES - 1) { # Line index is ZERO relative (like Frames, Framecount)
CSV_LINE = RT_TxtGetLine(CSV,i) # A single line from CSV file string
RT_Debug(String(i)+")",CSV_LINE) # Show it
}
RT_Debug(" ") # Single char SPACE, Blank line Separator
}
""")
Return BlankClip() # Avoid Throw Error
The csv list created by RT_WriteFileList line.
d:\avs\exif9611.csv
d:\avs\exif9612.csv
RT_Debug output
00000004 00:46:15 RT_Debug: Found CSV files = 2
00000005 00:46:15 RT_Debug: Report for CSV File d:\avs\exif9611.csv
00000006 00:46:15 RT_Debug: Lines in File d:\avs\exif9611.csv 42
00000007 00:46:15 RT_Debug:
00000008 00:46:15 RT_Debug: 0) Filename,IMG_9611.JPG
00000009 00:46:15 RT_Debug: 1) Make,Canon
00000010 00:46:15 RT_Debug: 2) Model,Canon EOS 500D
00000011 00:46:15 RT_Debug: 3) Orientation,Left bottom
00000012 00:46:15 RT_Debug: 4) XResolution,72
00000013 00:46:15 RT_Debug: 5) YResolution,72
00000014 00:46:15 RT_Debug: 6) ResolutionUnit,Inch
00000015 00:46:15 RT_Debug: 7) DateTime,2012:03:16 16:25:24
00000016 00:46:15 RT_Debug: 8) Artist,
00000017 00:46:15 RT_Debug: 9) YCbCrPositioning,Co-Sited
00000018 00:46:15 RT_Debug: 10) Copyright,
00000019 00:46:15 RT_Debug: 11) ExifOffset,360
00000020 00:46:15 RT_Debug: 12) ExposureTime,1/60 seconds
00000021 00:46:15 RT_Debug: 13) FNumber,4.50
00000022 00:46:15 RT_Debug: 14) ExposureProgram,Normal program
00000023 00:46:15 RT_Debug: 15) ISOSpeedRatings,400
00000024 00:46:15 RT_Debug: 16) ExifVersion,0221
00000025 00:46:15 RT_Debug: 17) DateTimeOriginal,2012:03:16 16:25:24
00000026 00:46:15 RT_Debug: 18) DateTimeDigitized,2012:03:16 16:25:24
00000027 00:46:15 RT_Debug: 19) ComponentsConfiguration,YCbCr
00000028 00:46:15 RT_Debug: 20) ShutterSpeedValue,1/64 seconds
00000029 00:46:15 RT_Debug: 21) ApertureValue,F 4.56
00000030 00:46:15 RT_Debug: 22) ExposureBiasValue,0
00000031 00:46:15 RT_Debug: 23) MeteringMode,Multi-segment
00000032 00:46:15 RT_Debug: 24) Flash,Flash fired, Compulsory flash mode
00000033 00:46:15 RT_Debug: 25) FocalLength,32 mm
00000034 00:46:15 RT_Debug: 26) UserComment,
00000035 00:46:15 RT_Debug: 27) SubsecTime,52
00000036 00:46:15 RT_Debug: 28) SubsecTimeOriginal,52
00000037 00:46:15 RT_Debug: 29) SubsecTimeDigitized,52
00000038 00:46:15 RT_Debug: 30) FlashPixVersion,0100
00000039 00:46:15 RT_Debug: 31) ColorSpace,sRGB
00000040 00:46:15 RT_Debug: 32) ExifImageWidth,4752
00000041 00:46:15 RT_Debug: 33) ExifImageHeight,3168
00000042 00:46:15 RT_Debug: 34) InteroperabilityOffset,8380
00000043 00:46:15 RT_Debug: 35) FocalPlaneXResolution,5315.44
00000044 00:46:15 RT_Debug: 36) FocalPlaneYResolution,5342.33
00000045 00:46:15 RT_Debug: 37) FocalPlaneResolutionUnit,Inch
00000046 00:46:15 RT_Debug: 38) CustomRendered,Normal process
00000047 00:46:15 RT_Debug: 39) ExposureMode,Auto
00000048 00:46:15 RT_Debug: 40) White Balance,Auto
00000049 00:46:15 RT_Debug: 41) SceneCaptureType,Standard
00000050 00:46:15 RT_Debug:
00000051 00:46:15 RT_Debug: Report for CSV File d:\avs\exif9612.csv
00000052 00:46:15 RT_Debug: Lines in File d:\avs\exif9612.csv 42
00000053 00:46:15 RT_Debug:
00000054 00:46:15 RT_Debug: 0) Filename,IMG_9612.JPG
00000055 00:46:15 RT_Debug: 1) Make,Canon
00000056 00:46:15 RT_Debug: 2) Model,Canon EOS 500D
00000057 00:46:15 RT_Debug: 3) Orientation,Top left
00000058 00:46:15 RT_Debug: 4) XResolution,72
00000059 00:46:15 RT_Debug: 5) YResolution,72
00000060 00:46:15 RT_Debug: 6) ResolutionUnit,Inch
00000061 00:46:15 RT_Debug: 7) DateTime,2012:03:16 16:25:31
00000062 00:46:15 RT_Debug: 8) Artist,
00000063 00:46:15 RT_Debug: 9) YCbCrPositioning,Co-Sited
00000064 00:46:15 RT_Debug: 10) Copyright,
00000065 00:46:15 RT_Debug: 11) ExifOffset,360
00000066 00:46:15 RT_Debug: 12) ExposureTime,1/60 seconds
00000067 00:46:15 RT_Debug: 13) FNumber,5.60
00000068 00:46:15 RT_Debug: 14) ExposureProgram,Normal program
00000069 00:46:15 RT_Debug: 15) ISOSpeedRatings,400
00000070 00:46:15 RT_Debug: 16) ExifVersion,0221
00000071 00:46:15 RT_Debug: 17) DateTimeOriginal,2012:03:16 16:25:31
00000072 00:46:15 RT_Debug: 18) DateTimeDigitized,2012:03:16 16:25:31
00000073 00:46:15 RT_Debug: 19) ComponentsConfiguration,YCbCr
00000074 00:46:15 RT_Debug: 20) ShutterSpeedValue,1/64 seconds
00000075 00:46:15 RT_Debug: 21) ApertureValue,F 5.66
00000076 00:46:15 RT_Debug: 22) ExposureBiasValue,0
00000077 00:46:15 RT_Debug: 23) MeteringMode,Multi-segment
00000078 00:46:15 RT_Debug: 24) Flash,Flash fired, Compulsory flash mode
00000079 00:46:15 RT_Debug: 25) FocalLength,55 mm
00000080 00:46:15 RT_Debug: 26) UserComment,
00000081 00:46:15 RT_Debug: 27) SubsecTime,17
00000082 00:46:15 RT_Debug: 28) SubsecTimeOriginal,17
00000083 00:46:15 RT_Debug: 29) SubsecTimeDigitized,17
00000084 00:46:15 RT_Debug: 30) FlashPixVersion,0100
00000085 00:46:15 RT_Debug: 31) ColorSpace,sRGB
00000086 00:46:15 RT_Debug: 32) ExifImageWidth,4752
00000087 00:46:15 RT_Debug: 33) ExifImageHeight,3168
00000088 00:46:15 RT_Debug: 34) InteroperabilityOffset,8380
00000089 00:46:15 RT_Debug: 35) FocalPlaneXResolution,5315.44
00000090 00:46:15 RT_Debug: 36) FocalPlaneYResolution,5342.33
00000091 00:46:15 RT_Debug: 37) FocalPlaneResolutionUnit,Inch
00000092 00:46:15 RT_Debug: 38) CustomRendered,Normal process
00000093 00:46:15 RT_Debug: 39) ExposureMode,Auto
00000094 00:46:15 RT_Debug: 40) White Balance,Auto
00000095 00:46:15 RT_Debug: 41) SceneCaptureType,Standard
00000096 00:46:15 RT_Debug:
RT_Stats v1.02, below of from mediafire account in sig:
http://forum.doom9.org/showthread.php?t=165479
wiseant
23rd August 2012, 02:00
StainlessS:
Thanks
I couldn't get any output so I did this:
blankclip()
a = RT_ReadTxtFromFile("D:\dirlist3.txt",0)
filename = ("D:\RTReadText_Test.txt")
writefile(last,filename,"a", append=true)
dirlist3.txt is a 14 line text file
The writefile, RTReadText_Test.txt had eight full lines and then the 9th line ->
d:\apr16\h
and it stopped there
P.S. I don't want to take you from what you need to do - just wanted to let you know . . .
StainlessS
23rd August 2012, 02:25
@wiseant
I'm not altogether sure what you are trying to do there, you do know that 'a' will be a 14 line string ?
I'm guessing that writefile is totally confused.
WriteFile (clip, string filename, string expression1 [, string expression2 [, ...]], bool "append", bool "flush")
EDIT, Ill do a conversion of your previously posted script (the last working one).
StainlessS
23rd August 2012, 03:19
Your Video conversion mod
fps=30000.0/1001.0
picclip = 0 # Dummy
canvaswidth =640
canvasheight =480
GScript("""
result=RT_WriteFileList("d:\*.avi","AVI.List") # Create a listing file of AVI files
Assert((result!=0), "No AVI files found")
AVILIST=RT_ReadTxtFromFile("AVI.List") # Get list of AVI files
FILES=RT_TxtQueryLines(AVILIST) # Query Number of lines in String ie number of AVI files.
RT_Debug("Found AVI files = " + String(FILES))
For(i=0,FILES-1) {
FN=RT_TxtGetLine(AVILIST,i) # Filename of avi file i
RT_Debug("Processing AVI File",FN)
k=DirectshowSource(FN).ConvertToYUY2()
iHeight=k.height iWidth=k.width
RT_Debug("Width =",String(k.Width),"Height =",String(k.height))
if (iHeight > iWidth) {
iHeight1 = canvasheight
iWidth1 = (canvasheight * iWidth) / iHeight
x = canvaswidth - iWidth1
x1 = x/2
if (iWidth1 % 2 > 0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,canvasheight).addborders(x1,0,x/2,0,$101010).assumefps(fps)
} else if (iWidth > iHeight) {
iWidth1 = canvaswidth
iHeight1 = (canvaswidth*iHeight)/iWidth
y = canvasheight-iHeight1
y1 = y/2
if (iHeight1 % 2 >0) {
y1 = (y/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(0,y1,0,y/2,$101010).assumefps(fps)
}
if (iHeight1 > canvasheight) {
iHeight1 = canvasheight
iWidth1 = (canvasheight*iWidth)/iHeight
x = canvaswidth-iWidth1
x1 = x/2
if (iWidth1 % 2 >0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(x1,0,x/2,0,$101010).assumefps(fps)
}
RT_Debug("NewWidth =",String(k.Width),"NewHeight =",String(k.height))
picclip = (IsClip(picclip)) ? picclip ++ k : k # Append to clip so far
RT_Debug(" ") # line separator
}
""")
PicClip
And RT_Debug Output
00000021 03:15:20 RT_Debug: Found AVI files = 3
00000022 03:15:20 RT_Debug: Processing AVI File d:\Lexx-S02xE01-Mantrid.avi
00000023 03:15:21 RT_Debug: Width = 512 Height = 384
00000024 03:15:21 RT_Debug: NewWidth = 640 NewHeight = 480
00000025 03:15:21 RT_Debug:
00000026 03:15:21 RT_Debug: Processing AVI File d:\Lexx-S02xE02-Terminal.avi
00000027 03:15:22 RT_Debug: Width = 512 Height = 384
00000028 03:15:22 RT_Debug: NewWidth = 640 NewHeight = 480
00000029 03:15:22 RT_Debug:
00000030 03:15:22 RT_Debug: Processing AVI File d:\Lexx-S02xE03-Lyekka.avi
00000031 03:15:23 RT_Debug: Width = 576 Height = 432
00000032 03:15:23 RT_Debug: NewWidth = 640 NewHeight = 480
00000033 03:15:23 RT_Debug:
Highly recommend that you get Microsoft DebugView, beats working in the dark.
EDIT: I guess that you're gonna want a multiline string sorting func, maybe soon.
StainlessS
23rd August 2012, 04:43
And a small alteration to ascertain max clip dimensions before resize/splice, perhaps to your liking.
@Filker, you might also want to use the mod.
fps=30000.0/1001.0
GScript("""
picclip = 0 # Dummy
result=RT_WriteFileList("d:\*.avi","AVI.List") # Create a listing file of AVI files
Assert((result!=0), "No AVI files found")
AVILIST=RT_ReadTxtFromFile("AVI.List") # Get list of AVI files
FILES=RT_TxtQueryLines(AVILIST) # Query Number of lines in String ie number of AVI files.
RT_Debug("Found AVI files = " + String(FILES))
# Prescan to ascertain max wid/hit of all clips
MAXH=0 MAXW=0 # init max wid and hit
For(i=0,FILES-1) {
FN=RT_TxtGetLine(AVILIST,i) # Filename of avi file i
RT_Debug("Getting AVI File dimensions",FN)
k=DirectshowSource(FN)
H=k.height W=k.width
If(MAXH<H) {MAXH=H}
If(MAXW<W) {MAXW=W}
RT_Debug("MAX Width So Far =",String(MAXW),"MAX Height So Far =",String(MAXH))
}
RT_Debug(" ") # line separator
canvaswidth =MAXW # Max dims of all clips
canvasheight =MAXH
For(i=0,FILES-1) {
FN=RT_TxtGetLine(AVILIST,i) # Filename of avi file i
RT_Debug("Processing AVI File",FN)
k=DirectshowSource(FN).ConvertToYUY2()
iHeight=k.height iWidth=k.width
RT_Debug("Width =",String(iWidth),"Height =",String(iheight))
if (iHeight > iWidth) {
iHeight1 = canvasheight
iWidth1 = (canvasheight * iWidth) / iHeight
x = canvaswidth - iWidth1
x1 = x/2
if (iWidth1 % 2 > 0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,canvasheight).addborders(x1,0,x/2,0,$101010).assumefps(fps)
} else if (iWidth > iHeight) {
iWidth1 = canvaswidth
iHeight1 = (canvaswidth*iHeight)/iWidth
y = canvasheight-iHeight1
y1 = y/2
if (iHeight1 % 2 >0) {
y1 = (y/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(0,y1,0,y/2,$101010).assumefps(fps)
}
if (iHeight1 > canvasheight) {
iHeight1 = canvasheight
iWidth1 = (canvasheight*iWidth)/iHeight
x = canvaswidth-iWidth1
x1 = x/2
if (iWidth1 % 2 >0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(x1,0,x/2,0,$101010).assumefps(fps)
}
RT_Debug("NewWidth =",String(k.Width),"NewHeight =",String(k.height))
picclip = (IsClip(picclip)) ? picclip ++ k : k # Append to clip so far
RT_Debug(" ") # line separator
}
""")
PicClip
RT_Debug o/p
00000031 04:38:54 RT_Debug: Found AVI files = 3
00000032 04:38:54 RT_Debug: Getting AVI File dimensions d:\Lexx-S02xE01-Mantrid.avi
00000033 04:38:56 RT_Debug: MAX Width So Far = 512 MAX Height So Far = 384
00000034 04:38:56 RT_Debug: Getting AVI File dimensions d:\Lexx-S02xE02-Terminal.avi
00000035 04:38:57 RT_Debug: MAX Width So Far = 512 MAX Height So Far = 384
00000036 04:38:57 RT_Debug: Getting AVI File dimensions d:\Lexx-S02xE03-Lyekka.avi
00000037 04:38:57 RT_Debug: MAX Width So Far = 576 MAX Height So Far = 432
00000038 04:38:57 RT_Debug:
00000039 04:38:57 RT_Debug: Processing AVI File d:\Lexx-S02xE01-Mantrid.avi
00000040 04:38:58 RT_Debug: Width = 512 Height = 384
00000041 04:38:58 RT_Debug: NewWidth = 576 NewHeight = 432
00000042 04:38:58 RT_Debug:
00000043 04:38:58 RT_Debug: Processing AVI File d:\Lexx-S02xE02-Terminal.avi
00000044 04:38:59 RT_Debug: Width = 512 Height = 384
00000045 04:38:59 RT_Debug: NewWidth = 576 NewHeight = 432
00000046 04:38:59 RT_Debug:
00000047 04:38:59 RT_Debug: Processing AVI File d:\Lexx-S02xE03-Lyekka.avi
00000048 04:39:00 RT_Debug: Width = 576 Height = 432
00000049 04:39:00 RT_Debug: NewWidth = 576 NewHeight = 432
00000050 04:39:00 RT_Debug:
wiseant
23rd August 2012, 05:28
StainlessS - you are freakin' awesome!
I had a look at some of your other tools: exblend and showchannels - very nice
[you gotta be one of the more under-appreciated folks around here]
StainlessS
23rd August 2012, 18:08
You're welcome.
If you make changes/improvements to your resizing code, please post here, I'm probably gonna rob it. :)
wiseant
23rd August 2012, 22:15
StainlessS:
I did a test last night - 14 clips = 11.7 GB = 12 hours 34 min - resized to 640x480 - took 7 seconds to load into AvsP on my relatively slow computer
I probably will make a couple of changes:
- I tried a resize to 1280x720 - wouldn't work in YUY2 - had to go to RGB
- there is a problem if the user wants to resize to 352x480 for DVD
Also, right now it wont work if any of the clips are w/o audio - need to check for this and add "blank" audio
And, I need to look into checking fps - if 23.976/24/25 - do a audio conversion for 25 fps - and have to deal with mixing 23.976/24/25 with 29.97 - perhaps some sort of pulldown - if for DVD
StainlessS
24th August 2012, 07:03
perhaps some sort of pulldown - if for DVD
Well thats some of what I had to get back to. (Still have not managed yet).
I will post another script, but there is a bug in recent RT_stats, dont know how or when it happened,
I think it was a case of hi-lited text being deleted when you move the cursor (windows being helpful).
Would appear in RT_AverageLuma in RGB,
ie
env->AddFunction("RT_AverageLuma", "c[n]i[delta]i[x]i[y]i[w]i[h]i[Interlaced]b[matrix]i",RT_AverageLuma, 0);
somehow got changed to this:
env->AddFunction("RT_AverageLuma", "c[n]i[delta]i[x]i[y]i[w]i[h]i[Interlaced]b",RT_AverageLuma, 0);
ie the matrix arg somehow get deleted.
Anyway, I've currently implemented multiple wildcards in a file extension as in eg "D:\pic\*.bmp|jpg|jpeg|png"
for the write file thing, whatever its called.
In current script I have, have implemented Auto Cropping of black borders and Auto Levels, Same script for both Video/Pics, just change a Define,
and a bit more.
Still have not really looked at your crop/addborders part, but it works damn good, no errors EVER as yet, am really gonna rob it.
be good. :)
wiseant
24th August 2012, 21:56
StainlessS:
1. got debugview - set filters - working fine, except for unfiltered text:
00000125 8:19:03 PM [3520] 20:19:03: No accel key found, accel string ignored.
00000127 8:19:03 PM [3520] 20:19:03: No accel key found, accel string ignored.
my filters.ini:
DebugView Filter Definition File v1.0
*
Unknown accel modifier:; No accel key found; DllMain
2. I made some changes to Image Resizer - will post later today
3. I made some changes to Video Joiner - will post later today
based on this thread: http://forum.doom9.org/showthread.php?p=1588482#post1588482
changefps( XX * 2 ) # XX = your destination framerate
separatefields()
selectevery(4,0,3)
weave()
Though, that is for progressive input only. (For interlaced input you'd first bob, then use XX*1.)
if any video is 29.970/30 fps, then video with 23.976/24/25 will be converted using the above CODE.
if any video has no audio, will use:
.addaudio()
and for audio:
resampleaudio(48000) for DVD
feed the avs to HCEnc and do the audio to ac3 with VDub or aften cli
3. re resizing video
I think the only resolution I need to be concerned about is 352x480 for 1/2 DVD
4. re video joiner
if there are no 29.970/30 fps clips, I need to implement a procedure to convert 23.976/24/25 fps to common fps maintaining video/audio sync
5. nice:
Anyway, I've currently implemented multiple wildcards in a file extension as in eg "D:\pic\*.bmp|jpg|jpeg|png"
for the write file thing, whatever its called.
Filker
25th August 2012, 03:59
StainlessS: Based on your code I made this script that will read all jpegs in the current dir and resize them to 1920x1080, hopefully keeping original ratio and cropping to 16:9 narrower ratios (mostly 16:10 in my case) and adding borders to pictures where height>=width.
Wish I had figured out sooner that adding .0 to the end of numbers and multiplying by 1.0 is a must to keep things floating the intended way.
It shouldn't be hard to load the csv files and turn or flip pictures according to orientation variable, just have to automate the extraction of exif info from jpegs to csv.
Is there a way to call jpegexiforient and get the stdout to a variable in avisynth?
GScript("""
picclip = 0 # Dummy
result=RT_WriteFileList("*.jpg","jpg.List") # Create a listing file of jpg files
Assert((result!=0), "No JPEG files found")
JPGLIST=RT_ReadTxtFromFile("jpg.List") # Get list of jpg files
FILES=RT_TxtQueryLines(JPGLIST) # Query Number of lines in String ie number of jpg files.
RT_Debug("Found JPEG files = " + String(FILES))
#assert ratio
For(i=0,FILES-1) {
FN=RT_TxtGetLine(JPGLIST,i) # Filename of jpg file i
RT_Debug("Processing JPEG File",FN)
k=Imagesource(file = FN, end=0)
iRatio=(k.width*1.0/k.height*1.0)
iWratio=(k.width/1920.0)
iHratio=(k.height/1080.0)
adjheight= k.height/iWratio
RT_Debug("ratio =",String(iratio))
#if picture's ratio is squared or height>width
if (iRatio <= 1.0) {
adjwidth=round(k.width/iHratio)
k = k.bilinearresize(adjwidth,1080).AddBorders(round((1920.0-adjwidth)/2), 0,floor((1920.0-adjwidth)/2), 0)
}
#if picture's ratio is less than 16:9 and width>height
else if (iRatio >1.0){
cropS= (adjheight-1080.0)*iWratio
cropSt=round(cropS/2)
cropSb=Floor(cropS/2)
k=crop(k,0,cropSt,0,-cropSb)
k = k.bilinearresize(1920,1080)
}
#if picture's ratio is 16:9
if ( iRatio == 16.0/9.0) {
k = k.bilinearresize(1920,1080)
}
#stop
# RT_Debug("NewWidth =",String(k.Width),"NewHeight =",String(k.height))
picclip = (IsClip(picclip)) ? picclip ++ k : k # Append to clip so far
# RT_Debug(" ") # line separator
}
""")
PicClip
StainlessS
25th August 2012, 04:39
@Filker,
see here (Is there a way to call jpegexiforient):
http://forum.doom9.org/showthread.php?t=46506
Can get its output using RT_ReadTxtFromFile, as with previous exif example (assuming that was the source of those exif files).
iRatio=(k.width*1.0/k.height*1.0)
same as
iRatio=(Float(k.width) /k.height)
ie only one need be float (1st maybe best).
Still working on RT_Stats and Your/wiseant scripts, will come back in a day or two.
wiseant
25th August 2012, 11:28
Here's the logic for the resize and crop
with canvaswidth ==>canvasheight
1.
a) if the height is greater than the width - we want to set the height to canvasheight - 'cause we know if we set the width to canvaswidth [1920] - the height will exceed not only the canvasheight but the canvaswidth as well
b) then we resize the width proportionately - compare this new width with the canvaswidth = border needed - we need to have left/right borders
when we divide the border into two - there made be a rounding down - a border of 801 = left and right borders of 400 - so we need to add 1 to either side
2.
a) if the width is greater than the height - we want to set the width to canvaswidth
then b)
3. but with this canvaswidth of 1920 in 2. - the height might exceed 1080 - so we need to do an adjustment - we set the height to canvasheight - and adjust the width accordingly and then do the border thing
If the user has a mix of landscape and portrait it is probably best [can I use that word?] to have canvaswidth==canvasheight
re the video-joiner:
I joined one of each: 23.976, 24, 25 fps using 1920x1080 and 1280x720 music videos resized to 320x180, e.g.
DirectshowSource("D:\join_1.mp4").assumefps(24, sync_audio=true).resampleaudio(48000)
all audio/video in sync
still a problem adding blank audio to a clip without audio - for all clips to splice
and
changefps( XX * 2 ) # XX = your destination framerate
separatefields()
selectevery(4,0,3)
weave()
Though, that is for progressive input only. (For interlaced input you'd first bob, then use XX*1.)
worked with 10 hours of 29.97, 30, 23.976, 24, and 25 fps
StainlessS
25th August 2012, 14:58
@wiseant,
1. got debugview - set filters - working fine, except for unfiltered text:
00000125 8:19:03 PM [3520] 20:19:03: No accel key found, accel string ignored.
00000127 8:19:03 PM [3520] 20:19:03: No accel key found, accel string ignored.
my filters.ini:
DebugView Filter Definition File v1.0
*
Unknown accel modifier:; No accel key found; DllMain
Sorry, no idea what you're talking about. I dont seem to have a filters.ini
Messages in debugview might come from several sources, any program can write output
to the debugging stream (which normally just goes down the plug hole if no debug monitor
captures it).
Sorry to tell you, have abandoned your resize logic, had probs with some pics/clips. (EDIT: your old logic)
What Ive got currently has been tested on ~ 650+ pics from a well known series
of centerfolds, most of them either very wide (~3600x1200) or very tall (~1200x3600)
and my current logic works great, can specify required canvas FAR and a maximum dimension (limit).
What I implemented is based on frame aspect ratios and and comparisons between them.
Gotta get back to the RT_Stats thing, so that I can post my current script in working form.
EDIT: Also abandoned RGB24 with Addborders, there is a bug in 2.58 and 2.6a3, using RGB32
with a convert to RGB24 when all pics spliced together.
wiseant
26th August 2012, 00:43
StainlessS:
I found some very big bmp's:
Width = 1216 Height = 10668
Width = 2240 Height = 8316
Width = 2400 Height = 8910
Width = 2400 Height = 8910
Width = 4490 Height = 3370
Width = 4490 Height = 3707
Width = 4480 Height = 3696
Width = 4480 Height = 6720
Width = 3840 Height = 11520
Width = 3840 Height = 5760
Width = 2400 Height = 7200
Width = 1800 Height = 2280
Width = 1080 Height = 3800
Width = 3600 Height = 4560
Width = 2432 Height = 3360
Width = 3040 Height = 3360
Width = 1600 Height = 5940
Width = 3200 Height = 11880
Width = 868 Height = 94
Width = 2560 Height = 1800
Width = 2560 Height = 1800
Width = 2560 Height = 1800
Width = 3200 Height = 3600
Width = 1920 Height = 2160
Width = 1440 Height = 1620
Width = 1600 Height = 720
Width = 1280 Height = 576
Width = 960 Height = 540
Width = 1344 Height = 756
Width = 1920 Height = 1080
the new code worked for landscape and portrait modes
new code for image resizer [bmp]
fps = 1
end=fps-1
GScript("""
picclip = 0 # Dummy
result=RT_WriteFileList("d:\April23\TESTS\*.bmp","Images-bmp.List") # Create a listing file of BMP files
Assert((result!=0), "No BMP files found")
BMPLIST=RT_ReadTxtFromFile("Images-bmp.List") # Get list of BMP files
FILES=RT_TxtQueryLines(BMPLIST) # Query Number of lines in String ie number of BMP files.
RT_Debug("Found BMP files = " + String(FILES))
RT_Debug(" ") # line separator
canvaswidth = 432 # Max dims of all Images
canvasheight = 1024
For(i=0,FILES-1) {
FN=RT_TxtGetLine(BMPLIST,i) # Filename of BMP file i
RT_Debug("Processing BMP File",FN)
k=ImageReader(FN,end=end).ConvertToRGB24()
iHeight=k.height iWidth=k.width
RT_Debug("Width =",String(iWidth),"Height =",String(iheight))
if (iHeight >= iWidth) {
iHeight1 = canvasheight
iWidth1 = (canvasheight * iWidth) / iHeight
x = canvaswidth - iWidth1
x1 = x/2
if (iWidth1 % 2 > 0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,canvasheight).addborders(x1,0,x/2,0,$101010)
}
if (iWidth > iHeight) {
iWidth1 = canvaswidth
iHeight1 = (canvaswidth*iHeight)/iWidth
y = canvasheight-iHeight1
y1 = y/2
if (iHeight1 % 2 >0) {
y1 = (y/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(0,y1,0,y/2,$101010)
}
if (iwidth1 > canvaswidth) {
iwidth1 = canvaswidth
iheight1 = (canvaswidth*iheight)/iwidth
y = canvasheight-iheight1
y1 = y/2
if (iheight1 % 2 >0) {
y1 = (y/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(0,y1,0,y/2,$101010)
}
if (iHeight1 > canvasheight) {
iHeight1 = canvasheight
iWidth1 = (canvasheight*iWidth)/iHeight
x = canvaswidth-iWidth1
x1 = x/2
if (iWidth1 % 2 >0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(x1,0,x/2,0,$101010)
}
RT_Debug("NewWidth =",String(k.Width),"NewHeight =",String(k.height))
picclip = (IsClip(picclip)) ? picclip ++ k : k # Append to clip so far
RT_Debug(" ") # line separator
}
""")
PicClip
assumefps(fps)
Filker
26th August 2012, 17:40
I'm using exiftool and exiftoolgui to produce txt files for each jpeg in the folder.
http://owl.phy.queensu.ca/~phil/exiftool/
http://u88.n24.queensu.ca/~bogdan/
Using StainlessS' excellent plugin and help, now I can rotate and crop (mostly DSLR 3:2 to 16:9) or addborders to vertical pictures of all the jpeg files in a dir to 1920x1080.
Notes:
My camera's exif's orientation data is the 21st line in the file produced by exiftool. Check you camera's exif and adjust accordingly.
Having other .txt files in the directory will prevent the script from working
Edit:
Pictures wider than 16:9 weren't resizing correctly.
Added writing function. Pictures will be written to original folder resized without the added black borders. I don't understand how Imagewriter naming works, it always adds six zeros to the end of the name, doesn't seem to work as documented (Avisynth 2.6, build Sep 27 2009 here).
GScript("""
picclip = 0 # Dummy
result=RT_WriteFileList("*.txt","txt.List") # Create a listing file of txt files
Assert((result!=0), "No txt files found")
TXTLIST=RT_ReadTxtFromFile("txt.List") # Get list of txt files
FILESt=RT_TxtQueryLines(TXTLIST) # Query Number of lines in String ie number of txt files.
for(f=0,FILESt-1) {
FN=RT_TxtGetLine(TXTLIST,f) # Filename of txt file
TXT=RT_ReadTxtFromFile(FN) # Read TXT file into TXT string
LINES=RT_TxtQueryLines(TXT) # Query Number of lines in TXT String
TXT_LINE = RT_TxtGetLine(TXT,20) # Get line 21 (orientation in exif), to do: write routine to find orientation line if not #21.
#orientation
TXT_LINE=RightStr(TXT_LINE,StrLen(TXT_LINE)-34) # info starts at column 34
#get jpeg filename from txt filename
FNj=LeftStr(FN,StrLen(FN)-4)+".JPG"
k=Imagesource(file = FNj, end=0)
FNj2=LeftStr(FN,StrLen(FN)-4) # used later on to name image file
#Rotate/flip according to exif:
if (TXT_LINE=="Mirror horizontal"){
k=k.FlipHorizontal()
}
if (TXT_LINE=="Rotate 180"){
k=k.Turn180()
}
if (TXT_LINE=="Mirror horizontal"){
k=k.FlipVertical()
}
if (TXT_LINE=="Mirror horizontal and rotate 270 CW"){
k=k.FlipVertical().TurnLeft()
}
if (TXT_LINE=="Rotate 90 CW"){
k=k.TurnRight()
}
if (TXT_LINE=="Mirror horizontal and rotate 90 CW"){
k=k.FlipHorizontal().TurnRight()
}
if (TXT_LINE=="Rotate 270 CW"){
k=k.TurnLeft()
}
if (TXT_LINE=="Horizontal (normal)") {
k=k
}
#assert ratio
iRatio=(k.width*1.0/k.height*1.0)
iWratio=(k.width/1920.0)
iHratio=(k.height/1080.0)
adjheight= k.height/iWratio
RT_Debug("ratio =",String(iratio))
adjwidth=round(k.width/iHratio)
#if picture's ratio is squared or height>width, resize height to 1080 and addborders to get 1920 width
if (iRatio <= 1.0) {
k = k.bilinearresize(adjwidth,1080).ImageWriter( file = FNj2+"p", type = "jpg") #save image without borders
k=k.AddBorders(round((1920.0-adjwidth)/2), 0,floor((1920.0-adjwidth)/2), 0) #addborders left/right to comply with video size
}
#if picture's ratio is not 16:9 and width>height, crop top and bottom to get 16:9 then resize
if (iRatio >1.0){
cropS= (adjheight-1080.0)*iWratio
#if there's top/bottom cropping to do (cropS>0)
if(cropS>0) {
cropSt=round(cropS/2)
cropSb=Floor(cropS/2)
k=crop(k,0,cropSt,0,-cropSb)
k = k.bilinearresize(1920,1080).ImageWriter( file = FNj2+"p", type = "jpg")
}
#if picture is wider than 16:9 cropS<0
if(cropS<0) {
#adjust height
k= k.bilinearresize(1920,round(adjheight)).ImageWriter( file = FNj2+"p", type = "jpg") #save image without borders
k=k.AddBorders(0, round((1080.0-adjheight)/2),0, floor((1080.0-adjheight)/2)) #addborders top/bottom to comply with video size
}
}
#if picture's ratio is 16:9, just resize
if ( iRatio == 16.0/9.0) {
k = k.bilinearresize(1920,1080).ImageWriter( file = FNj2+"p", type = "jpg") #resize and write image to jpeg
}
picclip = (IsClip(picclip)) ? picclip ++ k : k # Append to clip so far
# RT_Debug(" ") # line separator
}
""")
PicClip
wiseant
27th August 2012, 03:52
New script for processing a mixture of .avi. wmv, .mp4 video with or without audio - this example gave me:
Video
length = 4:56:34.14
Audio
length = 4:56:34.08
finalwidth=640
finalheight=480
finalaudio=48000
all30=" "
GScript("""
picclip = 0 # Dummy
result=RT_WriteFileList("d:\MYAvi\mixed\*.*","AVI.List") # Create a listing file of AVI files
Assert((result!=0), "No AVI files found")
AVILIST=RT_ReadTxtFromFile("AVI.List") # Get list of AVI files
FILES=RT_TxtQueryLines(AVILIST) # Query Number of lines in String ie number of AVI files.
RT_Debug("Found AVI files = " + String(FILES))
RT_Debug(" ") # line separator
canvaswidth = 640
canvasheight = 480
For(i=0,FILES-1) {
FN=RT_TxtGetLine(AVILIST,i)
ifps = DirectshowSource(FN).framerate
if (ifps>=25) {
all30 = "yes"
}
}
if (all30=="yes") {
RT_Debug("all clips will be 30000.0/1001.0 fps - interlaced")
}
else {
RT_Debug("all clips will be 24 fps - progressive")
}
RT_Debug(" ")
For(i=0,FILES-1) {
FN = RT_TxtGetLine(AVILIST,i) # Filename of avi file i
RT_Debug("Processing AVI File",FN)
k = directshowsource(FN).converttoyuy2()
iaudio = directshowsource(FN).AudioLength()
if (iaudio==0) {
k = DirectshowSource(FN).addaudio().converttoyuy2()
}
else {
k = DirectshowSource(FN).converttoyuy2
}
ifps = directshowsource(FN).framerate
if (all30<>"yes") {
k = k.assumefps(24, sync_audio=true).converttoyuy2(interlaced=false).SSRC(finalaudio)
}
else {
k = k.changefps( 30000.0/1001.0 * 2).bob().separatefields().selectevery(4,0,3).weave().converttoyuy2(interlaced=true).SSRC(finalaudio)
}
iHeight = k.height
iWidth = k.width
RT_Debug("Width =",String(iWidth),"Height =",String(iheight),"Framerate = ",String(ifps))
RT_Debug("Audio Samples =",String(iaudio))
if (iHeight >= iWidth) {
iHeight1 = canvasheight
iWidth1 = (canvasheight * iWidth) / iHeight
x = canvaswidth - iWidth1
x1 = x/2
if (iWidth1 % 2 > 0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,canvasheight).addborders(x1,0,x/2,0,$101010)
}
if (iWidth > iHeight) {
iWidth1 = canvaswidth
iHeight1 = (canvaswidth*iHeight)/iWidth
y = canvasheight-iHeight1
y1 = y/2
if (iHeight1 % 2 >0) {
y1 = (y/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(0,y1,0,y/2,$101010)
}
if (iwidth1 > canvaswidth) {
iwidth1 = canvaswidth
iheight1 = (canvaswidth*iheight)/iwidth
y = canvasheight-iheight1
y1 = y/2
if (iheight1 % 2 >0) {
y1 = (y/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(0,y1,0,y/2,$101010)
}
if (iHeight1 > canvasheight) {
iHeight1 = canvasheight
iWidth1 = (canvasheight*iWidth)/iHeight
x = canvaswidth-iWidth1
x1 = x/2
if (iWidth1 % 2 >0) {
x1 = (x/2) + 1
}
k = k.bilinearresize(iWidth1,iHeight1).addborders(x1,0,x/2,0,$101010)
}
RT_Debug("NewWidth =",String(k.Width),"NewHeight =",String(k.height))
picclip = (IsClip(picclip)) ? picclip ++ k : k # Append to clip so far
RT_Debug(" ") # line separator
}
""")
PicClip
and RT_Debug output:
00000034 7:40:58 PM [8900] SSETools 0.1
00000035 7:40:59 PM [8900] RT_Debug: Found AVI files = 15
00000036 7:40:59 PM [8900] RT_Debug:
00000433 7:41:05 PM [8900] RT_Debug: all clips will be 30000.0/1001.0 fps - interlaced
00000434 7:41:05 PM [8900] RT_Debug:
00000435 7:41:05 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip1.avi
00000517 7:41:06 PM [8900] RT_Debug: Width = 532 Height = 372 Framerate = 29.970089
00000518 7:41:06 PM [8900] RT_Debug: Audio Samples = 0
00000519 7:41:06 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00000520 7:41:06 PM [8900] RT_Debug:
00000521 7:41:06 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip2.wmv
00000612 7:41:08 PM [8900] RT_Debug: Width = 720 Height = 576 Framerate = 25.000000
00000613 7:41:08 PM [8900] RT_Debug: Audio Samples = 28176372
00000614 7:41:08 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00000615 7:41:08 PM [8900] RT_Debug:
00000616 7:41:08 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip3.mp4
00000729 7:41:10 PM [8900] RT_Debug: Width = 1920 Height = 1080 Framerate = 24.993378
00000730 7:41:10 PM [8900] RT_Debug: Audio Samples = 7221168
00000731 7:41:10 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00000732 7:41:10 PM [8900] RT_Debug:
00000733 7:41:10 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip4.avi
00000852 7:41:11 PM [8900] RT_Debug: Width = 640 Height = 480 Framerate = 29.969999
00000853 7:41:11 PM [8900] RT_Debug: Audio Samples = 121999938
00000854 7:41:11 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00000855 7:41:11 PM [8900] RT_Debug:
00000856 7:41:11 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip5.mp4
00000931 7:41:12 PM [8900] RT_Debug: Width = 1280 Height = 720 Framerate = 24.995064
00000932 7:41:12 PM [8900] RT_Debug: Audio Samples = 0
00000933 7:41:12 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00000934 7:41:12 PM [8900] RT_Debug:
00000935 7:41:12 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip6.wmv
00001026 7:41:14 PM [8900] RT_Debug: Width = 768 Height = 576 Framerate = 25.000000
00001027 7:41:14 PM [8900] RT_Debug: Audio Samples = 74874864
00001028 7:41:14 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00001029 7:41:14 PM [8900] RT_Debug:
00001030 7:41:14 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip7.mp4
00001143 7:41:16 PM [8900] RT_Debug: Width = 1280 Height = 720 Framerate = 29.967037
00001144 7:41:16 PM [8900] RT_Debug: Audio Samples = 15543504
00001145 7:41:16 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00001146 7:41:16 PM [8900] RT_Debug:
00001147 7:41:16 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip8.mp4
00001260 7:41:17 PM [8900] RT_Debug: Width = 1920 Height = 1080 Framerate = 23.991516
00001261 7:41:17 PM [8900] RT_Debug: Audio Samples = 9275280
00001262 7:41:17 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00001263 7:41:17 PM [8900] RT_Debug:
00001264 7:41:17 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip9.wmv
00001355 7:41:19 PM [8900] RT_Debug: Width = 640 Height = 480 Framerate = 29.969999
00001356 7:41:19 PM [8900] RT_Debug: Audio Samples = 10422550
00001357 7:41:19 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00001358 7:41:19 PM [8900] RT_Debug:
00001359 7:41:19 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip10.mp4
00001472 7:41:21 PM [8900] RT_Debug: Width = 2048 Height = 872 Framerate = 23.998886
00001473 7:41:21 PM [8900] RT_Debug: Audio Samples = 42627072
00001474 7:41:21 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00001475 7:41:21 PM [8900] RT_Debug:
00001476 7:41:21 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip11.avi
00001514 7:41:21 PM [8900] RT_Debug: Width = 664 Height = 480 Framerate = 29.969999
00001515 7:41:21 PM [8900] RT_Debug: Audio Samples = 0
00001516 7:41:21 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00001517 7:41:21 PM [8900] RT_Debug:
00001518 7:41:21 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip12.mp4
00001631 7:41:23 PM [8900] RT_Debug: Width = 1920 Height = 1080 Framerate = 23.972767
00001632 7:41:23 PM [8900] RT_Debug: Audio Samples = 14600592
00001633 7:41:23 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00001634 7:41:23 PM [8900] RT_Debug:
00001635 7:41:23 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip13.avi
00001754 7:41:25 PM [8900] RT_Debug: Width = 576 Height = 432 Framerate = 29.969999
00001755 7:41:25 PM [8900] RT_Debug: Audio Samples = 238263552
00001756 7:41:25 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00001757 7:41:25 PM [8900] RT_Debug:
00001758 7:41:25 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip14.wmv
00001849 7:41:27 PM [8900] RT_Debug: Width = 480 Height = 360 Framerate = 29.969999
00001850 7:41:27 PM [8900] RT_Debug: Audio Samples = 210327504
00001851 7:41:27 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00001852 7:41:27 PM [8900] RT_Debug:
00001853 7:41:27 PM [8900] RT_Debug: Processing AVI File d:\MYAvi\mixed\clip15.mp4
00001966 7:41:28 PM [8900] RT_Debug: Width = 1280 Height = 720 Framerate = 23.972193
00001967 7:41:28 PM [8900] RT_Debug: Audio Samples = 12358320
00001968 7:41:28 PM [8900] RT_Debug: NewWidth = 640 NewHeight = 360
00001969 7:41:28 PM [8900] RT_Debug:
haven't figured out a way as yet to splice audio if more than 2 channels
Updated - August 28 - made some changes to the script
canvaswidth = 640
canvasheight = 480
...
if (ifps>=25) {
all30 = "yes"
}
...
else {
k= k.changefps( 30000.0/1001.0 * 2).bob().separatefields().selectevery(4,0,3).weave().converttoyuy2(interlaced=true).SSRC(finalaudio)
}
This way anything with fps>= 25 will be "converted" to interlaced - load avs in VirtualDub and scan for interlaced content - if none - then encode as progressive - otherwise encode as interlaced
wiseant
27th August 2012, 06:51
Working on this - hope to have something tomorrow
StainlessS
27th August 2012, 10:15
@ Wiseant
I see that you've gotten into RT_Debug, dont know why but it's my fav plug,
woz just a silly idea, but would not want to be without it now.
PS, any chance of a copy of eg Width = 3840 Height = 11520 pic for test purposes,
or any about same size.
wiseant
27th August 2012, 22:50
@StainlessS
RT_Debug opens up so many possibilities - it was exactly what I was looking for re opening up a folder of images/videos - this, along with GScript is freakin' awesome
I can get you some large images - what format do you prefer - bmp/tga/png/jpg?
I'll look to upload them somewhere . . .
Right now I am looking for a way to determine if a clip is interlaced or not - seems that decomb should do the job - any suggestions?
Also, re the video joiner - looks like it works with clips with no audio and/or 2-channel audio - but introducing multi-channel audio will create a problem - unless all clips have the same multi-channel audio
Last night I took 804 [cf] jpgs ranging from 9040x4275, 4211x9420, with most being 1728x792 / 792x1728 - and resized to 4000x3000 [for my 4x3 monitor] - no problems opening in AvsP or VirtualDub - although VDub will probably need > 2GB RAM to process the Image Sequence
StainlessS
27th August 2012, 23:29
Any compressed format would be good, thanks.
looking for a way to determine if a clip is interlaced or not
That was one of the things I have to get back to.
Hopefully up an update for RT_stats tomorrow. (Just doing a string sorting func).
EDIT: PS, I've been doing a mod to the QueryBorderCrop() script and it is now super sensitive
for single frame clips, ie pics, self adjusts the AutoThresh as per Samples arg.
Works great.
wiseant
28th August 2012, 03:40
@StainlessS
http://www.mediafire.com/?4t6ugdvlif6t3fy - [some aren't the greatest quality]
also, when you've got some spare time:
http://forum.videohelp.com/threads/347579-Testing-my-Blu-ray-and-avchd-authoring-application/page3 - last post
I would like to add image sizer and video-joiner to this . . .
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.