jpg的ffmpeg转换为mp4失败,因为jpg帧发生了变化

时间:2019-01-11 04:42:39

标签: ffmpeg jpeg mp4 frames ip-camera

我正在尝试将一组jpg(每5秒拍摄一次的相机屏幕截图)编译为mp4。 ffmpeg命令工作正常,但生成的mp4缺少某些图像。我注意到,当jpg“帧”在jpg序列中从1变为3时,会创建“孔”(请参见以下file的结果,其中第一个jpg显示frames 1,而{{1 }}(第二个):

frames 3

然后用$ file 20190110060113.jpg 20190110060113.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 1280x720, frames 1 $ file 20190110060119.jpg 20190110060119.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 1280x720, frames 3 播种:

ffmpeg

下面是我用来从jpg编译mp4的命令:

ffmpeg -i 20190110060113.jpg -i 20190110060119.jpg
ffmpeg version 3.2.10-1~deb9u1~bpo8+1 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 4.9.2 (Debian 4.9.2-10)
  configuration: --prefix=/usr --extra-version='1~deb9u1~bpo8+1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --disable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 34.101 / 55. 34.101
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.101 / 57. 56.101
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Input #0, image2, from '20190110060113.jpg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: 13395 kb/s
    Stream #0:0: Video: mjpeg, gray(bt470bg/unknown/unknown), 1280x720 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
Input #1, image2, from '20190110060119.jpg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: 21463 kb/s
    Stream #1:0: Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 1280x720 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
At least one output file must be specified

出于好奇,我调查并发现相机实际上有两种模式(白天和黑夜)。夜间拍摄的图像具有ffmpeg -r 25 -f image2 -s 1280x720 -i /data/camipjpg/%*.jpg -vcodec libx264 -crf 25 -pix_fmt yuv420p /data/camipmgpg/20190110.mp4 ,而“白天”模式下的图像具有frames 1

ffmpeg是否可以处理这种jpg更改以组合这些不同类型的jpg?

以下是输出:

frames 3

提前向您寻求帮助。

1 个答案:

答案 0 :(得分:1)

使用-framerate代替-r。这是您遇到的主要问题。这是image demuxer的正确选项。 -r可以用作输出选项,但是如果与图像多路分配器一起代替-framerate使用,可能会引入奇怪的行为。

最新版本的ffmpeg不会出现此问题,并且不会向您发送frame changed from...邮件。开发处于活跃状态,并且您的ffmpeg很旧,因此无论如何我建议进行更新。 Downloading很简单,但您也可以根据需要compile

您不需要声明输入宽度x高度,但是如果这样做,则应将-video_size而不是-s与图像多路分配器一起使用。不需要-f image2。您的glob语法略有错误。经过这些调整,您的命令可能如下所示:

ffmpeg -framerate 25 -pattern_type glob -i "/data/camipjpg/*.jpg" -c:v libx264 -crf 25 -vf format=yuv420p -movflags +faststart /data/camipmgpg/20190110.mp4