FFMpeg 将 jpeg 图像转换为视频

Kne*_*tic 4 linux debian jpeg ffmpeg

我试图拍摄一组以 1 秒间隔拍摄的图像以形成延时视频。我认为使用 ffmpeg 会很容易,但我遇到了神秘的错误。

所有图像都是 yuv420 jpeg,取自安卓相机。它们作为单独的 jpeg 保存在一个文件夹中,它们的大小和格式都相同。它们被命名为 7 位数字名称的序列,从零开始(例如“0000000.jpg”到“0001000.jpg”)。

这是我的字符串(为清晰起见,已编辑文件夹名称):

avconv -r 1 -f image2 -i %07d.jpg -vcodec libx264 -crf 18 -preset slower video.mp4

看起来很棒,我看到很多人的帖子都说这对他们有用。

但是 ffmpeg 给了我这个(粗体表示错误)

ffmpeg 版本 0.8.5-6:0.8.5-1,版权所有 (c) 2000-2012 Libav 开发者
  建于 2013 年 1 月 13 日 12:05:48,使用 gcc 4.7.2
*** 该程序已弃用 ***
此程序仅用于兼容性目的,将在未来版本中删除。请改用avconv。
[mjpeg @ 0x233aea0] 阅读 8
输入 #0, image2, from '%07d.jpg':
  持续时间:00:00:00.04,开始:0.000000,比特率:N/A
    流 #0.0:视频:mjpeg、yuvj420p、640x480 [PAR 1:1 DAR 4:3]、25 tbr、25 tbn、25 tbc
文件“video.mp4”已经存在。覆盖?[是/否] 是
[缓冲区@ 0x233b340] w:640 h:480 pixfmt:yuvj420p
[libx264 @ 0x2339fa0] 使用 SAR=1/1
[libx264 @ 0x2339fa0] 使用 cpu 能力:MMX2 SSE2Fast FastShuffle SSEMisalign LZCNT
[libx264 @ 0x2339fa0] 配置文件 Main,级别 3.1
[libx264 @ 0x2339fa0] 264 - 核心 123 r2189 35cf912 - H.264/MPEG-4 AVC 编解码器 - Copyleft 2003-2012 - http://www.videolan.org/x264.html - 选项:cabac=1 ref=8 deblock =1:0:0 分析=0x1:0x131 me=umh subme=9 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=2 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip= 1 chroma_qp_offset=-2 线程=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 blueay_compat=0 constrained_intra=0 bframes=3 b_pyramid=0 b_adapt=2 b_bias=0 direct=3 weightb=0 open_gop=1 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=60 rc=crf mbtree=1 crf=18.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.25 aq=1:1.00
输出 #0,mp4,到 'video.mp4':
  元数据:
    编码器:Lavf53.21.1
    流 #0.0:视频:libx264、yuvj420p、640x480 [PAR 1:1 DAR 4:3]、q=-1--1、25 tbn、25 tbc
流映射:
  流#0.0 -> #0.0
按 ctrl-c 停止编码
[mjpeg @ 0x233aea0] 阅读 8
帧= 0 fps= 0 q=0.0 Lsize= 0kB 时间=10000000000.00 比特率= 0.0kbits/s    
视频:0kB 音频:0kB 全局标头:0kB 复用开销 610.000000%

导入行(显示为红色)是那些写着“ [mjpeg @ 0x233aea0] overread 8 ”的行。

这让我觉得它可能正在尝试将图像读取为运动 jpeg 而不是普通的 jpeg 文件,并且以某种方式失败了。我试过使用/不使用“-f image2”,结果相同。而且我也尝试过使用 avconv,结果相同。

我应该注意到图像是有效的,如果我将它们全部转换为 *.png(一个昂贵且耗时的过程),整个过程就会起作用。但我更喜欢只能够使用 jpeg,而无需进行中间转换。毕竟,这就是 ffmpeg 的用途,转码。

有没有人有使用 ffmpeg 将 *.jpg 转换为视频的好方法?

slh*_*hck 6

[mjpeg @ 0x233aea0] overread 8ffmpeg尝试逐块读取 JPEG 图像(或来自 MJPEG 流的帧)时抛出的错误,但仍有剩余位。

在这种情况下,即使您的图像可能在其他查看器中显示良好,但 FFmpeg 无法(或不会)处理。要解决此问题,您需要将图像重新保存为您之前尝试过的 PNG 或 JPEG。您可以使用ImageMagick进行这种批量转换,例如:

for f in *.JPG; do mogrify "$f"; done
Run Code Online (Sandbox Code Playgroud)

这将以相同的名称重新保存 JPEG 文件。请注意,在这个过程中你会失去质量,所以它并不理想,我会使用 PNG 作为中间体,因为它们是无损的。

顺便说一句:使用最新版本的 FFmpeg 总是一个好主意,您可以下载为静态构建(只需下载、提取、使用),或者自己编译。Ubuntu 附带的软件包总是过时的,而且——取决于你的 Ubuntu 版本——甚至不是“真正的”FFmpeg,而是 Libav fork(很好用,但应该知道区别)。

不要忘记,当您使用%07d.jpgfor的语法时,图像需要具有连续名称ffmpeg,而不会丢失数字。另请参阅有关多路复用器的文档image2获取更多选项。