Log in

View Full Version : Opening an image sequence in AvS exactly like in VD?


dani75
1st October 2025, 10:25
Good morning everybody.
Sorry if the following question has already been asked, but I can't find the answer in the threads already posted.
VirtualDub is able to export image sequences, and to load such sequences in a very simple way : you only have to select the first image, and it loads exactly the full sequence.
I would like to do the same in an AviSynth(+) script : only select the first image for loading the full sequence.
I have read all the documentation and experimented for some the various functions available for loading image sequences (ImageSource, ImageReader, CoronaSequence). However, I had to specify with expressions how the filenames of the sequence were built, and give the exact number of images in the sequence. I would like to have the behaviour of VD in AviSynth. Is it possible without writing a complex script such as to determine the expressions to use for the filenames of the sequences and the exact number of images in the sequence ?

takla
1st October 2025, 13:41
ffmpeg -framerate 30 -i "path/to/folder/*%04d.png" -c:v utvideo -vf "libplacebo=format=yuv420p:zscale=rin=limited:pin=709:tin=709:min=709:r=limited:p=709:t=709:m=709" OUTPUT.mkv
In case you don't find an answer, you could use ffmpeg to convert the folder to a lossless UT video.
Obvously adjust framerate, format and colorspace to your needs.
If you have more than 9999 frames, adjust *%04d.png to *%05d.png or 06d, etc.

Shirtfull
1st October 2025, 14:17
Open image sequence in vdub.
select sequence range to output.
start vdub frame server and save to avi not vdr.
Then open avi in avisynth using AvsPmod or preferred app.

_Al_
2nd October 2025, 01:25
Well, virtualdub is using some programing to sort this the way it works.

As a sort of seeing it what can be done, I was doing exactly the same things, writing a function for vapoursynth using python, there is a load of logging in that function, so it is clear what happens. Instead of log, print can be used:

def get_num(stem):
''' gets a number from trailing digit part of a base filename (called stem in pathlib)'''
digits = ''
for ch in reversed(stem):
if ch.isdigit(): digits = f'{ch}{digits}'
else: break
digits = digits.lstrip('0')
if digits == '': num = 0
else: num = int(digits)
return num


def only_same_pattern(path, paths):
'''to accept only files for imwri.Read with the same pattern like selected file'''
digits = ''
path_stem = path.stem
for ch in reversed(path_stem):
if ch.isdigit(): digits = f'{ch}{digits}'
else: break
if digits == '': return [path]
same_non_digit_part = path_stem[:-len(digits)]
if same_non_digit_part:
return [p for p in paths if str(p.stem)[:-len(digits)] == same_non_digit_part]
else:
stem_length =len(path_stem)
return [p for p in paths if str(p.stem).isdigit() and len(str(p.stem))==stem_length]


