第一步:要计算出视频的总帧数:
总帧数 = duration * fps 。
duration是我们设定的视频的长度,fps是视频每秒的帧数。
第二步:将所有的图片文件放到一个临时目录,并且制定一个命名规则(可正则的):
例如图片的素材是image0.jpg image1.jpg image2.jpg
然后可以执行命令合成视频了
带音频:
ffmpeg -threads 2 -i 1976.aac -absf aac_adtstoasc -i 1.jpg -acodec aac -strict -2 -vcodec libx264 -ar 22050 -ab 128k -ac 2 -pix_fmt yuvj420p -y test1.mp4
-threads 2 以两个线程进行运行, 加快处理的速度
-absf aac_adtstoasc 将结果的音频格式转为faac格式时需要这个选项。将音频格式转为faac是因为在iphone上某些音频格式的视频无法播放,例如mp3. 但faac格式的音频的视频在iphone上可以播放。
-acodec 音频选项, 使用codec编解码,aac和mp3一样是一种音频格式,-acodec等同于-c:a
-strict strictness 跟标准的严格性
-vcodec 视频选项,强制使用codec编解码方式 -vcodec等同于-c:v
-ab 音频选项,bitrate 设置音频码率
-ar 音频选项,freq 设置音频采样率
-ac 音频选项,channels 设置通道 默认为1
-y 对输出文件进行覆盖
纯图片:
1.基本格式
#: ffmpeg -loop 1 -f image2 -i /images/image%d.jpg -vcodec libx264 -t 10 -r 10 tt.mp4
-loop 1循环读输入 0读完就不读了
-f 设定输出格式(format)
-i filename 输入文件 其中/images/images%d.jpg 为图片路径 图片的命名格式为image%d.jpg形式,即:image0.jpg image1.jpg image2.jpg ....... tt.mp4为输出视频文件名
-vcodec 强制使用codec编解码方式 -vcodec等同于-c:v
-t duration 输出视频总时长,单位秒,和-t一起使用。
两种用法:1,用做输入选项(在-i之前),是限制读取输入文件的的时长; 2,用做输出选项(before an output url),超过这个时间停止写输出文件; 比如:循环读取一个输入文件时(-loop 1),当到时间就会停止输出,生成一个duration时长的视频。但是如果没有循环选项,而且输入文件短于这个时长时,就会随着输入文件结束就结束,生成视频,视频时长小于duration。所以我们可以看出 -t 并不仅仅是输出文件时长。
-r fps 表示定义帧率为10,这样输出的视频就是每秒播放十帧,默认是25。
帧率,可以指定两个帧率,输入帧率,输出帧率; 输入帧率:-i之前,设定读入帧率,比如 -r 0.5 ,也就是说1秒要播0.5个图片,那么一个图也就是要播2s; 输出频率:-i之后,真正的输出视频播放帧率,不写的话,是默认和输入频率一样。比如设 -r 30 ,对应上面的设定,一个图播2s,那么输出文件播放时,这2s内,都是这张图,但是播放了60帧。
从不同目录下多张图合成视频
cat读取多张图片输入到一个“全局管道文件”中,然后后面ffmpeg命令从全局管道中(指定-f image2 pipe)读取输入文件,生成视频。
#:cat Desktop/aa/img1.jpg Desktop/aa/img2.jpg Desktop/aa/img3.jpg | ffmpeg -loop 0 -f image2 pipe -r 3 -b 200k -s 640*360 -t 12 -i log.pipe -y Desktop/oup.mkv
如果您的图像按顺序编号(img001, img002, img003..),实现的效果是每张图片保持5秒就换下一张图片,直到图片播放完。
#:ffmpeg -framerate 1/5 -i img%3d.jpg -r 5 video.mp4
如果您的文件名是不规则的,并且您是在Unix shell(如bash)中执行,则可以运行
#:ffmpeg -framerate 1/2 -pattern_type glob -i ./images/'*.jpg' -r 5 video.mp4