Search code examples
batch-fileffmpegvideo-processing

merge multiple videos and audios with ffmpeg


I have used the program youtube-dl to download a Youtube playlist, i have chosen to download videos and audios separately, i have now a folder full of videos with their corresponding audios that i wish to merge together with ffmpeg.

I need to do this using a batch script but the problem is that youtube-dl added aleatory letters after the original file's title so the videos doesn't have the same name as their corresponding audio, file names looks like this:

First title in the playlist 5J34JG.mp4
First title in the playlist H3826D.webm
Second title in the playlist 3748JD.mp4
Second title in the playlist 6SHJFZ.webm

How to merge these multiple video/audio files using windows batch script and ffmpeg ?

Edit: I forgot to mention that the .webm files are the audio files and that i have multiple files i can't rename them one by one.


Solution

  • @echo off
    setlocal
    
    set "outdir=muxed"
    if not exist "%outdir%" md "%outdir%" || exit /b 1
    
    :: Get each mp4 file and call the label to mux with webm file.
    for %%A in (*.mp4) do call :mux "%%~A"
    exit /b
    
    :mux
    setlocal
    set "videofile=%~1"
    set "name=%~n1"
    
    :: Last token of the name is the pattern to remove.
    for %%A in (%name:-=- %) do set "pattern=-%%~A"
    
    :: Remove the pattern from the name.
    call set "name=%%name:%pattern%=%%"
    
    :: Get the webm filename.
    for %%A in ("%name%-*.webm") do set "audiofile=%%~A"
    
    :: Mux if webm file exist and output file does not exist.
    if exist "%audiofile%" if not exist "%outdir%\%name%.mp4" (
        ffmpeg -i "%videofile%" -i "%audiofile%" -c copy "%outdir%\%name%.mkv"
    )
    exit /b
    

    The script will 1st make the output directory to save mp4 files so that the output will not become input.

    The main for loop will get each mp4 filename. The :mux label is called with the mp4 filename as an argument.

    The variable videofile stores the mp4 filename and variable name stores just the name without extension.

    The last token of name will be the YTID pattern while a for loop will set the last token to pattern.

    The call set will substitute the pattern with "" from the name. This will give a name that can used with a wildcard to find the webm filename. A for loop will get the webm filename.

    If the destination does exist and not the output file, then ffmpeg will mux the 2 files into an output file.

    Output file container format is mkv.