For this scenario (and any like it), I strongly recommend to not start with code. Even for my own coding projects I do not start with code. Start with Shotcut or Kdenlive and use the tool to visually achieve what you want. After you get the result that you are looking for in the graphical tool, examine the resulting MLT file to learn about how various properties interact. ~Brian
On Wednesday, January 5, 2022, 04:44:33 PM CST, José María García Pérez <josemaria.alk...@gmail.com> wrote: I managed to do it thanks to wikipedia where it clearly explains the difference between SAR, DAR and PAR. https://en.wikipedia.org/wiki/Pixel_aspect_ratio For the record, in case this can help others:SAR= 720/360 = 2 (calculated with the resolution) DAR=16/9 (how we want the image to be displayed)PAR=DAR/SAR = 16/18 (pixel aspect ratio is the "sample aspect") I had to adjust the sample aspect. profile.setWidth(width1) profile.setHeight(height1 + height2) profile.setSampleAspect(16,18) profile.setDisplayAspect(16,18) The result: https://i.imgur.com/upS5pjC.png El mié, 5 ene 2022 a las 22:13, José María García Pérez (<josemaria.alk...@gmail.com>) escribió: Thanks Péter. I think my issue is more related with the "aspect ratio" and/or "display ratio" of the profile, producer (the video itself) and the consumer. With this: profile.setWidth(width1) profile.setHeight(height1 + height2) profile.setWidth(profile.width) profile.setHeight(profile.height) profile.setSampleAspect(1,1) profile.setDisplayAspect(16,18) I am getting: https://i.imgur.com/UidhlNX.png I am using now a smaller video (720x360) with display aspect ratio 16:9 and 25fps. El mié, 5 ene 2022 a las 21:02, Péter Hudoba (<hudi1...@gmail.com>) escribió: Hi! I am a noob, but I think the problem: if you use "hdv_720_50p" profile in your main function and create a consumer with that profile, you won't have a big enough consumer. https://www.mltframework.org/docs/profiles/ Best regards,Hudi José María García Pérez <josemaria.alk...@gmail.com> ezt írta (időpont: 2022. jan. 5., Sze, 20:54): Honestly I don't understand that comment. The documentation is clearly insufficient. The framework design just gives you a glimpse of the ideas; it doesn't even mention the word profile https://mltframework.org/docs/framework/. The demos are more oriented to the usage of melt. melt.c is not the best learning source either. So honestly I am bit confused, and this is the reason why I am asking for help. I am not asking for the code solution, but for some direction about the approach to follow. El mié, 5 ene 2022 a las 20:43, Dan Dennedy (<d...@dennedy.org>) escribió: I am not going to help further. You need to learn more outside of the code. On Wed, Jan 5, 2022 at 11:06 AM José María García Pérez <josemaria.alk...@gmail.com> wrote: Could you explain a bit further? I mean:1. Create profile: p2. Create producer: video1 (with profile p)3. Create producer: video2 (with profile p)4. Read the frame sizes5. Create a new profile with the size of both videos stacked vertically6. Create the consumer with that new profile So far I am getting funny sizes. I declared the following function: 1. Creates a new profile2. Resize the profile with the size of both videos3. Creates a new tractor and adds the videos as two separated tracks.4. I use an affine filter and applies "oy=height1" to the second track.5. I apply the transition "addition" in order to make both videos visible.proc stackVertically( v1,v2:Producer ):tuple[tr:Tractor; p:Profile] = # Get an appropriate profile var profile = newProfile() var frame1 = v1.getFrame(0) var (width1,height1) = frame1.getImage() var frame2 = v2.getFrame(0) var (width2,height2) = frame2.getImage() profile.setWidth(width1 + width2) profile.setHeight(height1 + height2) # Create the tractor var tr = newTractor() tr.connect( v1, 0 ) # We use the playlist as track0 tr.connect( v2, 1 ) var aff = newFactoryFilter(profile, "affine") aff["transition.oy"] = height1 tr.plant(aff, 1) var compose = profile.newFactoryTransition("frei0r.addition") tr.plant(compose, 0, 1) return (tr, profile) In order to use this function I do the following:1. Read two videos (in this case I use the same video)2. stack them vertically: the result is the tractor as a producer and the new profile3. I create an SDL2 base on the new profile4. Connect the tractor to SDLproc main = var f = initFactory() var p = newProfile("hdv_720_50p") var v1 = p.newMedia("./resources/big_buck_bunny_720p_2mb.mp4") var v2 = p.newMedia("./resources/big_buck_bunny_720p_2mb.mp4") var (newProducer, profile) = stackVertically( v1,v2 ) # Consumer var sdl = profile.newFactoryConsumer( "sdl2" ) sdl["terminate_on_pause"] = 1 # From tractor to SDL2 #v1.attach(aff1) newProducer > sdl # Start the consumer sdl.run The result is: https://i.imgur.com/eESDdJg.jpg El mié, 5 ene 2022 a las 18:28, Dan Dennedy (<d...@dennedy.org>) escribió: On Wed, Jan 5, 2022 at 9:22 AM José María García Pérez <josemaria.alk...@gmail.com> wrote: What is the proper way of stacking videos vertically? For example: video1 --------- video2 so that I can later scale it and move it around in the profile. Right now I am using affine (scaling down and then positioning it vertically). But the result is something like: video1 | black ------------------ video2 | black Basically I am looking how to get a new video which is: (width) x (2*height) You need to make a custom profile. _______________________________________________ Mlt-devel mailing list Mlt-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mlt-devel _______________________________________________ Mlt-devel mailing list Mlt-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mlt-devel
_______________________________________________ Mlt-devel mailing list Mlt-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mlt-devel