Avidemux Forum

Avidemux => Main version 2.6 => Topic started by: bobdeyoung on March 26, 2024, 08:05:07 PM

Title: Scripting help
Post by: bobdeyoung on March 26, 2024, 08:05:07 PM
Version 2.8.1 under Windows 11

Can someone assist me with how you go about creating and executing a script?  I see the Tools > Scripting Shell option but not sure what it does. Specifically, I would like to be able to add a 1 second "Fade-In" and a 3 second "Fade-Out to black" to a video being cut from a longer video.

Thanks!

EDIT:  Now I see that there is a Video > Filters menu option but it is grayed out.  That may be just what I need from reading other posts about fades.  How do I enable it and/or add filters?
Title: Re: Scripting help
Post by: sark on March 26, 2024, 08:42:56 PM
You must encode to apply a filter.
Select an encoder from the drop down list (commonly Mpeg4 AVC (x264) and the Filter button will become active.
There is an option to do exactly as you require.
Title: Re: Scripting help
Post by: eumagga0x2a on March 26, 2024, 08:55:20 PM
The following script will add 1s fade-in and 3s fade-out for a selection of at least 4 seconds duration:

adm = Avidemux()
ed = Editor()
gui = Gui()

if not adm.isFileOpen():
    gui.displayError("1s fade-in + 3s fade-out", "No video loaded")
    return

# require at least 4 seconds to be selected
if (adm.markerA < 0):
    adm.markerA = 0
if (adm.markerB < 0):
    adm.markerB = 0
if (adm.markerB > ed.getVideoDuration()):
    adm.markerB = ed.getVideoDuration()
if (adm.markerB - adm.markerA < 4 * 1000 * 1000):
    gui.displayError("1s fade-in + 3s fade-out", "Selection too short, must be at least 4 seconds")
    return

fadeInDuration = 1000 # in ms
fadeOutDuration = 3 * 1000 # in ms

fadeInStart = int(adm.markerA / 1000)
fadeOutStart = int((adm.markerB - 3 * 1000 * 1000) / 1000)

adm.addVideoFilter("fadeToBlack", "startFade=" + str(fadeInStart), "endFade=" + str(fadeInStart + fadeInDuration), "inOut=True", "toBlack=True")
adm.addVideoFilter("fadeToBlack", "startFade=" + str(fadeOutStart), "endFade=" + str(fadeOutStart + fadeOutDuration), "inOut=False", "toBlack=True")
gui.displayInfo("Done", "Fade-in and fade-out added. Select video codec other than \"Copy\" to re-encode video")

Save it as a text file with ".py" as extension. Place it e.g. into %appdata%\avidemux\custom directory to be listed in the "Custom" menu upon restart of Avidemux. You should update to the latest 2.8.2 nightly (https://avidemux.org/nightly/), I don't think that isFileOpen() method had been added to pyAvidemux class already in 2.8.1. In any case, you must switch from copy mode to an encoder to use filters.
Title: Re: Scripting help
Post by: bobdeyoung on March 26, 2024, 09:01:22 PM
Quote from: sark on March 26, 2024, 08:42:56 PMYou must encode to apply a filter.
Select an encoder from the drop down list (commonly Mpeg4 AVC (x264) and the Filter button will become active.
There is an option to do exactly as you require.

OK, thank you!  I was trying to avoid re-encoding, but it makes sense that you would need to do that.  Unless there is some advantage to using Avidemux to encode, I will just use my primary encoding software (TMPGEnc Video Mastering Works 7) to do that.  What I am trying to accomplish in the end is to cut a few short video clips out of my 90 minute source video and have start/end fades on those shorter clips. 
Title: Re: Scripting help
Post by: bobdeyoung on March 26, 2024, 09:02:29 PM
Quote from: eumagga0x2a on March 26, 2024, 08:55:20 PMThe following script will add 1s fade-in and 3s fade-out for a selection of at least 4 seconds duration:

adm = Avidemux()
ed = Editor()
gui = Gui()

if not adm.isFileOpen():
    gui.displayError("1s fade-in + 3s fade-out", "No video loaded")
    return

# require at least 4 seconds to be selected
if (adm.markerA < 0):
    adm.markerA = 0
if (adm.markerB < 0):
    adm.markerB = 0
if (adm.markerB > ed.getVideoDuration()):
    adm.markerB = ed.getVideoDuration()
if (adm.markerB - adm.markerA < 4 * 1000 * 1000):
    gui.displayError("1s fade-in + 3s fade-out", "Selection too short, must be at least 4 seconds")
    return

fadeInDuration = 1000 # in ms
fadeOutDuration = 3 * 1000 # in ms

fadeInStart = int(adm.markerA / 1000)
fadeOutStart = int((adm.markerB - 3 * 1000 * 1000) / 1000)

adm.addVideoFilter("fadeToBlack", "startFade=" + str(fadeInStart), "endFade=" + str(fadeInStart + fadeInDuration), "inOut=True", "toBlack=True")
adm.addVideoFilter("fadeToBlack", "startFade=" + str(fadeOutStart), "endFade=" + str(fadeOutStart + fadeOutDuration), "inOut=False", "toBlack=True")
gui.displayInfo("Done", "Fade-in and fade-out added. Select video codec other than \"Copy\" to re-encode video")

Save it as a text file with ".py" as extension. Place it e.g. into %appdata%\avidemux\custom directory to be listed in the "Custom" menu upon restart of Avidemux. You should update to the latest 2.8.2 nightly (https://avidemux.org/nightly/), I don't think that isFileOpen() method had been added to pyAvidemux class already in 2.8.1. In any case, you must switch from copy mode to an encoder to use filters.

Thanks.  See my reply above...I was trying to avoid having to re-encode.