Batch convert *.avi files using ffmpeg

Solution 1:

Your batch file is not in the correct format for a Windows bat script. Instead your script looks like it was intended for Linux. You will need to change the script to use a for loop that is supported by the Windows Shell.

Below is an example of how to accomplish this task by using a windows for loop. Just put the below line in your batch file and move the script to the same directory as the avi files, then run it.

for %%A IN (*.avi) DO ffmpeg -i "%%A" "%%A.mpg"

Solution 2:

Why not crop/remove the file extension in your output file?

@echo off

for file in *.avi
do
   ffmpeg -i "$file" -s 640x480 -vcodec msmpeg4v2 "'basename "$file" .avi'.mpg';
done

@echo off

for %%i in (*.avi)do ffmpeg -i "%%~fi" -s 640x480 -vcodec msmpeg4v2 "%%~dpni.mpg"

rem :: "%%~fi" == Full Path == Drive + Path + Name + Extension %%i:                      
rem :: "%%~fi" == C:\Path\FileName.AVI

rem :: "%%~dpni.mpg" == Drive + Path + Name + .mpg %%i:
rem :: "%%~dpni.mpg" == C:\Path\FileName.mpeg
  • To have the Name.eXtension (%%~nxi) of the input and output file on the screen, and to reduce the ffmeg output information, limiting only the conversion in progress (-hide_banner -v error -stats):
@echo off 

for %%i in (*.avi)do echo\Enconding: "%%~nxi" "%%~ni.mpg"  &&  (
       ffmpeg -i "%%~fi" -s 640x480 -vcodec msmpeg4v2  "%%~dpni.mpg" -hide_banner -v error -stats
       ) 
  • Output in my test:
Enconding: "bird_test.avi" "bird_test.mpg"
frame=  355 fps=0.0 q=31.0 Lsize=     680kB time=00:00:11.80 bitrate= 472.1kbits/s speed=  22x
Enconding: "file_input.avi" "file_input.mpg"
frame=  903 fps=248 q=11.3 Lsize=    2440kB time=00:00:30.56 bitrate= 653.9kbits/s dup=2 drop=0 speed= 8.4x

Solution 3:

A simple addition to Brett's answer:

for %A IN (*.avi) DO ffmpeg -i "%A" "%~nA.mpg"
  • OBs.: cmd one-liner, for use in batch files use %%

Add %~n to the variable in the output file name to get rid of the original file extension.

This was also used in It Wasn't Me's answer, but I thought this convenient detail was maybe lost on people who just want to use a cmd one-liner.