Search code examples
ffmpeg

How to make ffmpeg delete original file after conversion?


I'd like to convert all .mp4 movies in a folder and delete the old one afterwards.

Does anyone have a hint? I've been trying for hours.

The only thing I found is: How to make ffmpeg delete the original file after changing containers? (using a send to bat file)

my idea:

ffmpeg -i *.mp4 -c:v libx264 -b:v 1.5M -c:a aac *.mp4

It asks if files can be overwritten, but then it doesn't:https://pastebin.com/tJtWpm2n


Solution

  • In ffmpeg you can't directly write to the same file you're currently reading from, but one thing you can do instead is write to a temporary file, then replace the original if ffmpeg converted successfully.

    for f in *.mp4; do
        ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "tmp_${f}" && mv "tmp_${f}" "${f}"
    done
    

    So ffmpeg reads from variable ${f} containing the original filename matched in the *.mp4 pattern and writes to tmp_${f}, then && tests ffmpeg exited successfully before replacing the original file with mv.

    You might also want to ensure "tmp_${f}" does not exist first, which only takes a few more steps.

    for f in *.mp4; do
        tmpf=$(mktemp -p ./ -t "tmp.XXXXXXXXXX.${f##*.}") # can now be extended for any file extension
        ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "${tmpf}" && mv "${tmpf}" "${f}"
    done