def custom_imwri_Readt(source, **kwargs):
'''
beta, weird results could occur,
the idea is, source is just one image in a python list, that will become first image of new clip where only images of the same name pattern
will be included in a clip

same as imwri.Read() , but:
-passing more arguments possible - fpsnum, fpsden, lastnum
-source cannot be in a printf style form, like "image%06d.png" etc. , use core.imwri.Read() instead if using that
-source must be a single filename or list of filenames.
-if source is a single filename:
-if firstnum is not passed, clip starts with passed source_path, not first image in that directory
-clip is constructed with images only that have the same numbering pattern as selected source_path has
-clip is constructed with images only that have the same extension as selected source_path has
'''
fpsnum = kwargs.pop('fpsnum', None)
fpsden = kwargs.pop('fpsden', 1)
firstnum = kwargs.pop('firstnum', None)
lastnum = kwargs.pop('lastnum', None)
if firstnum is not None: firstnum = int(str(firstnum).strip())
if lastnum is not None: lastnum = int(str(lastnum).strip())
if isinstance(source, (list,tuple)):
paths = [Path(source_path) for source_path in source]
else:
source_path = source
path = Path(source_path)
if not path.is_file():
raise ImwriReadError('[imwri_Read] source must be a filename (filenames will be selected with same '
'numbering pattern and extension) or a python list of filenames only.\n Not in print '
'style form, like "image%06d.png" etc.')
paths = list(path.parent.glob(f'*{path.suffix}'))
if len(paths)>1:
paths = only_same_pattern(path, paths)
if len(paths)>1:
firstnum_loaded = get_num(paths[0].stem)
if firstnum is not None:
firstnum_index = max(firstnum-firstnum_loaded, 0)
if firstnum_index > len(paths):
log(f'firstnum={firstnum}, it is higher than numbering of files, it is ignored')
firstnum_index = 0
else: log(f'firstnum={firstnum}')
else:
log(f'firstnum was not passed, so it was determined by selected source path: {path.name}, '
f'firstnum={get_num(path.stem)}')
firstnum_index = paths.index(path)
if lastnum is not None:
lastnum += 1
lastnum_index = min(lastnum-firstnum_loaded, len(paths))
if lastnum_index <= firstnum_index:
log(f'lastnum={lastnum-1}, it is less than firstnum={firstnum}, it is ignored')
lastnum_index = len(paths)
else: log(f'lastnum={lastnum-1}')
else:
log(f'lastnum was not passed')
lastnum_index = len(paths)
paths = paths[firstnum_index:lastnum_index]
if len(paths)==1: paths_print = f'"{paths[0].name}"'
elif len(paths)<4: paths_print = ', '.join([f'"{p.name}"' for p in paths])
else: paths_print = f'"{paths[0].name}", ...., "{paths[-1].name}"'
clip = core.imwri.Read(list(map(str, paths)), **kwargs)
if isinstance(clip, (tuple,list)):
head='clip,_'
clip = clip[0]
else:
head='clip'
log(f'{head}=core.imwri.Read([{paths_print}]{kwargs_printed(spacer=" "*30,**kwargs)})')
if fpsnum is not None:
log(f'clip.std.AssumeFPS(fpsnum={fpsnum}, fpsden={fpsden})')
return clip.std.AssumeFPS(fpsnum=fpsnum, fpsden=fpsden)
return clip

But the way it looks, there might be already something like that done for Avisynth already.

