知识准备
????????FFmpeg将多张图片合成视频,视频的总帧数:总帧数 = duration * fps ,duration是我们设定的视频的长度,fps是视频每秒的帧数。
????????对于图片文件是没有帧率的概念,FFmpeg默认情况下一秒25张图片成像合成视频。因此FFmpeg提供-framerate还有-r设置输入的视频帧率,-r 8说明每秒钟将8张图片合成视频。设置了输入帧率之后,如果输出帧率没有指定,输出帧率将跟输入帧率保持一致
场景
????????将bmp图片合成视频
ffmpeg -r 8 -i ./RecordTemp/%d.bmp? -vcodec mpeg4 test.mp4
ffmpeg -r 8 -i? %d.bmp -vcodec libx264 test.mp4
其中-r 和-framerate 都是代表帧率(这个属性属于图片的属性,需要放在图片之前)
1)控制视频帧率
-r fps 帧率,可以指定两个帧率,输入帧率,输出帧率;?
输入帧率:-i之前,设定读入帧率,比如 -r 0.5 ,也就是说1秒要播0.5个图片,那么一个图也就是要播2s;?
输出频率:-i之后,真正的输出视频播放帧率,不写话,是默认和输入频率一样。比如设 -r 30 ,对应上面的设定,一个图播2s,那么输出文件播放时,这2s内,都是这张图,但是播放了60帧
2)图片合成视频,然后视频拆分成图片数量对应不上
指令如下:
ffmpeg? -i "D:/ffmpeg/RecordTemp/%06d.bmp" -vcodec mpeg4 -r 20 D:/ffmpeg/video5.avi
ffmpeg -i video5.avi? -f image2 image-%07d.png
解答:-r 20 放在-i之后指定的是输出视频帧率,输入帧率默认情况下是25,所以拆分之后跟原始图片数量对应不上
解决方案:ffmpeg -r 20 -i "D:/ffmpeg/RecordTemp/%06d.bmp" -vcodec mpeg4? D:/ffmpeg/video5.avi
3)输出的视频画面质量下降,原因:影响视频质量的最重要因素是视频码率,输出视频的码率是默认的,只有200kbits/s
解决方案:修改默认的视频码率属性-b:v
ffmpeg -r 20? -i "D:/ffmpeg/RecordTemp/%06d.bmp" -vcodec mpeg4 -b:v 6000k D:/ffmpeg/video5.avi
注意:当不清楚输出码率应该设置为多少,可以指定一个比较大的数字
4)指定从拿一张图片开始合成视频
ffmpeg -start_number 500 -i pano%d.jpg video.avi
备注下
-t duration?
用做输入选项(在-i之前),是限制读取输入文件的的时长;?
用做输出选项(before an output url),超过这个时间停止写输出文件;?
比如:循环读取一个输入文件时(-loop 1),当到时间就会停止输出,生成一个duration时长的视频。但是如果没有循环选项,而且输入文件短于这个时长时,就会随着输入文件结束就结束,生成视频,视频时长小于duration。所以我们可以看出 -t 并不仅仅是输出文件时长。?
当用“管道”时,也不太一样,管道读了之后,里面内容就没了,所以没持续的输入,这个-loop,-t 都是“不起作用的”,除非管道一直有内容。
ffmpeg -threads2 -y -r 10 -i /tmpdir/image%04d.jpg -i audio.mp3 -absf aac_adtstoasc output.mp4
参数的解释含义:
-threads 2 以两个线程进行运行, 加快处理的速度。
-y 对输出文件进行覆盖
-r 10 fps设置为10帧/秒(不同位置有不同含义,后面再解释)
-i /tmpdir/image%04d.jpg 输入图片文件,图片文件保存为 image0001.jpg image0002.jpg ….
-i audio.mp3 输入的音频文件
-absf aac_adtstoasc 将结果的音频格式转为faac格式时需要这个选项。将音频格式转为faac是因为在iphone上某些音频格式的视频无法播放,例如mp3. 但faac格式的音频的视频在iphone上可以播放。-absf 的意思是设置一个bitstream filter进行某些转换。可以用ffmpeg -bsfs 查看所有支持的bitstream filter。 bitstream filter和 aac_adtstoasc的具体含义我也说不上。但是如果不用这个选项又会导致转换失败。
记录
bmp转换失败:
原因:提供的bmp图片文件,实际上是png格式的图片文件,经过批处理修改后缀名称,解决问题
排查过程:
1)通过Windows画图工具,重新保存成bmp文件,合成视频成功
2)通过Windows画图工具,重新另存为jpg文件,合成视频成功
说明是文件格式的问题
Microsoft?Windows?[版本?10.0.18363.1316] (c)?2019?Microsoft?Corporation。保留所有权利。 F:\test\test_old\store>ffmpeg?-i?test_%d.bmp?-vcodec?mpeg4?test.avi ffmpeg?version?git-2020-08-16-5df9724?Copyright?(c)?2000-2020?the?FFmpeg?developers ??built?with?gcc?10.2.1?(GCC)?20200805 ??configuration:?--enable-gpl?--enable-version3?--enable-sdl2?--enable-fontconfig?--enable-gnutls?--enable-iconv?--enable-libass?--enable-libdav1d?--enable-libbluray?--enable-libfreetype?--enable-libmp3lame?--enable-libopencore-amrnb?--enable-libopencore-amrwb?--enable-libopenjpeg?--enable-libopus?--enable-libshine?--enable-libsnappy?--enable-libsoxr?--enable-libsrt?--enable-libtheora?--enable-libtwolame?--enable-libvpx?--enable-libwavpack?--enable-libwebp?--enable-libx264?--enable-libx265?--enable-libxml2?--enable-libzimg?--enable-lzma?--enable-zlib?--enable-gmp?--enable-libvidstab?--enable-libvmaf?--enable-libvorbis?--enable-libvo-amrwbenc?--enable-libmysofa?--enable-libspeex?--enable-libxvid?--enable-libaom?--enable-libgsm?--enable-librav1e?--enable-libsvtav1?--disable-w32threads?--enable-libmfx?--enable-ffnvcodec?--enable-cuda-llvm?--enable-cuvid?--enable-d3d11va?--enable-nvenc?--enable-nvdec?--enable-dxva2?--enable-avisynth?--enable-libopenmpt?--enable-amf ??libavutil??????56.?58.100?/?56.?58.100 ??libavcodec?????58.100.100?/?58.100.100 ??libavformat????58.?51.100?/?58.?51.100 ??libavdevice????58.?11.101?/?58.?11.101 ??libavfilter?????7.?87.100?/??7.?87.100 ??libswscale??????5.??8.100?/??5.??8.100 ??libswresample???3.??8.100?/??3.??8.100 ??libpostproc????55.??8.100?/?55.??8.100 [bmp?@?0000024bbbb5fd00]?bad?magic?number ????Last?message?repeated?7?times [image2?@?0000024bbbb5ddc0]?decoding?for?stream?0?failed [image2?@?0000024bbbb5ddc0]?Could?not?find?codec?parameters?for?stream?0?(Video:?bmp,?none):?unspecified?size Consider?increasing?the?value?for?the?‘analyzeduration‘?(0)?and?‘probesize‘?(5000000)?options Input?#0,?image2,?from?‘test_%d.bmp‘: ??Duration:?00:00:00.32,?start:?0.000000,?bitrate:?N/A ????Stream?#0:0:?Video:?bmp,?none,?25?fps,?25?tbr,?25?tbn,?25?tbc Stream?mapping: ??Stream?#0:0?->?#0:0?(bmp?(native)?->?mpeg4?(native)) Press?[q]?to?stop,?[?]?for?help [bmp?@?0000024bbbb60500]?bad?magic?number Error?while?decoding?stream?#0:0:?Invalid?data?found?when?processing?input [bmp?@?0000024bbbb60500]?bad?magic?number Error?while?decoding?stream?#0:0:?Invalid?data?found?when?processing?input [bmp?@?0000024bbbb60500]?bad?magic?number Error?while?decoding?stream?#0:0:?Invalid?data?found?when?processing?input [bmp?@?0000024bbbb60500]?bad?magic?number Error?while?decoding?stream?#0:0:?Invalid?data?found?when?processing?input [bmp?@?0000024bbbb60500]?bad?magic?number Error?while?decoding?stream?#0:0:?Invalid?data?found?when?processing?input [bmp?@?0000024bbbb60500]?bad?magic?number Error?while?decoding?stream?#0:0:?Invalid?data?found?when?processing?input [bmp?@?0000024bbbb60500]?bad?magic?number Error?while?decoding?stream?#0:0:?Invalid?data?found?when?processing?input [bmp?@?0000024bbbb60500]?bad?magic?number Error?while?decoding?stream?#0:0:?Invalid?data?found?when?processing?input Cannot?determine?format?of?input?stream?0:0?after?EOF Error?marking?filters?as?finished Conversion?failed!
原文:https://blog.51cto.com/fengyuzaitu/2801172