Creative Communities of the World Forums

The peer to peer support community for media production professionals.

Activity Forums Compression Techniques Batch conversion with conditions

  • Batch conversion with conditions

    Posted by Kirk Smith on August 17, 2010 at 7:59 pm

    I have a folder full of videos of various different formats and resolutions. I provide these videos for download from my site (they are my creation or free-use.) I’m adding a mobile section to my site where i’d like to provide these videos in a mobile-streamable format. I know the format that I want, the resolution, bitrate, and audio bitrate, so that’s not an issue. The issue is the fact that these videos are not all the same resolution to start with. Some are smaller than the resolution I want to use for my conversion, some are the same size, and some are larger, some have different aspect rations, and they’re all sorts of different formats.

    I need a way to batch-convert these using ffmpeg to my specific format, but I don’t want to stretch the videos if they’re smaller than my format, I only want to shrink the ones that are larger. I still need to convert the other ones to the right format, just without resizing those specifically.

    I’m using a Linux Shell on my server (shared hosting) to perform this. I’ve used this command:

    for I in *.[ext]; do ffmpeg -i I -size WxH -b ##k -ab ##k converted/I.[new ext]; done

    To good effect, but that’s when all the videos are of the same starting resolution. Any ideas on how I might ignore the size option for videos that are already smaller than the required size, only resizing the ones larger, but converting them all?

    Michael Rampe replied 15 years, 9 months ago 2 Members · 1 Reply
  • 1 Reply
  • Michael Rampe

    August 18, 2010 at 7:30 am

    I have recently been working on a shell script that detects size and aspect ratio amongst other things. This example might give you some ideas of writing your own shell script.

    Basically,
    1. perform a header read of the input file and write to a file
    2. use grep/sed/awk combination to isolate the required data
    3. assign required data to variables
    4. use variables to build the FFmpeg command line
    5. run the FFmpeg command line

    EXAMPLE OF COPYING INPUT SIZE TO OUTPUT SIZE:
    (This will happen anyway with FFmpeg if not specifying size but should give you an idea of the method)

    1. Use “ffmpeg -i inputfile 2> data.txt”
    This will write the console text output to a file which will contain the stream data including size

    2&3. This can be a bit tricky but what I use as an example is:
    INPUTWIDTH=$(cat data.txt | grep “[0-9]x[0-9]” | sed ‘s/x/ /g’ | awk ‘{ print $1 }’)
    INPUTHEIGHT=$(cat data.txt | grep “[0-9]x[0-9]” | sed ‘s/x/ /g’ | awk ‘{ print $2 }’)

    4&5. Once the variables are set:
    ffmpeg -i inputfile [encoding parameters] -s $INPUTWIDTH\x$INPUTHEIGHT outputfile.mp4

    Although this doesn’t directly solve your problem, it should be possible to run and “if” scenario based on the size variables to allow the script to make the right decision to encode or resize based on input size.

    I will have a go on the logic when I get the chance.

    Michael

    “half-way to world domination A.K.A. the belligerent blue bike shed”

We use anonymous cookies to give you the best experience we can.
Our Privacy policy | GDPR Policy