dani75
6th October 2025, 18:13
Thank you to all three for your answers.
After having analyzed them, I think that I should clarify my purpose : writing an AviSynth subfunction, which would take as single argument the path of an image file (.jpg or .jpeg) which starts an image sequence, and open this last for subsequent calls to filters. Doing it with a CallCmd to VirtualDub opening such a sequence and producing an intermediate video file should be a comfortable way, but I am looking for a simpler but efficient solution.
Looking into ImageSource() documentation, I could easily write the instructions to build the string expression required for the "file" argument, but it seems harder for the "end" argument because the script would have to test the existence of all the files allowed by the expression and compute the "greatest number" embedded in them (this is probably the way _AI_ wrote his function above for VapourSynth, but unfortunately I don't know about Python).
I would like to avoid such complexity. Has anybody a great idea ?

StainlessS
6th October 2025, 20:15
Anything of use in this thread?
Append a still image respecting aspect ratio and possibly adding borders :- https://forum.doom9.org/showthread.php?p=1906414&highlight=imagesplicer#post1906414

Or,

Avisynth w/ GScript and ImageReader - open a series of images :- https://forum.doom9.org/showthread.php?t=165694&highlight=picvidshow

dani75
6th October 2025, 23:40
Hi StainlessS !
Unfortunately not (if I didn't miss anything). The first script uses this feature of ImageSource or ImageReader: "If file points to a single file (no sprintf pattern), then that file is read once and the image subsequently returned for all requested frames".
The second one uses ImageReader with the file argument pointing successively to each image file of a sequence for opening it and appending it to the previous images of the sequence, assuming that we know exactly how many files there are in the sequence.
Thanks however.
It seems therefore that such a function for "Opening an image sequence in AviSynth exactly like in VD" doesn't exist.

wonkey_monkey
7th October 2025, 00:40
Sounds like what's needed is Avisynth function that takes a filename, identifies the number of digits immediately preceding the filetype separator (last .), identifies the number in that place, then counts forward from there, testing each file for existence until it doesn't succeed. Then it should return an array consisting of: wildcarded string ("filename%0[x]d.jpg", where x is the number of digits found), first frame number (number found in original string), and last number. Then those parameters can be passed into imagesource etc.

It doesn't sound like something you could write in a pure Avisynth script [waits for StainlessS to prove me wrong].

StainlessS
7th October 2025, 13:33
OK, will have a go at it.

EDIT:
# ...
If you have more than 9999 frames, adjust *%04d.png to *%05d.png or 06d, etc.
Is an awful lot less bother if you just choose 6 digit variation, ALL of the time (when writing files, 1 million frames will usually be enough).

EDIT: Will only support fixed number of digits at END of name node, ie
"fred0000" OK
"fred00" OK
"fred99", "fred100", NOT OK, 2 digits, then 3 digits. (must use "fred099", "fred100")
"fred0000test" NOT OK, digits not at and of name node.

Harass me if you really MUST have "fred0000test" like usage.

dani75
7th October 2025, 18:21
wonkey_monkey : you described exactly what I had in mind if I had chosen to write a pure AviSynth script for my subfunction. The difficulty comes with that loop for counting forward, because the only way is to use GScript instructions that I am not familiar with. I suspect also that performing all this process in AviSynth(+) to build the arguments to ImageSource will be time consuming. That's why I am rather moving towards the solution of a CallCmd to VirtualDub in command line opening such a sequence through a job and producing an intermediate video file.

StainlessS : specifying "fred%0d" will only read a sequence such as "fred99", "fred100", "fred%03d" will only read a sequence such as "fred099", "fred100", and "fred%06d" will only read a sequence such as "fred000099", "fred000100". "fred%06d" will not be able to read a sequence such as "fred099", "fred100". Therefore the script building the wildcarded string should be a little bit "clever". That's why I was asking for a better solution. Unless somebody tells us he is currently writing a new DLL with a new function for "Opening an image sequence in AviSynth exactly like in VD", I am starting to write the function in pure Avisynth with a CallCmd to VirtualDub.

Thanks anyway.

StainlessS
7th October 2025, 19:21
Dani, please provide a zip of images that adhere to your required variable number of digits format, you can probably post them on SendSpace without an account.
Only need to be eg 32x32 or thereabouts.

EDIT: This is current hack together code, totally untested and probably not working.
Only copes with fixed number of digits. [EDIT: No longer true]

SCRIPT REMOVED, SEE post #18.

EDIT: Defo has bugs in it. [EDITED]

EDIT: Takes filenames like eg ".\IMAGE\Fred_000100.jpg", loads jpegs with 6 digit index, starting from index 100.

EDIT: Not sure that I want to do variable number digits, you should always use 6 digit index, does away with this kind of multi-digit nonsense.
As a temp fix, you could use some kind of bulk file renamer to make sure all files are 6 digit index.

dani75
7th October 2025, 19:50
Using CoronaSequence will probably help solving the problem of having variable number of digits.
I will probably try this solution after I am finished with the CallCmd solution.

Emulgator
7th October 2025, 21:24
Since I sometimes happen to manually delete repeated/obsolete/parent-for-retouched-frames while inspecting with IrfanView I can suggest an easier way:
Pull the frame folder onto den4b ReNamer, press
Rule -> Serialize -> pad with leading zeros to length 6 -> Rename.
On a SSD a pass is done in 1, max 3 sec, (then maybe a second pass is needed if for name collision reasons a (2) had been appended)
After such purging filename holes or doublettes have ceased to exist, and any VD, FFmpeg, AviSynth shall happily digest that sequence.

dani75
7th October 2025, 21:39
Thank you Emulgator, but I want to automatise that task.

StainlessS
7th October 2025, 22:46
I think that if it works, then will support mixed number of digits, where transitions are from eg 99->100 and 999->1000 etc.
[Not eg 63->064, nor 125->0126, which I doubt that Vdub supports either]

This

tmpName = RT_String("%s%s%0*d%s",Path,NameStem,DCnt,i,Ext)

0*=leading zeros to minimum total digit length of DCnt (* inserts DCnt variable value into string)
d is the variable i value converted into the index, but, if i has more digits than DCnt, output digits are expanded, not limited to DCnt digits.
This stuff in several lines above achieves expanding number of digits with transitions of eg 999->1000 [3 digits to 4 digits]
Also, ScanEnd=1000000, artificially limits index number to 1 million, which you could just change to 1000000000 (1Billion) if you like.

I dont currently have any images to test with.
EDIT: After a sleep and re-examine script, think may be working ok, but still untested.
EDIT: Updated script below, AVS+ Only. [still untested]

EDIT: SCRIPT REMOVED

@dani75, please do try the script function and say whether it works ok or not, thanx.

_Al_
8th October 2025, 16:45
... this is probably the way _AI_ wrote his function above for VapourSynth
python uses list object, which is a simple one dimension array of things (in our case paths), and those objects are in a square brackets, example, [path1,path2].

ImageReader for vapoursynth, imwri.Read(), can take that list of paths (one dimensional array of paths) to create a video. That might not be possible in Avisynth.
In vapoursynth yes. So I just getting all paths list (that have same printf format in directory) and getting position index for that given file. Then using simple slicing for whole list I got a new list that start with that given path position. And that new list (array of paths) is passed to vapoursynth imwri.Read source plugin (ImageReader).

Avisynth uses array as well, maybe slicing of that array too, not sure about passing array of paths into ImageReader.

dani75
8th October 2025, 18:40
Dear StainlessS,
thank you for your code. Here are some sequences in order to test it :
https://www.sendspace.com/file/a6axrc
https://www.sendspace.com/file/smv4yv
I am currently writing the solution with CallCmd.

_AI_ : thank you for your explanations !

StainlessS
8th October 2025, 20:20
Script function Updated. [several bugs smashed]

OpenImageSeqLikeVD.avsi [Updated, Tested, Working]

Function OpenImageSeqLikeVD(String fn,Float "fps",bool "use_DevIL", bool "Info", String "Pixel_Type",bool "Debug") {
# OpenImageSeqLikeVD.avsi # https://forum.doom9.org/showthread.php?p=2023422#post2023422
# Requires AVS+, and RT_Stats. https://www.mediafire.com/file/xa3t1wx234gyzfq/RT_Stats_25%252626_x86_x64_dll_v2.00Beta13_20201229.zip/file
# Takes filenames like eg ".\IMAGE\Fred_0100.jpg", loads jpegs with minimum 4 digit index, starting from index 100.
# Debug stuff outputs info to M$ DebugView [DebugView v4.90]:- https://learn.microsoft.com/en-us/sysinternals/downloads/debugview
Function OISLVD_IsDigit(String S) {C=RT_Ord(S) return C>=48&&C<=57}
myName = "OpenImageSeqLikeVD: "
fps = Default(fps,24.0)
use_DevIL = Default(use_DevIL,false)
Info = Default(Info,False)
Pixel_Type = Default(Pixel_Type,"RGB24")
Debug = Default(debug,true) # Change default to False if you like.
fn = fn.RT_GetFullPathName
Name = fn.RT_FilenameSplit(4)
DCnt=0
for(i=Name.StrLen,1,-1) { if(OISLVD_IsDigit(Name.MidStr(i,1))) { DCnt=DCnt+1} Else {Break} }
(Debug) ? RT_DebugF("DCnt=%d",DCnt,name=myName) : NOP
if(DCnt==0) {
Assert(Exist(fn),myName+RT_String("""File Does Not Exist, "%s"""",fn))
(Debug) ? RT_DebugF("""ImageSource("%s",start=0,end=0,fps=%f, use_DevIL=%s,info=%s, pixel_type="%s")""",fn,fps,use_DevIL,Info,pixel_type,name=myName) : NOP
Return ImageSource(fn,start=0,end=0,fps=fps, use_DevIL=use_DevIL,info=info, pixel_type=pixel_type)
}
Path = fn.RT_FilenameSplit(3)
Ext = fn.RT_FilenameSplit(8) # Incl leading '.'
NameStem = Name.LeftStr(Name.StrLen-DCnt)
start=Name.RightStr(DCnt).RT_NumberValue
ScanEnd = 1000000
(Debug) ? RT_DebugF("""NameStem="%s" DCnt=%d start=%d""",NameStem,DCnt, Start,name=myName) : NOP
end = -1
for(i=start,ScanEnd) {
tmpName = RT_String("%s%s%0*d%s",Path,NameStem,DCnt,i,Ext)
ex = Exist(tmpName)
(Debug) ? RT_DebugF("""Testing file %d) "%s" : %s""",i,tmpName,(ex)?"EXISTS": "NOT_EXIST",name=myName) : NOP
if(!ex) { break }
end = i
}
Assert(end>=start,myName+RT_String("""File Does Not Exist, "%s"""",fn))
tmpName = RT_String("%s%s%%0%dd%s",Path,NameStem,DCnt,ext)
(Debug) ? RT_DebugF("""ImageSource("%s",start=%d,end=%d,fps=%f, use_DevIL=%s,info=%s, pixel_type="%s")""",tmpName,start,end,fps,use_DevIL,Info,pixel_type,name=myName) : NOP
Return ImageSource(tmpName,start=start,end=end,fps=fps, use_DevIL=use_DevIL,info=info, pixel_type=pixel_type)
}


Files for testing [~1.5MB]
https://www.mediafire.com/file/eax4zvy3kv2mfrj/OpenImageSeqLikeVD_TEST.7z/file

Test0.avs

Import(".\OpenImageSeqLikeVD.avsi")

OpenImageSeqLikeVD(".\IMAGE_0\Testing.jpg")


Test0.LOG

00000101 20:08:34 [3468] OpenImageSeqLikeVD: DCnt=0
00000102 20:08:34 [3468] OpenImageSeqLikeVD: ImageSource("C:\OpenImageSeqLikeVD_TEST\IMAGE_0\Testing.jpg",start=0,end=0,fps=24.000000, use_DevIL=False,info=False, pixel_type="RGB24")





Test1.avs

Import(".\OpenImageSeqLikeVD.avsi")

OpenImageSeqLikeVD(".\IMAGE_1\YGT_0.jpg")


Test1.LOG

00000101 20:03:34 [8064] OpenImageSeqLikeVD: DCnt=1
00000102 20:03:34 [8064] OpenImageSeqLikeVD: NameStem="YGT_" DCnt=1 start=0
00000103 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 0) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_0.jpg" : EXISTS
00000104 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 1) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_1.jpg" : EXISTS
00000105 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 2) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_2.jpg" : EXISTS
00000106 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 3) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_3.jpg" : EXISTS
00000107 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 4) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_4.jpg" : EXISTS
00000108 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 5) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_5.jpg" : EXISTS
00000109 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 6) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_6.jpg" : EXISTS
00000110 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 7) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_7.jpg" : EXISTS
00000111 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 8) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_8.jpg" : EXISTS
00000112 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 9) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_9.jpg" : EXISTS
00000113 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 10) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_10.jpg" : EXISTS
00000114 20:03:34 [8064] OpenImageSeqLikeVD: Testing file 11) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_11.jpg" : EXISTS

# ...

00000420 20:03:35 [8064] OpenImageSeqLikeVD: Testing file 317) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_317.jpg" : EXISTS
00000421 20:03:35 [8064] OpenImageSeqLikeVD: Testing file 318) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_318.jpg" : EXISTS
00000422 20:03:35 [8064] OpenImageSeqLikeVD: Testing file 319) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_319.jpg" : EXISTS
00000423 20:03:35 [8064] OpenImageSeqLikeVD: Testing file 320) "C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_320.jpg" : NOT_EXIST
00000424 20:03:35 [8064] OpenImageSeqLikeVD: ImageSource("C:\OpenImageSeqLikeVD_TEST\IMAGE_1\YGT_%01d.jpg",start=0,end=319,fps=24.000000, use_DevIL=False,info=False, pixel_type="RGB24")






Test2.avs

Import(".\OpenImageSeqLikeVD.avsi")

OpenImageSeqLikeVD(".\IMAGE_2\YGT2_000.jpg")


Test2.LOG

00000102 20:04:18 [2684] OpenImageSeqLikeVD: DCnt=3
00000103 20:04:18 [2684] OpenImageSeqLikeVD: NameStem="YGT2_" DCnt=3 start=0
00000104 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 0) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_000.jpg" : EXISTS
00000105 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 1) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_001.jpg" : EXISTS
00000106 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 2) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_002.jpg" : EXISTS
00000107 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 3) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_003.jpg" : EXISTS
00000108 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 4) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_004.jpg" : EXISTS
00000109 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 5) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_005.jpg" : EXISTS
00000110 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 6) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_006.jpg" : EXISTS
00000111 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 7) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_007.jpg" : EXISTS
00000112 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 8) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_008.jpg" : EXISTS
00000113 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 9) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_009.jpg" : EXISTS
00000114 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 10) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_010.jpg" : EXISTS
00000115 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 11) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_011.jpg" : EXISTS

