知识准备

        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!