Depending on the codecs used in your FLV you may be able to get away with simply re-wrapping it in an mp4 container. You'll need H.264
or MPEG4 simple profile
video and AAC
audio. You can find out some info on your source file with ffmpeg -i input.flv
I'm not sure whether simply having H.264/MPEG4 Simple + AAC is good enough or if there are specific options to the codecs that are supported. It's easy enough to test:
Try using
ffmpeg -i input.flv -c copy -copyts output.mp4
-copyts
is copy timestamps
it will help audio sync.
If that doesn't work, try forcing audio and video codecs. This will re-encode the file:
ffmpeg -i input.flv -c:v libx264 -crf 23 -c:a aac -b:a 160k output.mp4
If you want to change only the audio or only the video codec, you can use -c:a copy
or -c:v copy
to copy the one you want to keep.
To improve the video quality, you can use a lower CRF value, e.g. anything down to 18. To get a smaller file, use a higher CRF, but note that this will degrade quality.
To inprove the audio quality, choose a higher bitrate (160k in the example above).
With both the audio and video quality, your results will vary depending on the quality of the source.
more info on FFMPEG aac encoding (I've been referring to the "native" encoder described on the ffmpeg site).
Regarding the ffmpeg command suggested in the question...
-ar
refers to the audio sample rate. I recommend not messing with this parameter at all. If you want to play with audio encoding, adjust the bitrate (-b:a 160k
above) and let the encoder choose what to do based on that.
For reference, here's what it means.
CD quality is 44100Hz sampling; typical video uses 48000Hz.
You may note that 22050 in the original question's example is 1/2 the cd quality sample rate. if you are downconverting CD material this is a good choice. If you're starting with 48KHz source i'd use 24Khz instead.
You should get info on the sample rates from the ffmpeg -i
command I suggested at the top.
[libvo_aacenc @ 037dfb00] Unable to set encoding parameters
libvo_aacenc
probably can not encode 5.1 channels and is a poor encoder in general. You can use aac
(with -strict experimental
), libfaac
, or libfdk_aac
(if your ffmpeg were configured to support it) to preserve your channels. If you must use libvo_aacenc
you can add -ac 2
or use an audio filter to change the output to two channels.
Declaring a "quality" for your audio is probably easiest, such as -q:a 100
for libfaac
or -vbr 5
for libfdk_aac
, otherwise you can choose the audio bitrate with -b:a
, but note that the bitrate will be shared among all channels so give it a higher value than you would for a stereo output. libvo_aacenc
only accepts -b:a
.
By default ffmpeg will choose the "best" video, audio, and subtitle stream from your input resulting in an output with potentially one video, one audio stream, and one subtitle stream. Add -map 0
, as slhck mentioned, to override this default and include all streams from input 0
(the first input). See stream selection in the ffmpeg documentation for more info and an explanation of "best".
Also see:
Best Answer
It should be something like:
You can use FOR command to loop through files (it recurses down your tree):
Just to clarify, %~nF returns only the name portion of the filename (without the extension).