We assume that the user has set the video filename to the variable named $video in the following commands.
FFmpeg export audio from any video to mp3
ffmpeg -i "$video" -vn -c:a libmp3lame -y "$audio";
FFmpeg export frames from video to images
ffmpeg -i "$video" "$frames_folder/%08d.ppm";
Retrieve the frame rate from the input video
#To view it on screen
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate "$video";
#To assign it to a variable use the following
frame_rate=`ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate "$video"`;
To create a video out of a folder with frames/images and an audio file.
ffmpeg -framerate "$frame_rate" -i "$frames_folder/%08d.ppm" -i "$audio" -pix_fmt yuv420p -acodec copy -y "$output_video";
#To set a custom starting index for the frames you can use the -start_number argument
ffmpeg -start_number 62 -framerate "$frame_rate" -i "$frames_folder/%08d.ppm" -i "$audio" -pix_fmt yuv420p -acodec copy -y "$output_video";
#To use the MP4 coded use -vcodec libx264
ffmpeg -framerate "$frame_rate" -i "$frames_folder/%08d.ppm" -i "$audio" -vcodec libx264 -pix_fmt yuv420p -acodec copy -y "$output_video";
To merge an audio less video with an audio file
ffmpeg -i "$no_audio_video" -i "$audio" -shortest -vcodec copy -acodec copy "$output_video";
To change the frame rate of a video
ffmpeg -i "$video" -filter:v fps=20 "$output_video";
To merge two videos side by side
ffmpeg -i "$left_video" -i "$right_video" -filter_complex hstack "$output_video";
Concatenate multiple videos into one
The easiest way without writing huge commands is the following: First, create a file named parts.txt
and add content similar to what we list below:
#Lines starting with # will be ignored file 'part00-03.mp4' file 'part04.mp4' file 'part05-07.mp4' file 'part08-09.mp4' file 'part10.mp4' file 'part11-13.mp4'
Then execute the following command to concatenate all those videos into one:
ffmpeg -f concat -safe 0 -i parts.txt -c copy "$output_video";
Speed up a video
Using the following command, you can speed up a video by dropping excess frames:
ffmpeg -i "$video" -filter:v "setpts=0.5*PTS" "$output_video";
The above example will double the speed (the value 0.5
controls it.)
To speed the video up without losing frames, you can increase the FPS value of the output video. To retrieve the frame rate, please see the command that was posted earlier.
ffmpeg -i "$video" -r 80 -filter:v "setpts=0.25*PTS" "$output_video";
In the second example, we assumed that the input video had 20 frames per second. Using the 0.25 value, we decided to speed the video up by a factor of 4. To preserve the input frames, we increased the frame rate from 20 to 80 using the parameter -r
.