fluent-ffmpeg video has stretched image

1.3k Views Asked by At

I have an mp3 audio file and a jpg image file. I want to combine these two files into a new mp4. I have a working fluent-ffmpeg command that does exactly what I want, except somethings an image will be stretched in the final output video. It seems to happen consistently with jpgs I export from photoshop.

Is there any way I can specify in my ffmpeg command to keep the same resolution of my image and not to stretch it?

My function below:

async function debugFunction() {
    console.log('debugFunction()')
    //begin setting up ffmpeg
    const ffmpeg = require('fluent-ffmpeg');
    //Get the paths to the packaged versions of the binaries we want to use
    var ffmpegPath = require('ffmpeg-static-electron').path;
    ffmpegPath = ffmpegPath.replace('app.asar', 'app.asar.unpacked')
    var ffprobePath = require('ffprobe-static-electron').path;
    ffprobePath = ffprobePath.replace('app.asar', 'app.asar.unpacked')
    //tell the ffmpeg package where it can find the needed binaries.
    ffmpeg.setFfmpegPath(ffmpegPath);
    ffmpeg.setFfprobePath(ffprobePath);
    //end setting ffmpeg

    let imgPath = "C:\\Users\\marti\\Documents\\martinradio\\image.jpg";
    let audioPath = "C:\\Users\\marti\\Documents\\martinradio\\audio.mp3";
    let vidPath = "C:\\Users\\marti\\Documents\\martinradio\\video.mp4";

    //create ffmpeg command
    ffmpeg()
    //set rendering options
    .input(imgPath)
    .loop()
    .addInputOption('-framerate 2')
    .input(audioPath)
    .videoCodec('libx264')
    .audioCodec('copy')
    .audioBitrate('320k')
    .videoBitrate('8000k', true)
    .size('1920x1080')
    .outputOptions([
        '-preset medium',
        '-tune stillimage',
        '-crf 18',
        '-pix_fmt yuv420p',
        '-shortest'
    ])
    //set status events
    .on('progress', function (progress) {
        if (progress.percent) {
            console.log(`Rendering: ${progress.percent}% done`)
        }
    })
    .on('codecData', function (data) {
        console.log('codecData=', data);
    })
    .on('end', function () {
        console.log('Video has been converted succesfully');
    })
    .on('error', function (err) {
        console.log('errer rendering video: ' + err.message);
    })
    //run ffmpeg command
    .output(vidPath).run()

}

renders successfully if I give it an audio file and this image:

enter image description here

But the output video looks like this:

enter image description here

You can see that the image was squished and stretched out like a rectangle, while I would like to keep it a cube.

1

There are 1 best solutions below

0
On

You seem to be using a 16:9 ratio e.g. .size('1920x1080') for a picture which is 599X603. You can change the size of the output video so that it will match your actual image size (it can be bigger or smaller but keep the similar ratio) or use 16:9 but add padding on the sides.