ITPub博客

首页 > IT职业 > IT生活 > FFmpeg 图片合成视频

FFmpeg 图片合成视频

原创 IT生活 作者:uu365 时间:2021-05-24 10:59:13 0 删除 编辑

  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!


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69997029/viewspace-2773600/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2021-03-23

  • 博文量
    14
  • 访问量
    37647