Question

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?

Était-ce utile?

La solution

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top