Reputation: 23
I am writing a script that takes videofiles such as MKV or AVI and changes them to MP4, and then prepares them from web streaming. I want my output to use H.264 and AAC codecs.
So far my command looks like this:
ffmpeg -i input.mkv -vcodec h264 -acodec aac -ab 128k -ac 2 -strict -2 output.mp4
However, when the codec already is h.264 it still muxes it, it says: (h264 -> libx264).
If I replace '-vcodec h264' with '-vcodec copy' it goes a lot faster when the codec is H.264 but of course won't change the codec if there is a different codec in the input file.
Is there a way for FFmpeg to recognize that the codec is almost the same, and thus not muxing the videostream, but still changing video codec if the source isn't H.264?
Upvotes: 1
Views: 1535
Reputation: 38730
No. FFmpeg can only copy bitstreams or re-encode. It can't guess if you want to keep a certain codec. You'll have to parse the file info and then decide whether you want to copy or not.
Some examples of how to do that are listed here: MKV to MP4 transcoding script issues
Basically, you could do this (shameless plug from @evilsoup there):
ffprobe input.mkv 2>&1 | sed -n '/Video:/s/.*: \([a-zA-Z0-9]*\).*/\1/p' | sed 1q'
This would output h264
for an H.264 video stream.
Minor tip: Try getting used to specifying the exact encoder you want. h264
isn't really an encoder for FFmpeg – it defaults to libx264
. So rather use -c:v libx264
.
One more thing: aac
is the built-in AAC encoder from FFmpeg. Third party encoders like libfdk_aac
or libfaac
offer a VBR encoding mode and generally better quality than aac
.
Upvotes: 1