# ...

00000412 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 308) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_308.jpg" : EXISTS
00000413 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 309) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_309.jpg" : EXISTS
00000414 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 310) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_310.jpg" : EXISTS
00000415 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 311) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_311.jpg" : EXISTS
00000416 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 312) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_312.jpg" : EXISTS
00000417 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 313) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_313.jpg" : EXISTS
00000418 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 314) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_314.jpg" : EXISTS
00000419 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 315) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_315.jpg" : EXISTS
00000420 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 316) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_316.jpg" : EXISTS
00000421 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 317) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_317.jpg" : EXISTS
00000422 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 318) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_318.jpg" : EXISTS
00000423 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 319) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_319.jpg" : EXISTS
00000424 20:04:18 [2684] OpenImageSeqLikeVD: Testing file 320) "C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_320.jpg" : NOT_EXIST
00000425 20:04:18 [2684] OpenImageSeqLikeVD: ImageSource("C:\OpenImageSeqLikeVD_TEST\IMAGE_2\YGT2_%03d.jpg",start=0,end=319,fps=24.000000, use_DevIL=False,info=False, pixel_type="RGB24")


Seems to do as required.

EDIT: Requires Avs+ and RT_Stats:- https://www.mediafire.com/file/xa3t1wx234gyzfq/RT_Stats_25%252626_x86_x64_dll_v2.00Beta13_20201229.zip/file

EDIT: LOG files captured by DebugView.

wonkey_monkey
8th October 2025, 21:00
I bet no-one could write an Avisynth script that puts a million quid in my bank account...

waits

StainlessS
8th October 2025, 21:04
No point, would not make a lot of difference :)

dani75
8th October 2025, 22:06
Thank you very much StainlessS, the guy who programs and tests faster than his shadow !

dani75
11th October 2025, 18:39
I made a comparative test between two ways :
1) CallCmd to Vdub in line mode calling a VD script which opens the sequence and save it into file with LAGS compression : for a 1000 images sequence, the file is opened by DirectShowSource for subsequent treatment after 28 seconds on my PC
2) OpenImageSeqLikeVD without any modification : for the same 1000 images sequence, the image flow is immediately ready for subsequent treatment

The winner is therefore StainlessS !
Thank you again.
Daniel (or Dany or Dan, as you prefer)

StainlessS
11th October 2025, 19:12
And thanx to you for making me do that there thingy, always good to have stuff than can make humanless automation possible.