This is my follow up to getting started with FFmpeg. I strongly recommend getting to know the tool better in my previous post about it.
Multiple clips can be merged together with the concat demuxer. The idea is to create a text file with a list of files to concatenate together (in order), the format is as follows:
# List of files in order file './file1.mp4' file './file2.mp4' file './file3.mp4'
For the lazy people like me it’s possible to use shell scripting to generate this list:
for f in ./*.mp4; do echo "file '$f'" >> list.txt done
Then you need to feed the file as an input and specify the format (
ffmpeg -f concat -i list.txt -c copy output.mp4
The wiki page speaks more in detail about this feature.
Extracting the frames
It is quite simple to extract all the frames from a video as pictures.
ffmpeg -i input.mp4 frame_%03d.png
In this command we extract every frame from input.mp4 as PNG pictures. We use the
printf format for the numbering of the frame (we pad with 0 the
%d for 3 characters).
It’s possible to use the parameters for the start and length of the clip to extract part of the frames or just simply limit number of frames to extract with
-vframes. We can also specify a different framerate to work with during this process with
Hardware acceleration encoding
For maximum speed it is possible to use a hardware encoder for H264, I will only cover how to do this with an NVidia GPU (NVENC).
First check that FFmpeg has not been configured with
--disable-nvenc, this will appear in the banner when running FFmpeg if NVENC is disabled.
ffmpeg -ss 14:01 -i "input.mp4" \ -c:v h264_nvenc \ -b:v 60000k \ -t 0:30 output.mp4
This looks exactly as encoding, except the codec on line 2 is different, it has
_nvenc appended to it. This is really simple and will boost the encoding drastically.
Please check out the following pages if you wish to know more: